修改一个大文件,然后能够(几乎)就地回滚更改

修改一个大文件,然后能够(几乎)就地回滚更改

我正在从损坏的 500GB 磁盘驱动器中恢复数据。我正在将数据(ext4 分区)复制到 500GB 映像文件。整个复制过程大约需要 3 个月(是的,几个月)。所以我正在dd耐心地填充映像文件。首先,我将一个块添加到临时文件,然后将该块放入备份文件中,然后……

问题是我想在备份过程结束之前访问部分填充的映像并恢复一些数据。我已将其以只读方式挂载并使用,photorec一切testdisk正常。但我还想尝试fsck修复分区。在查看数据后,我想回滚 fsck 更改并恢复复制。

rsync我知道像rdiffgit导数(bup, ...)这样的工具git-annex可能会有所帮助。但我想知道是否有办法做到这一点到位. 不占用另外 500Gb 的索引原始数据。

我不想要版本控制功能。我不想要备份我的文件。工作流程如下:

  1. 我有original_500GB_file.img-> 500GB 的数据
  2. 我修改了 2GB 的文件。假设现在我有modified_500GB_file.img其他辅助文件 -> 少于 600GB 的数据(500 个原始文件 + 2 个修改文件 + 一些元数据)
  3. 当我对所做的更改感到满意时,回滚并再次回到点 1。

如何实现?使用 BTRFS 快照功能可以实现吗?(不幸的是,我的文件位于 NTFS 分区中)

谢谢。

答案1

是的,最简单的方法实际上是使用 BTRFS 或 ZFS 及其快照功能。我没有使用太多 BTRFS(目前只有 ZFS),但回滚应该没有问题。

(我将编写基于 ZFS 的版本,但它对于 BTRFS 应该工作得相当类似)

在开始恢复过程之前,您需要对包含 500GB 图像的当前文件系统进行“快照”。

然后,您可以将恢复过程中获得的所有数据复制到其他位置(不要在同一文件系统内,否则它们将在回滚期间被破坏!)。只有 500GB 映像上的更改才会占用空间。因此,如果您只更改 50GB,则文件系统内总共需要约 550GB 的空间。

如果您完成了部分恢复,您可以执行“回滚”并将文件系统重置为执行“快照”时的状态。

请注意,快照/回滚机制始终适用于完整的文件系统,而不仅仅是单个文件。

编辑:

我认为某些版本的 NTFS 还具有类似快照功能的功能。Windows 7 应该允许您使用此功能,但据我所知,Windows 8 已将其删除....如果您右键单击某个文件(500GB 图像),则应该会出现一些选项,显示“此文件的先前版本”。

另一个相当复杂的选项:设置虚拟机,将 500GB 文件放在那里。虚拟机软件(如 VMware、Virtualbox、VirtualPC)还允许您拍摄快照(整个操作系统映像,包括您的 500GB)并将它们回滚。但这需要您在虚拟机内安装另一个操作系统等等......

答案2

我找到了一个简单易行的解决方案。Slizzered 最后一段关于虚拟机的内容给了我一个提示。你可以使用qemu软件而不必真正加载虚拟机。我找到了相关信息这里这里

首先,您必须创建映像的写入时复制 (COW) 文件。这将使用您的映像original_500GB_file.img作为基础。大文件将无法编辑,因为它是只读的。COW 文件大小极小,并且只有在进行更改时才会增大。这正是我所需要的:

$ qemu-img 创建 -f qcow2 -b original_500GB_file.img disposable.qcow2

格式化“disposable.qcow2”,fmt=qcow2 size=498000000000 backing_file='original_500GB_file.img'encryption=off cluster_size=65536 lazy_refcounts=off

$ ls -l disposable.qcow2

-rw-r--r-- 1 dertalai 用户 204288 abr 15 20:01 disposable.qcow2

现在您只需将 original_read-only + cow_writable 对虚拟化为单个可用的块设备:

# modprobe nbd

# qemu-nbd -c /dev/nbd0 一次性.qcow2

/dev/nbd0已准备好使用。您可以对其进行 fsck 或挂载,然后执行任何需要的操作。当您完成操作并想要回滚更改时,只需从正在使用它的任何进程中释放块设备,并根据需要删除 COW 文件:

# qemu-nbd -d /dev/nbd0

# rmmod nbd

$ rm disposable.qcow2

相关内容