我如何修剪我的 BTRFS 备份?

我如何修剪我的 BTRFS 备份?

我有一个 BTRFS 备份系统,我会在其中拍摄每日快照(btrfs subvolume snapshot)并根据前几天的备份将其序列化为增量更改文件(btrfs send -f backup.date volume -p backup.date-1)。

不幸的是,这意味着我必须永远保留每个序列化卷,因为我需要链中的每个序列化快照。

我尝试反序列化(btrfs receive)这些增量快照并删除中间卷,但后续卷被分配了新的 ID。增量卷通过 ID 引用其父卷,因此这会破坏链条。

因此,我有backup.Jun01.daily和,backup.Jun01.monthly其中后者被修剪并且具有不同的 ID。这两个文件实际上包含所有相同的数据。

有什么方法可以更改 ID,backup.Jun01.monthly以便backup.Jun02.daily可以引用它,而它确实引用了backup.Jun01.daily

答案1

我采取了与您的方法略有不同且可能不兼容的方法。我总是在备份媒体(也是 btrfs 文件系统)上重现快照,而不是使用 保存btrfs send流。-fbtrfs receive

此外,所有快照彼此之间都无法区分 - 月度、每日、每小时等之间没有区别 - 它们只是根据 YYYY-MM-DDTHHMMSS+hhmm 形式的 isodate 命名。在原始主机上修剪快照和在备份媒体上修剪快照到目前为止还没有给我的增量带来问题,但这还为时过早。

最初只是 github gist,现在变成了更大的东西,所以我把它命名为 snazzer - 请参阅https://github.com/csirac2/snazzer

我编写了一个我希望是通用的修剪脚本,或者更确切地说,一个可以发出应该作为修剪候选的快照路径的脚本。请参阅https://github.com/csirac2/snazzer/blob/master/doc/snazzer-prune-candidates.md- 请参阅此示例的概要:

find /some/.snapshotz -maxdepth 1 -mindepth 1 -type d | \
    snazzer-prune-candidates | xargs btrfs subvolume delete

遗憾的是,这对您不起作用,因为它依赖于具有 iso 日期的快照名称。如果您有机会查看snazzersnazzer-receive任何其他部分,请给我反馈 - 我还没有准备好向全世界发布(我今天才添加了从本地文件系统而不是 ssh 接收快照的功能),但任何反馈都会非常受欢迎。

PS 如果您最初对我为第一个版本选择 POSIX shell 和 perl 感到反感,那是因为我处于零依赖状态 - 我将在未来几个月内添加 python 实现 :D

答案2

一个非常简单的解决方案是

cd /whever/.shapshots
btrfs 子卷删除 *

由于快照存储在 .snapshots 文件夹中,该命令会列出它们(因此有 * 参数),然后删除所有快照。

相关内容