【问题标题】:How to take a recursive snapshot of a btrfs subvol?如何拍摄 btrfs subvol 的递归快照?
【发布时间】:2014-07-08 07:09:17
【问题描述】:

假设一个名为“child-subvol”的 btrfs 子卷在另一个子卷中,比如“root-subvol”,如果我们拍摄“root-subvol”的快照,那么“child-subvol”也应该被拍摄快照。

由于 btrfs 文件系统中还没有递归快照支持,如何实现呢?

【问题讨论】:

    标签: c linux ubuntu filesystems btrfs


    【解决方案1】:

    第 1 步: 获取所有驻留的 btrfs 子卷。最好按照以下命令实现的排序顺序。

    $ btrfs 子卷列表 --sort=-path

    第 2 步: 按照获得的优先顺序,执行删除/快照操作。

    $ btrfs 子卷删除

    【讨论】:

    • 这是一个错误的答案,因为“快照”过程不是原子的。它不应该被称为快照。正确答案是:(仍然)无法在 Btrfs 上拍摄递归快照。只有 ZFS 具有这种功能(zfs snapshot -r)。与 Btrfs 不同,ZFS 有一个以树结构组织的子卷层次结构,与挂载的目录结构分离(除了可选的默认挂载点)。子卷树表示递归快照原子性覆盖,无论挂载点。 openzfs.github.io/openzfs-docs/man/8/zfs-snapshot.8.html
    【解决方案2】:

    我也一直想知道这一点,但无法在网上找到任何推荐的最佳做法。应该可以编写脚本来创建处理递归的快照。

    【讨论】:

    • 没有内核端支持就无法编写这样的脚本。一系列快照(没有相互原子性)没有帮助。假设一个程序首先在子卷 A 中创建一个文件,然后将指向新文件的符号链接写入子卷 B。大约在同一时间运行的wannabe-snapshotting 脚本可以,例如,先对子卷 A 进行快照,before A 上的新文件已创建。接下来,它可以对子卷 B 进行快照, 创建了从 B 到 A 的符号链接。那里。我们在两个单独的快照之间有一个悬空符号链接。
    • 我会说一系列非原子快照总比没有制作任何递归快照要好,对吧?
    【解决方案3】:

    正如 Peter R 所建议的,您可以编写脚本。但是,如果要发送子卷,则必须将其标记为只读,并且不能递归地快照到只读卷中。

    为了解决这个问题,您可以在处理递归的脚本中使用btrfs-property(通过this answear找到),使其(在拍摄所有快照后)将快照标记为只读,以便您可以发送它们。

    或者,你可以这样做

    cp -a --reflink=always /path/to/root_subvol/ /path/to/child_subvol/
    

    --reflink=auto 以前从未为我工作过,还可以帮助您发现错误)

    它应该很快,并且具有与快照相同的优势,尽管您不保留旧的子卷结构。

    【讨论】:

    • 快照是每个子卷的原子,reflink 是每个文件的原子。任何使用多个数据文件并在 reflink 副本的开始和结束之间修改其数据的程序都可能导致其数据损坏(数据库特别容易受到此影响。)
    猜你喜欢
    • 2015-02-13
    • 1970-01-01
    • 2013-02-14
    • 1970-01-01
    • 1970-01-01
    • 2014-05-23
    • 1970-01-01
    • 2014-12-03
    • 1970-01-01
    相关资源
    最近更新 更多