有什麼辦法可以加快ddrescue的速度嗎?

有什麼辦法可以加快ddrescue的速度嗎?

大約 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),這樣第一次出現錯誤時的跳躍會更大,並且更容易在第一次時快速避開有問題的區域。

順便說一句,有一個很棒的圖形應用程式可以分析日誌。

http://sourceforge.net/projects/ddrescueview/

答案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

希望這對某人有幫助。

相關內容