大約 5 天前,我的 500GB 硬碟崩潰了。ddrescue
幾天前我在重要分區上使用過,現在它已經在「修剪失敗的區塊」上快兩天了。
原始命令:
ddrescue -n /dev/rdisk1s2 /Volumes/OSXBackup/rdisk1s2.img /Volumes/OSXBackup/rdisk1s2.log
電流輸出:
Initial status (read from logfile)
rescued: 248992 MB, errsize: 1007 MB, errors: 15867
Current status
rescued: 249021 MB, errsize: 978 MB, current rate: 17408 B/s
ipos: 44405 MB, errors: 15866, average rate: 2784 B/s
opos: 44405 MB, time from last successful read: 0 s
Trimming failed blocks...
原始命令使用了該ddrescue -n
參數,並且我根據需要重新啟動了該過程幾次(並且它似乎每次都從停止的地方繼續)。
有什麼辦法可以加快這個過程嗎?
編輯:六個小時後,這是目前狀態:
rescued: 249079 MB, errsize: 920 MB, current rate: 409 B/s
ipos: 39908 MB, errors: 15851, average rate: 2698 B/s
opos: 39908 MB, time from last successful read: 0 s
Trimming failed blocks...
看起來,雖然「錯誤」的倒數計時極其緩慢,但 ipos/opos 卻在倒數計時它必須處理的數據量,而且它的工作速度似乎為 750MB/小時。按照這個速度,它將在大約 53 小時內完成。哎呀。
編輯#2:兩天過去了,還在跑步。不過,還是有希望的。它已通過“修剪失敗塊”部分,並進入下一階段“分割失敗塊”。如果有的話,從查看這個問題中應該注意的是,當涉及大量數據/錯誤時,這肯定需要很長時間。我唯一的希望是,當一切都完成後,我能夠成功恢復一些重要資料。
rescued: 249311 MB, errsize: 688 MB, current rate: 0 B/s
ipos: 26727 MB, errors: 15905, average rate: 1331 B/s
opos: 26727 MB, time from last successful read: 20 s
Splitting failed blocks...
答案1
我觀察到,將-n
(不分割)選項與-r 1
(重試一次)一起使用並將-c
(群集大小)設為較小的值會有所幫助。
我的印像是,分裂步驟非常緩慢,因為ddrescue
會再次分裂受損區域。這需要花費大量時間,因為ddrescue
嘗試恢復非常小的部分資料。所以,我更喜歡將-n
(no-split) 與-c 64
, -c 32
, -c 16
, aso一起使用
也許-n
(無分割)應該始終用於正向和反向的第一次傳遞。似乎資料分割得越多,克隆就越慢,儘管我對此不確定。我認為未處理的區域越大,ddrescue
再次運行時效果最好,因為需要克隆更多的連續扇區。
由於我使用的是日誌文件,因此當資料讀取速度變慢時,我會毫不猶豫地用Ctrl+取消命令。C
我還使用-R
(反向)模式,在第一次通過後,它通常使我向後閱讀的速度比向前閱讀的速度更快。
我不清楚再次-r N
運行命令時如何處理已重試的扇區 ( ) ddrescue
,特別是在交替正向(預設)和反向 ( -R
) 克隆命令時。我不確定他們嘗試的次數是否儲存在日誌檔案中,並且可能再次完成的工作毫無用處。
也許-i
(輸入位置)標誌也可以幫助加快速度。
答案2
很難看到進度ddrescue
,但其中包含另一個命令,稱為ddrescuelog
。
一個簡單的命令ddrescuelog -t YourLog.txt
將輸出這些不錯的訊息:
current pos: 2016 GB, current status: trimming
domain size: 3000 GB, in 1 area(s)
rescued: 2998 GB, in 12802 area(s) ( 99.91%)
non-tried: 0 B, in 0 area(s) ( 0%)
errsize: 2452 MB, errors: 12801 ( 0.08%)
non-trimmed: 178896 kB, in 3395 area(s) ( 0.00%)
non-split: 2262 MB, in 9803 area(s) ( 0.07%)
bad-sector: 10451 kB, in 19613 area(s) ( 0.00%)
ddrescue
您甚至可以在運行時使用它...
答案3
我發現使用 -K 參數可以加快速度。據我所知,如果 ddrescue 在使用 -n 選項運行時嘗試跳轉固定數量的扇區時發現錯誤。如果它仍然無法讀取,它會跳到兩倍大小。如果損壞區域較大,則可以指定較大的 K 值(例如 100M),這樣第一次出現錯誤時的跳躍會更大,並且更容易在第一次時快速避開有問題的區域。
順便說一句,有一個很棒的圖形應用程式可以分析日誌。
答案4
監視 ddrescue 進度的另一種方法(至少在 Linux 上)是使用 strace。
首先,使用「ps aux | grep ddrescue」找到 ddrescue 進程的 PID
root@mojo:~# ps aux | grep ddrescue
root 12083 0.2 0.0 15764 3248 pts/1 D+ 17:15 0:04 ddrescue --direct -d -r0 /dev/sdb1 test.img test.logfile
root 12637 0.0 0.0 13588 940 pts/4 S+ 17:46 0:00 grep --color=auto ddrescue
然後針對該進程執行“strace”。你會看到類似的東西:
root@mojo:~# strace -p 12083
Process 12083 attached - interrupt to quit
lseek(4, 1702220261888, SEEK_SET) = 1702220261888
write(4, "\3101\316\335\213\217\323\343o\317\22M\346\325\322\331\3101\316\335\213\217\323\343o\317\22M\346\325\322\331"..., 512) = 512
lseek(3, 1702220261376, SEEK_SET) = 1702220261376
read(3, "\3101\316\335\213\217\323\343o\317\22M\346\325\322\331\3101\316\335\213\217\323\343o\317\22M\346\325\322\331"..., 512) = 512
lseek(4, 1702220261376, SEEK_SET) = 1702220261376
write(4, "\3101\316\335\213\217\323\343o\317\22M\346\325\322\331\3101\316\335\213\217\323\343o\317\22M\346\325\322\331"..., 512) = 512
^C
....等等。輸出很快而且很難看,所以我然後通過“grep”將其過濾掉我關心的東西:
root@mojo:/media/u02/salvage# nice strace -p 12083 2>&1|grep lseek
lseek(4, 1702212679168, SEEK_SET) = 1702212679168
lseek(3, 1702212678656, SEEK_SET) = 1702212678656
lseek(4, 1702212678656, SEEK_SET) = 1702212678656
lseek(3, 1702212678144, SEEK_SET) = 1702212678144
lseek(4, 1702212678144, SEEK_SET) = 1702212678144
lseek(3, 1702212677632, SEEK_SET) = 1702212677632
lseek(4, 1702212677632, SEEK_SET) = 1702212677632
lseek(3, 1702212677120, SEEK_SET) = 1702212677120
lseek(4, 1702212677120, SEEK_SET) = 1702212677120
lseek(3, 1702212676608, SEEK_SET) = 1702212676608
^C
在該範例中,「1702212676608」相當於「您嘗試挽救的 2 Tb 磁碟上仍需要處理的資料量」。 (是的。哎呀。)ddrescue 在螢幕輸出中輸出了類似的數字——儘管是「1720 GB」。
strace 為您提供了更高粒度的資料流供您檢查;這是評估 ddrescue 速度和估計完成日期的另一種方法。
持續運行它可能是一個糟糕的計劃,因為它會與 ddrescue 競爭 CPU 時間。我已經開始將其透過管道連接到“head”,這樣我就可以獲得前 10 個值:
root@mojo:~# strace -p 4073 2>&1 | grep lseek | head
希望這對某人有幫助。