ddrescue 在 cat –generate-mode 之後在部分圖像上生成映射文件
擁有 1TB (931.5G) 的硬碟。我做了:
sudo sh -c 'cat /dev/sdf >disk_1t.img'
但它在 908G 處因讀取錯誤而停止。
認為下一步(應該是第一步)是使用 gnu
ddrescue
。問題是我沒有地圖文件。問題:**A)**使用 是否有損壞現有圖像的風險
--generate-mode
?ddrescue -n --generate-mode /dev/sdf disk_1t.img disk_1t.map
猜測
-n
選項最適合首次執行。如果是假的說出來。如果我理解正確,它會從 908G 開始讀取嗎?
我不希望它再次開始讀取整個磁碟。
**B)**如果最後一個字節被損壞,嘗試讓它以 907.5G 讀取是否有任何意義?
cat
無論如何都會寫壞數據?如果可能的話,從 910G 開始閱讀,跳過 2G 可能會更好,因為它們可能會造成麻煩?然後在稍後的執行中執行 908-910。**C)**有沒有辦法在剩餘的 23.1G 被讀取/嘗試/用完後檢查第一個 908G?
如果有的話,這裡是現有圖像的尾部:
$ tail -c 512 disk_1tb.img | xxd 00000000: b481 e803 8733 0000 5801 b454 6e3a 9e51 .....3..X..Tn:.Q 00000010: 4cc8 4851 0000 0000 e803 0100 2000 0000 L.HQ........ ... 00000020: 0000 0000 0000 0000 9314 260b 9414 260b ..........&...&. 00000030: 9514 260b 9614 260b 0000 0000 0000 0000 ..&...&......... 00000040: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000050: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000060: 0000 0000 817a 168b 0000 0000 0000 0000 .....z.......... 00000070: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000080: 1c00 0000 0000 0000 0000 0000 c8e9 3caa ..............<. 00000090: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 000000a0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 000000b0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 000000c0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 000000d0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 000000e0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 000000f0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000100: b481 e803 b650 0000 7300 b454 6e3a 9e51 .....P..s..Tn:.Q 00000110: 879d c950 0000 0000 e803 0100 3000 0000 ...P........0... 00000120: 0000 0000 0000 0000 9714 260b 9915 260b ..........&...&. 00000130: 9a15 260b 9b15 260b 9c15 260b 9d15 260b ..&...&...&...&. 00000140: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000150: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000160: 0000 0000 827a 168b 0000 0000 0000 0000 .....z.......... 00000170: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000180: 1c00 0000 0000 0000 0000 0000 f0cc 5056 ..............PV 00000190: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 000001a0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 000001b0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 000001c0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 000001d0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 000001e0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 000001f0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
在您的情況下,沒有真正需要生成地圖文件。由於您確切地知道偏移量,因此您可以將其作為輸入位置傳遞(如果有疑問,請將輸入位置設置得小一點。將其設置得更大會留下間隙。請注意,
ddrescue
考慮G
為GB
,GiB
因此您必須正確指定單位。 )ddrescue --min-read-rate=1MiB \ --input-position=900GiB \ /dev/sdx sdx.img sdx.map
地圖文件將產生如下內容:
# pos size status 0x00000000 0xE100000000 ?
哪個將 0-900GiB 區域標記為?以後再考慮。只要您繼續使用
--input-position
周圍的參數,ddrescue
就會簡單地忽略該區域並只處理其餘部分。如果您確定前一部分已被完全複製,則可以執行此操作。這是您的情況,除非您做了一些可能忽略錯誤或更改偏移量並因此導致數據損壞(例如使用時
dd conv=noerror,sync
)的奇特事情。如果您改變主意並想重新讀取第一個 900GiB,您可以簡單地刪除該
--input-position
參數。使用 是否存在損壞現有圖像的風險
--generate-mode
?一般來說,
ddrescue
做錯事需要付出努力。ddrescue
僅當您使用錯誤的源設備(複製錯誤的數據造成損壞)或使用錯誤的偏移量--output-position
(將正確的數據複製到錯誤的位置造成損壞)時才會損壞圖像文件。然後還有更奇特--fill-mode
的將數據模式寫入圖像文件,但您必須不遺餘力地實際使用它。如果我理解正確,它會從 908G 開始讀取嗎?
在生成模式下,
ddrescue
不知道圖像文件是如何產生的(通過 ddrescue、通過 dd、通過其他方式),因此它假設之前可能已跳過任何二進制零區域。因此,如果您的磁碟上有全零數據的區域,它可能會嘗試重新讀取這些區域,並且只會跳過具有非零數據的區域。理論上,不重新讀取所有包含數據的部分會節省一些時間,但生成地圖畢竟需要先讀取圖像文件中的所有數據,所以如果源驅動器是有效的,它只會比重新開始更快慢(由於損壞)。
的主要
--generate-mode
目的不是節省時間(生成需要時間),而是避免過度工作已經發生故障的源驅動器,並在不清楚之前複製了哪些數據段時促進恢復。如果最後一個字節被損壞,嘗試讓它以 907.5G 讀取有什麼意義?
在您的情況下根本不是,從技術上講,您可以從中斷的地方繼續,而不是重新讀取以前複製的單個扇區。
dd conv=noerror,sync
除非您忽略錯誤(就像那樣),否則現有圖像中不應存在損壞,但cat
.在剩餘的 23.1G 被讀取/嘗試/耗儘後,有沒有辦法檢查第一個 908G?
您可以使用
cmp
比較兩個文件或塊設備:cmp /dev/sdx sdx.img
這也可以在偏移處完成:
cmp --bytes=64M /dev/sdx sdx.img 900G 900G
但是,僅當驅動器僅以只讀方式訪問時,數據才會匹配。如果您有任何自動掛載的東西,它將修改文件系統元數據。
因此,從理論上講,
cmp
第一代 908G 不應該發現差異,但實際上,它經常發生,因為如今許多發行版都帶有各種難以禁用的自動功能。