廢言
用dd,總是覺得毛毛的,總有d完重開就會死掉的感覺,總讓我再次想起我的eeemedia usb。
開始
一個完整可開機的image,想要對其做更改,但又不想裝進storage(因為裝完再dd出來size會變大),有方法如下:
在partition之前會有一部分的地方做data的allocation。比如一開始會包含MBR,然後可能是自定的data,甚至是一個小型的rtos,引導之後的kernel。接下來才是partition的開始。這樣的image是無法直接掛載的,必需找partition開始的地方。當然fdisk的information可以用來算這個offset是多少,既然可以算,就會有tool,這個tool 就叫kpartx。用法很簡單:
kezeodsnx@lucid:~/imagesx$kpartx -av xxx.img
add map loop0p1 (251:0): 0 989856 linear /dev/loop0 10080
會在/dev/mapper或是/dev/devicemapper/ 下產生loop device的node,如loop0p1, loop1p1,可以用losetup查詢:
kezeodsnx@lucid:~/imagesx$ sudo losetup -a
/dev/loop0: [0806]:3045598 (xxx.img)
掛完就可以mount了,不用算半天。
kezeodsnx@lucid:~/imagesx$mount /dev/mapper/loop0p1 /mnt/usb
這樣就可以修改filesystem裡的檔案。
但如果要改partion之前的部份要怎麼辦呢? 在window/ linux下都有一些tool。
假設要改的地方是從第17個sector,也就是0x2000的地方 (通常一個sector是512 bytes,512x16=8192=0x2000)
Windows: Winhex
直接找到0x2000的地方,然後剪下貼上。
Linux: dd
利用dd做一樣的事 dd if=yyy.img of=xxx.img bs=512 seek=16 conv=notrunc
結果如下:
yyy.img
xxx.img的mbr: 從最後的55aa可看出是mbr,到0x1F就是512bytes
xxx.img要替換之前的樣子,先看其0x2000的值
dd執行完後,0x2000的樣子:
?ET?
跟yyy.img是完全一樣的。要注意的是記得檢查結尾的部份,看看有沒有蓋錯。
留言列表