從具有填充壞扇區和多次通過的舊軟碟中最大程度地恢復數據

從具有填充壞扇區和多次通過的舊軟碟中最大程度地恢復數據

我收集了一些舊的 3.5 吋軟盤,希望從中恢復盡可能多的資料。

問題是由於某些文件的結構造成的,我需要維護所有文件的長度,這意味著應該填充任何壞扇區(tl;dr 原因是某些文件是 Acorn ADFS 文件,其中數據和代碼是代碼將數據引用為從檔案開頭的偏移量,這在Linux 中不是問題,壞磁區的填充才是問題。

這些光碟已有 25 年沒有被讀取過,所以我預計會出現不可預測的讀取、定期出現壞扇區,並可能導致磁碟無法讀取 - 只要資料復原最大化,我並不介意。

為此,我預計需要多次傳遞才能盡可能多地閱讀。

DD

我查看了 dd,該命令預計將首次運行:

dd if=/dev/fd0 of=adfs.img conv=noerror,sync

隨後的電話

dd if=/dev/fd0 of=adfs.img conv=noerror,notrunc

在哪裡:

無錯誤意味著錯誤被忽略

同步表示壞扇區用空字元填充

不截斷意味著(已經存在的)輸出檔案在呼叫 dd 時不會被截斷。

然而,當我讀到手冊頁和這個notrunc 的解釋,儘管 notrunc 被設置, dd 每次都會覆蓋輸出,導致輸出仍然只代表最後一次讀取的內容。任何以前正確讀取但現在由於舊軟碟性能下降而損壞的扇區都將被 null 覆蓋。

所以 dd 看起來不合適。

解救

解救看起來很有前途,因為它可以用於多次傳遞,只要使用日誌檔案來記錄成功寫入的內容,然後在完成下一次傳遞時引用即可。

第一遍僅讀取非錯誤區塊

ddrescue -d -p --no-scrape /dev/fd0 output.img log/output.logfile

為第一遍和後續遍填寫錯誤

ddrescue -d -r3 /dev/fd0 output.img log/output.logfile

在哪裡

-d直接磁碟存取。忽略系統緩存

--無刮擦或者-n跳過抓取階段

-p預先分配在復原之前預先分配磁碟空間,即輸出檔案的大小與輸入檔案/裝置的大小相同

-r3重試壞扇區 3 次(第二遍以後使用)

但問題是 ddrescue 似乎不會在壞扇區發生時對其進行填充。設定 -p 後,似乎會導致所有填充都位於檔案末尾,而不是根據需要維護資料與檔案開頭的偏移量。

情況似乎是這樣,因為寫入 ddrescue 是為了盡力節省磁碟空間,因此壞扇區會被截斷,如果在後續過程中成功讀取壞扇區,則將其添加到其中。設定 -p 只是建立一個與輸入檔案大小相同的輸出檔案以節省空間,而不是填充資料。因此,使用 -p set 或 unset 的輸出內容將是相同的,即直到檔案末端才進行填充。

問題

所以我的問題是三人組

  1. 即使設定了 -p,ddrescue 也不填充恢復的文件,這是否正確?

  2. 有什麼辦法可以讓它墊起來嗎?在我的網路搜尋中,我讀到一條評論(將再次找到它並添加),腳本可以使用 ddrescue 建立的日誌檔案來填充相關位置。知道怎麼做嗎?

  1. 你知道有更好的命令/程式/腳本來完成我想做的事情 - 通過多次讀取損壞的磁碟並填充壞扇區來最大程度地恢復資料嗎?

我使用的是 Ubuntu 18.04,dd 版本是 (coreutils) 8.28,GNU ddrescue 版本是 1.22,兩者都來自 Ubuntu 儲存庫。

一如既往地感謝您的幫助

答案1

GNU地址救援是您嘗試恢復的正確工具。


1)即使設定了 -p,ddrescue 也不填入恢復的檔案是否正確?

這個假設是不正確的。 您可能會感到困惑手冊這麼說:

當 Ddrescue 在輸入中發現壞扇區時,不會將零寫入輸出,並且如果沒有要求,也不會截斷輸出檔案。

這只是意味著沒有用零來取代壞扇區。這些壞磁區應該存在的任何內容都沒有被填入。目的地未寫入的區域將讀回為零(空字節)。

另外,-p/--preallocate選項與「填滿」沒有任何關係。它的意思是「預先分配」。在支援的檔案系統上,此選項可確保目標上有足夠的磁碟空間來儲存來源磁碟。


2)有什麼辦法讓它墊起來嗎?

GNU ddrescue 輸出的檔案在邏輯上與來源磁碟的版面相同。 從來源讀取的區塊位於目標中的相同位置。您甚至可以反轉整個恢復過程 ( -R/ --reverse),並且區塊將向後填充,仍然在正確的位置。


3)你知道有什麼更好的命令/程式/腳本來完成我想做的事情 - 通過多次讀取損壞的磁碟並填充壞扇區來最大程度地恢復資料?

GNU ddrescue 正是您想要的。它可以執行多次傳遞 ( -r/ ),所需的壞磁區「填滿」是 GNU ddrescue 的預設行為。從--retry-passes=n手冊:

如果輸出檔案是 ddrescue 建立的常規文件,則標記為壞磁區的區域將包含零。

為了完全清楚並解決您的擔憂,成功讀取後跟隨錯誤讀取將被「填充」為空,ddrescue 不會嘗試重新讀取成功的讀取——沒有必要,因為資料已經恢復了。 ddrescue 透過繪製檔案來了解已復原和復原失敗的內容。

相關內容