廢言

用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

orice

xxx.img的mbr: 從最後的55aa可看出是mbr,到0x1F就是512bytes

mbr

 

xxx.img要替換之前的樣子,先看其0x2000的值

ori-img

dd執行完後,0x2000的樣子:

new-img ?ET?

跟yyy.img是完全一樣的。要注意的是記得檢查結尾的部份,看看有沒有蓋錯。

 

arrow
arrow
    全站熱搜

    kezeodsnx 發表在 痞客邦 留言(2) 人氣()