背景
我使用btrbk在我的 btrfs 文件系统上维护一系列每小时快照。子卷和快照的存储方式如下(缩短名称以便于理解):
/@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 知道它是所有快照中相同数据的良好引用和魔法?
在早于 5.18 的 Linux 内核(特别是 commit
9f5710b
)上,您只能cp --reflink
在源和目标都位于同一挂载点时使用。为此,将相同的文件系统挂载到多个目录不算在内。升级到 Linux 5.18 或更新版本,或者将 btrfs 文件系统的“根”卷挂载到某处,然后cp --reflink
在该目录下的快照子卷和 @vol 之间进行操作。