从 btrfs 快照恢复单个文件,无需执行完整复制

从 btrfs 快照恢复单个文件,无需执行完整复制

背景

我使用以下命令在 btrfs 文件系统上维护一系列每小时快照BTRBK。子卷和快照的存储方式如下(名称已缩短,以便于理解):

/@vol               (subvolume)
/btrbk/@vol.00      (snapshots of /@vol, one per hour)
/btrbk/@vol.01      ...
/home/user/vol      (mountpoint for /@vol)

现在我删除了一个/home/user/vol不该删除的文件。没问题,我可以轻松地从最新快照中恢复:

# cd /home/user/vol
# cp -a --reflink=always /btrbk/@vol.01/all_ipv4_numbers.txt ./
cp: failed to clone './all_ipv4_numbers.txt' from '/btrbk/@vol.01/all_ipv4_numbers.txt': Invalid cross-device link

似乎我无法“重新链接”该文件。但我不想最终得到该文件的两个副本。理想情况下,我希望它看起来在最近的快照和将来拍摄的下一个快照之间没有发生任何事情。

(是的,我也有实际的备份,但只要可用,从快照恢复会更方便!)

问题

如何恢复单个文件来自 btrfs 快照,同时保留所有好的引用和魔力,使 btrfs 知道它在所有快照中是相同的数据?

答案1

在早于 5.18 的 Linux 内核上(具体来说,commit9f5710bcp --reflink),仅当源和目标位于同一安装点时才能使用。为此,将相同的文件系统安装到多个目录不算。升级到 Linux 5.18 或更高版本,或者在某处安装 btrfs 文件系统的“根”卷,然后cp --reflink在该目录下的快照子卷和 @vol 之间执行操作。

相关内容