Hard-Disk

盲目地將故障驅動器添加到新驅動器

  • July 6, 2017

我有一個有故障的 320GB 驅動器,它在 samish GB 位置有讀取錯誤,但具體位置不同。我可以接受錯誤的可能性,這在這裡是不可能的。

首先,我很驚訝我需要conv=sync真正conv=noerror有用,但是好吧,我有空閒時間來長新腳。我發現它是因為file -s /dev/sdc*沒有為最後一個分區提供任何合理的輸出(即與源驅動器相同),而是說datasync但是,在添加到命令行後,我沒有得到任何實際改進:file -s除了第一個分區不包含 FS 描述部分中的錯誤,因此輸出仍然沒有任何意義,因此file -s命令可以正確檢測 FS。我確認mount -o ro兩個驅動器的複制不穩定並比較md5sum所有文件的 s (但單獨的目錄結構是不穩定的)。

我正在嘗試以這種方式將其添加到新的更大驅動器中:

dd if=/dev/sda3 conv=noerror,sync bs=1M of=/dev/sdc3 2> /part3_log
grep -oPaz '[[:digit:]]*(?=\+[[:digit:]]+ records out\n)' </part3_log >/part3_log_bads # parsing is ok for this specific case
rm /part3_log_01
for i in $(cat /part3_log_bads); do dd if=/dev/sda3 conv=noerror,sync bs=1M of=/dev/sdc3 skip=$((i-1)) seek=$((i-1)) count=1 2>>/part3_log_01; done # retrying erratic blocks. i-1 because of number of records is written after erratic block was padded and written. noerror does not make any practical difference here. 

我得到每個不穩定塊的輸出/part3_log(如預期的那樣):

dd: error reading ‘/dev/sda3’: Input/output error
71051+3 records in  <<<<<<<<< second number increments from 0 after each erratic block indicating partial read, this is expected
71054+0 records out
74505519104 bytes (75 GB) copied, 2546,96 s, 29,3 MB/s

我得到了以下所有塊的奇怪輸出(預計速度差異)/part3_log_01

1048576 bytes (1,0 MB) copied, 6,5663 s, 160 kB/s
0+1 records in
0+0 records out
0 bytes (0 B) copied, 6,41877 s, 0,0 kB/s
0+1 records in
1+0 records out
1048576 bytes (1,0 MB) copied, 7,42028 s, 141 kB/s
1+0 records in
1+0 records out

引起我注意的是,幾乎每個輸入記錄都被部分讀取,而儘管實際上發生了錯誤,但沒有報告錯誤(我在 中看到它們dmesg)。沒有報告錯誤sdc(正如預期的那樣,它是一個新驅動器)。

那麼,如何盲目複製故障驅動器然後重試故障記錄?我的方法似乎在兩點上失敗了:

  • 它無法複製數據而不會在不穩定的塊之後發生移位(儘管conv=sync存在)
  • 它在重試壞塊時無法報告錯誤。

PS我只想這樣做dd。使用ddrescue有問題的 ATM。

PPS 這是 Debian 8.7.1 和 dd 8.23

嘗試 ddrescue(大多數發行版中的 gddrescue):

GNU ddrescue - 數據恢復工具。將數據從一個文件或塊設備複製到另一個文件,嘗試在讀取錯誤的情況下首先搶救好的部分。

引用自:https://unix.stackexchange.com/questions/375793