我使用 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
意思是挂载到):b
a
/ == /@arch-root/
.snapshots/ == /@.snapshots/
var/
log/ == /@var-log/
但要做到这一点,我需要找出移动它们的正确方法:因为它们包含内部子卷(包括快照),所以移动不应创建数据的冗余副本。这就引出了这个问题。