Linux

ddrescue 在 cat –generate-mode 之後在部分圖像上生成映射文件

  • September 7, 2021

擁有 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考慮GGBGiB因此您必須正確指定單位。 )

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 不應該發現差異,但實際上,它經常發生,因為如今許多發行版都帶有各種難以禁用的自動功能。

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