从备份副本修复部分不可读文件的程序/方法

从备份副本修复部分不可读文件的程序/方法

我在完整性验证文件系统(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 舞蹈,但感觉很脆弱:

  1. ddrescue broken_file temp_file map_file(保存map_file,丢弃temp_file
  2. 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 用户访问权限即可工作

相关内容