Filesystems

恢復包含一些壞塊的大文件

  • May 24, 2020

我有一個帶有 LVM 的 SSD,其中一個 LV 專用於 80Gb 的 Win7 VM .vdi 文件。

底層fsext4.

安裝新 SSD 並在遷移中設置新 LV 後,舊 SSD 的複制在複製時失敗

Input Output Err No.5 

失敗cp,,,rsync_dd

快速瀏覽一下

dmesg

[ 5829.294651] sd 2:0:0:0: [sdb] tag#14 FAILED Result: hostbyte=DID_OK driverbyte=DRIVER_SENSE cmd_age=0s
[ 5829.294653] sd 2:0:0:0: [sdb] tag#14 Sense Key : Medium Error [current] 
[ 5829.294654] sd 2:0:0:0: [sdb] tag#14 Add. Sense: Unrecovered read error - auto reallocate failed
[ 5829.294656] sd 2:0:0:0: [sdb] tag#14 CDB: Read(10) 28 00 51 50 f9 47 00 00 08 00
[ 5829.294658] blk_update_request: I/O error, dev sdb, sector 1364261191 op 0x0:(READ) flags 0x0 phys_seg 1 prio class 0 

smartctl使用 LBA 進行自檢失敗

badblocks向我顯示 6 個壞塊,進一步檢查debugfs確認inode所有壞塊屬於 .vdi 文件。

那個 LV 欄上沒有目前仍然可以正常啟動的虛擬機virtualbox(也不會複製虛擬機)。

所以假設壞塊位於VM文件系統的一些很少使用的部分中,它並不關心(還),但那一天會到來。

現在我不能責怪我的 Linux 機器不喜歡 Win7 虛擬機,但如果只是為了感情,我想拯救這個老女孩。

有沒有辦法恢復.vdi,也許是在讀取錯誤時預設為零填充塊並跳到下一個塊?

剛發現

https://serverfault.com/questions/489696/recovering-a-file-with-bad-blocks-in-the-middle

我一打字……試一試

我沒有在 U&L 上找到並回答,但serverfault提供了一個。

所以我會把他們的解決方案留給其他人。讓我知道 U&L 中是否存在欺騙,在這種情況下,我會將其刪除。

解決方案很簡單

dd if=Win7.vdi of=~/mnt/Win7.vdi bs=4k conv=noerror,sync

檢查塊大小是否正確後。

現在一切都好。

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