2

btrfs 子卷很棒,可以嵌套。Docker 支持 btrfs 并大量使用嵌套快照。

我正在尝试将我的 /var/lib/docker 移动到新驱动器。

程序“应该”是。
1- 制作 /var/lib/docker 的 ro 快照

btrfs sub snap create /var/lib/docker /var/snapshots/docker_some_datetime

源和目标都在同一个 fs 上。

2.- 将快照发送到新驱动器

btrfs send /var/snapshots/docker_some_datetime | btrfs receive /mnt/drive2/snapshots/

在 docker 文件夹内,有一个 btrfs 文件夹,里面装满了子卷。我希望快照中的文件夹也是子卷,但它们似乎只是普通文件夹。

;TLDR
所以,问题是,如果我拍摄一个子卷的快照,其中嵌套了子卷,它们不应该是快照中的子卷吗?我在这里遇到 btrfs 限制了吗?

4

2 回答 2

0

让我们暂时将 BTRFS-Subvolumes 视为“普通”分区并看一个示例:

  • HDD 的一个分区安装在 上/mnt/hdd,第二个分区安装在/mnt/hdd/nested.
  • 如果您对第一个分区进行完整备份(例如 as.img.iso),这将包括第二个分区,因为它当前安装在第一个分区的“内部”。

即使第一个分区没有挂载,您仍然可以对其进行备份。

由于 BTRFS-Subvolumes 的处理方式与分区类似,因此递归 btrfs-send(包括当前“挂载”的 Subvolumes)更加复杂。

据我所知,没有内置函数可以仅使用一个命令来执行此操作。

我曾经挖掘过 wiki 上提到的 BTRFS 备份工具,据我记得其中一个工具正是具有该功能:https ://btrfs.wiki.kernel.org/index.php/Incremental_Backup#Available_Backup_Tools


现在对于 BTRFS(据我了解):

  • 如果你挂载了一个 BTRFS 分区(例如 via /etc/fstab),默认情况下它的顶层 Subvolume 会挂载在所需的位置。

  • 并且所有位于已安装 BTRFS-Subvolume 内的子卷(通过与顶级子卷具有子父关系)也自动“安装”在相对子路径中。

  • 尽管并非一个 BTRFS 设备的所有子卷都必须始终可见:如果您使用挂载选项subvolid=<ID-of-some-Subvolume>,则只有子子卷会自动“挂载”在相对子路径中。

(我在引号中多次加上“mounted”,因为子子卷没有真正安装 - 它们不像普通的 Linux 安装那样可见)

于 2020-01-05T20:20:11.097 回答
0

简而言之:不,嵌套子卷不包含在其父级的快照中,而是如您所见,在父级快照中以空目录表示,请参阅BTRFS Wiki

要对嵌套子卷布局进行快照,您必须手动递归地对所有包含的子卷进行快照。

于 2021-04-26T10:21:30.103 回答