dd 崩潰 - 該怎麼辦

dd 崩潰 - 該怎麼辦

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,則該磁碟上很可能存在壞磁區。

您可以使用seekskip具有相同的值來恢復。

dd <your previous options here ...> seek=68424 skip=68424 conv=notrunc

68424很可能會再次產生相同的 I/O 錯誤,因此您必須增加它。您沒有說明您使用的區塊大小(我懶得做數學),為了跳過較小的錯誤區域,您可能更喜歡較小的區塊大小(然後您必須相應地進行調整seekskip

不要使用conv=noerror它會腐蝕事物。如果您遇到更多錯誤,請使用ddrescue,它是一個比 處理讀取錯誤更好的工具dd

相關內容