LINUX如何克隆硬盤

Linux有四個你應該考慮的磁盤克隆解決方案:

  1. dd
  2. Partimage
  3. Partclone
  4. Clonezilla

今天講講dd的用法,之所以先說dd因爲簡單易用而且兼容性好,首選。

使用dd

dd是一個簡單,多功能,強大的工具。可以用來把數據按照塊順序從源位置複製到目標位置,並且不管文件類型和操作系統。一種快捷的方法就是從live環境中使用dd,比如從Live CD上。

警告:像任何這種類型的命令一樣,你使用的時候需要非常小心。這個命令可以毀壞數據。記住輸入文件(if=)和輸出文件(of=)的順序,不能顛倒!時刻保證目標磁盤或者分區(of=)的容量等於或大於源位置(if=)的容量。

 

克隆一個分區

從物理磁盤/dev/sda 分區1 到物理磁盤/dev/sdb 分區2。

# dd if=/dev/sda1 of=/dev/sdb1 bs=512 conv=noerror,sync

警告:如果輸出文件of=(上面例子的sdb1)不存在,dd會創建一個這個名字的文件,然後開始填充你的root文件系統!

 

克隆一個完整的硬盤

從物理磁盤/dev/sdX到物理磁盤/dev/sdY

# dd if=/dev/sdX of=/dev/sdY bs=512 conv=noerror,sync

這個命令會克隆整個磁盤,包括MBR(因此也包含bootloader),所有分區,UUID和數據。

  • noerror 指定dd命令繼續操作,忽略所有的讀錯誤。dd默認行爲是會在任何錯誤時候停止
  • sync 如果有讀錯誤,把輸入的塊填0,所以數據偏移在sync設置時保留
  • bs=512 設置塊大小512bytes,對於硬盤來說是“經典”的塊大小。只有在你的硬盤是4Kb塊大小時,你纔可以用4096而不是512。同時,請閱讀下面的警告,因爲這個不僅僅是“塊大小”,它同時會影響到如何處理讀錯誤。

警告:你指定的塊大小會影響到如何處理讀錯誤。請讀以下內容。

 

dd工具有”輸入塊大小“(IBS)和”輸出塊大小“(OBS)。當你設置bs,其實是同時設置了IBS和OBS。通常情況下,如果你的塊大小是1Mb,dd會讀取1024*1024bytes,然後寫同樣數量的bytes。但是如果一個讀錯誤發生,事情就變錯誤了。許多人看起來像是認爲如果設置了noerror,sync,dd會”把讀錯誤填0”,但其實事實不是這樣。dd會按照文檔的描述,在完成讀命令後,把OBS填滿到IBS,這就意味着在塊末尾添0。也就是說,對於一個磁盤來說,整個1Mb的有效數據會變混亂,因爲對於一個512byte讀錯誤,一開始讀到的數據:12ERROR89會變成128900000,而不是12000089。

如果你很樂觀,你的磁盤不會有任何的錯誤,那你可以使用更大的塊大小,這樣會成倍增加拷貝速度。比如,在一個單賽揚2.7GHz的系統上,把bs從512改變到64K會把拷貝速度從35MB/s增加到120MB/s。但是記住源磁盤上的讀錯誤會導致目標磁盤上的塊錯誤。比如,一個512byte的讀錯誤會破壞整個64Kb的輸出塊數據。

技巧:如果你想查看dd的進度,用status=progress選項

補充:

  • 重新獲得ext2/3/4文件系統的唯一UUIDs,在每個分區上使用 tune2fs /dev/sdXY -U random
  • dd導致分區表的變化沒有註冊到kernel中。如果要不重啓讓改變生效,使用工具諸如partprobe(GNU Parted)

 

備份MBR

MBR保存在磁盤的第一個512bytes中,包含以下三部分。

  1. 開始446bytes包含boot loader
  2. 接下來64bytes包含分區表(每項16bytes,4項,每個主分區對應一項)
  3. 最後2bytes包含identifier

保存分區表到mbr.img:

# dd if=/dev/sdX of=/path/to/mbr_file.img bs=512 count=1

恢復(謹慎操作,恢復可能會損壞現有的分區表,以至於無法訪問磁盤上的所有數據):

#dd if=/path/to/mbr_file.img of=/dev/sdX

如果你只是想恢復boot loader,而不是主分區表,只是恢復MBR的前446bytes數據:

#dd if=/path/to/mbr_file.img of=/dev/sdX bs=446 count=1

只恢復分區表,使用:

#dd if=/path/to/mbr_file.img of=/dev/sdX bs=1 skip=446 count=64

同樣,你也可以從一個完整的dd磁盤鏡像中獲得MBR:

#dd if=/path/to/mbr_file.img of=/dev/sdX bs=1 bs=512 count=1

 

創建磁盤鏡像

1. 從live介質啓動

2. 確保沒有分區掛載在源硬盤上

3. 掛載外置硬盤

4. 備份硬盤

 

把源盤中的內容壓縮後放在本地磁盤目標位置

#dd if=/dev/sdX conv=sync,noerror bs=64k | gzip -c > /path/to/backup.img.gz

如果需要(例如外置硬盤是FAT32時),把磁盤鏡像拆分成多個卷(參考split man頁面)

#dd if=/dev/sdX conv=sync,noerror bs=64K | gzip -c| split -a3 -b2G - /path/to/backup.img.gz

如果本地磁盤沒有足夠空間,你可以通過ssh發送鏡像

#dd if=/dev/sdX conv=sync,noerror bs=64K | gzip -c | ssh user@local dd of=backup.img.gz


5. 保存磁盤結構信息,以便解析保存在鏡像中的分區表。其中最重要的部分是柱大小

#fdisk -l /dev/sdX > /path/to/list_fdisk.info

補充:你可能想和使用和備份硬盤緩存一樣容量的塊大小。例如,8M緩存對應bs=8192K。本文中提到的64Kb比默認bs=512好,但使用更大的bs=會更快

 

恢復系統

#gunzip -c /path/to/backup.img.gz | dd of=/dev/sdX

當鏡像拆分過,使用這樣的命令:

#cat /path/to/backup.img.gz* | gunzip -c | dd of=/dev/sdX

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章