如何(正确/有效)移动包含快照的 btrfs 子卷?

如何(正确/有效)移动包含快照的 btrfs 子卷?

我使用 btrfs 作为配置 root 的文件系统,并将我的系统配置为使用 snapper 进行备份。

/@arch-root/@.snapshots/卷包含多个子目录,每个子目录包含多个子卷,所有这些子目录都是我的快照系统root(/@arch-root/,它自己的子卷)。现在我想转移@.snapshots到实际情况下文件系统root /,以平滑整个回滚流程。我怎样才能搬家?

(显然,我正在移动它们里面相同的文件系统/分区。)

特别是,它似乎mv可以移动子卷(包含内部子卷),但在这种情况下我不确定其效果(特别是关于磁盘消耗/CoW/文件块之间的内部链接)。如果文件很小,我会简单地使用这个;但在我的场景中,有很多快照,而且它们很大。

下面是对整个情况的解释,以防进一步的细节有帮助(我相信没有,但以防万一)。


完整案例描述

最初,我对文件系统进行了不理想的布局,如下所示(其中以 开头的所有内容都@表示子卷):

/
  @arch-root/
    @.snapshots/
      1234/
        @snapshot/
    var/
      @log/

其中/表示文件系统的根目录,是我的 archlinux 的系统根目录(在启动期间@arch-root安装),也是我存储由 snapper 创建的关于我的系统根目录的快照的地方/@.snapshots

由于@.snapshots由 snapper 管理,它包含内部子目录,每个子目录包含一个描述符文件和我的系统根目录 ( @arch-root) 的快照。

现在回想起来,我发现这是不理想的。如果我需要回滚到以前的版本,我无法轻易做到这一点——类似的目录var/log将无法正确安装到快照。 docker 管理的其他一些目录也有类似的问题。

因此,看起来最好的方法是将每个重要目录移动到 under /,并配置fstab为在引导期间将它们安装到正确的位置。新的文件系统布局将如下所示:

/
  @arch-root/
  @.snapshots/
    1234/
      @snapshot/
  @var-log/

并且fstab会像这样挂载文件系统(其中实际文件系统中的a == b意思是挂载到):ba

/    == /@arch-root/
  .snapshots/    == /@.snapshots/
  var/
    log/    == /@var-log/

但要做到这一点,我需要找出移动它们的正确方法:因为它们包含内部子卷(包括快照),所以移动不应创建数据的冗余副本。这就引出了这个问题。

相关内容