我在完整性验证文件系统(btrfs)上有一个部分损坏的文件:
$ pv -c \{30939216-15e2-4563-b77e-2ab8687ec333\}.vdi >/dev/null
pv: {30939216-15e2-4563-b77e-2ab8687ec333}.vdi: read failed: Input/output error
3.41GiB 0:00:00 [5.25GiB/s] [=====================================================================> ] 42%
我有这个文件的完整备份,但访问速度非常慢:
$ pv ~/mnt/borg/able-2022-10-05T12:00:21+04:00/arch/home/intelfx/VirtualBox\ VMs/Windows\ 10/Snapshots/\{30939216-15e2-4563-b77e-2ab8687ec333\}.vdi >/dev/null
1.3MiB 0:00:30 [430KiB/s] [> ] 0% ETA 51:55:23
^C
Btrfs“知道”文件的哪些部分已损坏 - 如果我尝试读取损坏的范围,它会返回 I/O 错误。
从备份副本修复文件的最简单方法是什么,尽可能少地执行网络 I/O?原地恢复文件的奖励积分,也最大限度地减少了被覆盖的数据量。
我想过跳一段 ddrescue 舞蹈,但感觉很脆弱:
ddrescue broken_file temp_file map_file
(保存map_file
,丢弃temp_file
)ddrescue --retrim backup_file broken_file map_file
(重复使用map_file
)
也许我缺少一种更简单的方法,或者专门为此目的制作的工具?
答案1
我会为此使用 ddrescue :
ddrescue damaged_file temp temp.map
ddrescue working_file temp temp.map --retrim
mv temp working_file
这无需任何特殊的文件系统特定工具或 root 用户访问权限即可工作