![恢复包含一些坏块的大文件](https://linux22.com/image/173824/%E6%81%A2%E5%A4%8D%E5%8C%85%E5%90%AB%E4%B8%80%E4%BA%9B%E5%9D%8F%E5%9D%97%E7%9A%84%E5%A4%A7%E6%96%87%E4%BB%B6.png)
我有一个带有 LVM 的 SSD,其中一个 LV 专用于 80Gb 的 Win7 VM .vdi 文件。
底层fs
是ext4
.
安装新 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
(也不会复制虚拟机)。
因此,假设坏块位于虚拟机文件系统中一些很少使用的部分,并且它并不关心(目前),但这一天将会到来。
现在我不能怪我的Linux机器不喜欢Win7虚拟机,但我想拯救这个老女孩,哪怕只是为了感情。
有没有办法恢复 .vdi,也许是在读取错误时默认使用零填充块并跳到下一个块?
刚刚发现
https://serverfault.com/questions/489696/recovering-a-file-with-bad-blocks-in-the-middle
当我打字时......尝试一下
答案1
我没有在 U&L 上找到并回答,但是服务器故障提供了一份。
所以我将把他们的解决方案留在这里供其他人使用。如果 U&L 中存在骗局,请告诉我,在这种情况下,我会将其删除。
解决方案很简单
dd if=Win7.vdi of=~/mnt/Win7.vdi bs=4k conv=noerror,sync
检查块大小正确后。
现在一切都好了。