![dd 崩潰 - 該怎麼辦](https://rvso.com/image/89177/dd%20%E5%B4%A9%E6%BD%B0%20-%20%E8%A9%B2%E6%80%8E%E9%BA%BC%E8%BE%A6.png)
我dd
跑了幾個小時後就崩潰了。通常也帶有類似這樣的訊息
Input/output error
68424+1 records in
68424+1 records out
342124883968 bytes (342 GB) copied, 5114.68 s, 66.9 MB/s
我能做點什麼嗎?有什麼方法可以使用輸出嗎?還是從上次中斷的地方重新開始?
是否有任何理由認為這是因為正在備份的分割區正在被使用?
它總是在 70-80% 左右崩潰,通常是在分區應該較少使用的時候。
由於這個過程需要很長時間,因此很難嘗試不同的事情。
我輸出到圖像。我可能可以使用分區,但涉及 LVM:
sudo lvmdiskscan
/dev/centos/swap [ 3.89 GiB]
/dev/sda1 [ 500.00 MiB]
/dev/centos/root [ 50.00 GiB]
/dev/sda2 [ 465.27 GiB] LVM physical volume
/dev/centos/home [ 411.38 GiB]
/dev/sdb1 [ 931.51 GiB]
3 disks
2 partitions
0 LVM physical volume whole disks
1 LVM physical volume
dd conv=sync,noerror if=/dev/centos/home bs=2000000 of=/run/media/ob/X_1T_Media1GHD-PCTU3/c/sd9e22_cel.image
dd: error reading '/dev/centos/home': Input/output error
171062+1 records in
171063+0 records out
342126000000 bytes (342 GB) copied, 4625.3 s, 74.0 MB/s
220856+2 records in
220858+0 records out
441716000000 bytes (442 GB) copied, 6138.1 s, 72.0 MB/s
星期五早上
ddrescue --sector-size=2048 --cluster-size=$((256*512)) --sparse --verbose /dev/centos/home /run/media/ob/X_1T_Media1GHD-PCTU3/c/sd7c_dd.image /run/media/ob/X_1T_Media1GHD-PCTU3/c/sd7c_dd.map
GNU ddrescue 1.18.1 About to copy 441714 MBytes from /dev/centos/home to /run/media/ob/X_1T_Media1GHD-PCTU3/c/sd7c_dd.image Starting positions: infile = 0 B, outfile = 0 B Copy block size: 131072 sectors Initial skip size: 32 sectors Sector size: 2048 Bytes
Press Ctrl-C to interrupt rescued: 441714 MB, errsize: 8192 B, current rate: 0 B/s ipos: 342124 MB, errors: 1, average rate: 60675 kB/s opos: 342124 MB, run time: 2.02 h, successful read: 9 s ago Finished
但
extundelete sd7c_dd.image --restore-directory /home/ob/p -o /tmp/tt extundelete: Bad magic number in super-block when trying to open filesystem sd7c_dd.image
/dev/mapper/centos-home on /home type xfs (rw,relatime,attr2,inode64,noquota)
答案1
您永遠不應該dd
在已安裝的檔案系統上運行,因為這可能會損壞映像,尤其是。如果你想做備份。您可能想改用tar
。
如果您確定該設備是不是如果失敗,您可以使用seek
(用於在輸出檔案中尋找 N 個區塊)和skip=N
(用於跳過輸入的 N 個區塊)標誌。在Linux系統上,可以使用該dmesg
指令來取得目前的核心日誌。
如果您不確定要從中複製的裝置是否可能發生故障,我建議您使用ddrescue
來取得裝置的映像。該工具不會因讀取錯誤而中止,並記錄無法正確讀取的區塊的位置。
答案2
如果您嘗試對正在使用的分割區進行映像複製,那麼您將面臨嚴重的失敗。像這樣複製分區需要不寫入任何內容到其中。完全沒有。
如果您可以靜默分割區,則可以使用ddrescue
,它旨在讀取有故障磁區的磁碟和分割區。提取/dev/sda1
到圖像檔案的典型呼叫/media/sda1.img
如下所示:
ddrescue --sector-size=2048 --cluster-size=$((64*512)) --sparse --verbose /dev/sda1 /media/sda1.img /media/sda1.map
磁區和簇大小設定ddrescue
為讀取 64MB 單位。您可能想嘗試將其增加到 128MB 甚至 256MB,但請注意這不一定會增加吞吐量。
在您的特定情況下,您的來源分割區實際上是 LVM 卷,因此這是一個很大的幫助:您可以拍攝要備份的分割區的快照。在此範例中,我將其稱為home-snap
.
lvcreate --snapshot --name home-snap --size 1G /dev/centos/home
ddrescue --sector-size=2048 --cluster-size=$((64*512)) --sparse --verbose /dev/centos/home-snap /run/media/ob/X_1T_Media1GHD-PCTU3/c/sd9e22_cel.image /run/media/ob/X_1T_Media1GHD-PCTU3/c/sd9e22_cel.map
lvremove -y /dev/centos/home-snap
答案3
如果裝置大於其複製的 342GB,則該磁碟上很可能存在壞磁區。
您可以使用seek
和skip
具有相同的值來恢復。
dd <your previous options here ...> seek=68424 skip=68424 conv=notrunc
68424
很可能會再次產生相同的 I/O 錯誤,因此您必須增加它。您沒有說明您使用的區塊大小(我懶得做數學),為了跳過較小的錯誤區域,您可能更喜歡較小的區塊大小(然後您必須相應地進行調整seek
)skip
。
不要使用conv=noerror
,它會腐蝕事物。如果您遇到更多錯誤,請使用ddrescue
,它是一個比 處理讀取錯誤更好的工具dd
。