1. 程式人生 > >linux dd 命令 硬碟拷貝 系統快速安裝 硬碟系統複製

linux dd 命令 硬碟拷貝 系統快速安裝 硬碟系統複製

最近所做的專案涉及到系統的“燒寫”,在ARM中,一般用flash,容量也不大,直接用erase操作即可。但在x86上,硬碟動輒上G,安裝一個發行版本的Linux,也得3GB~4GB,如果將這些資料“燒寫”,的確不易,反正我是不知道用什麼方法。

ghost方法我想過(但沒試過),因此最終的裝置沒有滑鼠、沒有鍵盤,沒有顯示器,不能說給你個光碟,就可以安裝系統。幸好,去網上搜索一番,得到一些有用的資訊,原來,直接使用dd命令就可以完成。當拷貝完硬碟後,就可以拿這個硬碟放到其它裝置上跑了。也就是完成了“燒寫”了。

實際操作中,最好使用另一個系統啟動,如另一個硬碟的系統,或者用live cd。當然,拷貝當前執行中的系統也是可以的,但不知當前的這個系統還有哪些不確定東西,所以還是不建議。

用fdisk -l檢視當前所有分割槽資訊(記得用root,否則執行了啥也看不到),如:

Device Boot      Start         End      Blocks   Id  System /dev/sdb1            2048     1002047      500000   83  Linux /dev/sdb2         1002048    12002047     5500000   83  Linux /dev/sdb3        12002048    13002047      500000   83  Linux /dev/sdb4        13002048    15002047     1000000   83  Linux

上面是我為了方便寫文件而做的分割槽,可以看到Blocks十分工整,那是故意而為之的。

全盤拷貝的命令:

dd if=/dev/sdb  of=/dev/sdc

分割槽拷貝:

dd bs=512 count=[fdisk命令中最大的end數+1] if=/dev/sdb of=name.img

以上為例:

dd bs=512 count=15002048 if=/dev/sdb of=ghost_linux_latelee.img

由於ghost_linux_latelee.img會很大,可以在拷貝時將其壓縮:

dd bs=512 count=15002048 if=/dev/sdb | gzip -9 > ghost_linux_latelee.img.gz

上面所做的,就是傳說的系統“備份”,或叫“系統克隆”。

對應的,有系統恢復的操作。命令如下:

dd if=ghost_linux_latelee.img of=/dev/sda

如果是壓縮包,則命令為:

gzip -c -d ghost_linux_latelee.img.gz | dd of=/dev/sda

在上面的拷貝過程中,並不知道拷貝了多少,只有最終結束時才顯示出時間、拷貝速度。為了檢視進度,可以在另一個終端輸入(記得用root):

watch -n 5 killall -USR1 dd

(注:killall並不是傳說中把程序kill掉,而是傳送一個指定的訊號到指定的程序)

之後,就能執行dd的終端看到進度了,如:

58299+0 records in 58298+0 records out 29848576 bytes (30 MB) copied, 4.67728 s, 6.4 MB/s 161403+0 records in 161402+0 records out 82637824 bytes (83 MB) copied, 9.69359 s, 8.5 MB/s 238651+0 records in 238650+0 records out 122188800 bytes (122 MB) copied, 14.7105 s, 8.3 MB/s

備註:

用dd的方式,得到的映象檔案十分龐大——取決於所要做的系統的大小。比如,拷貝4GB的分割槽,真的就是拷貝4GB,即使是用gzip壓縮,也壓縮不了多少,檔案依然很大。

另外dd的方式也消除了我之前的擔心,因為現在的Linux發行版的分割槽使用硬碟uuid作為標識,而不是/dev/sda1這種格式,據說uuid更好。但用dd拷貝,竟然連硬碟的uuid也一一拷貝,毫無變化,這的確讓我吃驚。不過,目前看沒什麼時間研究dd了。

PS:使用dd命令,可以讀取硬碟的mbr扇區,示例如下:

dd if=/dev/sdb of=mbr.bin bs=512 count=1