将 Linux Overlay (OverlayFS) 挂载中对上层文件系统的更改合并到下层文件系统

将 Linux Overlay (OverlayFS) 挂载中对上层文件系统的更改合并到下层文件系统

我希望能够将覆盖安装的上层文件系统的更改合并到下层文件系统。

我都感兴趣在线的(即合并尽管覆盖层已安装)和离线(卸载覆盖然后合并)解决方案。

我找到了几个离线解决方案,我已将其添加为答案。

有谁知道有任何在线的解决方案?最好有一个“提交”类型的命令,您可以在覆盖仍然安装的情况下运行来合并图层。

在以下问题中已提出类似的问题,但没有答案:

这些帖子中的评论提出了不同的建议合并文件系统缓存,两者都解决了特定的用例,但不能解决覆盖提供的与文件系统无关的通用用例。

我的目标是拥有一个带有快照的安全文件系统沙箱,可以与任何(如果可行)底层文件系统上的任何 Linux 应用程序一起使用,允许您回滚更改或在准备好时手动提交更改。

我怀疑现代主线 Linux 拥有内置的所有必要功能,这要归功于过去几年的所有沙箱/虚拟化创新,如果我知道如何使用它们就好了。

答案1

我已经找到了Overlayfs-工具该项目实现了一组有用的工具(diff、merge 和vacuum)。它需要卸载覆盖层,因此离线-唯一的解决方案。

这是一个很好的概念验证,但在目前的状态下我不会依赖它,因为它只有一个维护者,并且已经好几年没有活动了。

答案2

尝试在线的解决方案,但它还不完全存在。

设置(在eg/tmp目录中,以root身份):

LOWER=$HOME
mkdir u1 w1 o1 O
mount -t overlay overlay -o lowerdir=$LOWER,upperdir=u1,workdir=w1 o1
mount --bind o1 O

然后您可以在O目录中工作,该目录是$LOWER.当你想要做快照时:

mkdir u2 w2 o2
mount -t overlay overlay -o lowerdir=o1,upperdir=u2,workdir=w2 o2

(请注意,像这样的嵌套覆盖不适用于较旧的内核)。

但后来我想要某种方法来原子地将绑定挂载更改为O指向o2而不是o1。除了以下之外我不知道该怎么做:

umount O
mount --bind o2 O

(非原子性;有一个O未安装的窗口)。

理想情况下,正在运行的进程可以继续运行,而不知道底层文件系统O已从 更改o1o2。我不知道这是否可行,或者O像这样更改底层文件系统是否会过多地破坏打开的应用程序。我需要进一步调查。

然后,一旦O重定向到o2,我们可以重新以o1只读方式挂载以作为预防措施,然后使用 rdiffdir 或 overlayfs-tools 等执行离线合并。

最后,我们需要某种方法来自动重新挂载,以便o2可以删除 , 和 (现在全部为空目录)。再说一遍,我不知道这是否可能。lowerdir=$HOME,upperdir=u2,workdir=w2o1u1w1

否则,我们可以通过越来越深地嵌套覆盖层并为每个安装的覆盖层和上层目录保留来实现快照,而无需尝试合并或清理。但可以安装的嵌套覆盖层的数量可能是有限的。在某些时候,如果我们想要持久更改,我们仍然需要向下合并层。

答案3

其他离线我想出的解决方案是使用目录创建一个安装了覆盖层的补丁,然后卸载并应用它。此解决方案需要中间步骤,同时将补丁存储在某个位置(在磁盘上或在 ramdisk/tmpfs 中)。

答案4

==解释==

我会使用 Btrfs 快照来合并上下目录。 Btrfs 子卷的工作方式几乎与目录完全相同,但我们对子卷进行快照(克隆),并且它不需要额外的磁盘空间。然后将Overlayfs的内容rsync到快照中,它只会使用上层目录两倍的磁盘空间。 rsync完成后,原来的下层目录和上层目录就可以被丢弃,并由新的快照和新的(空的)上层目录代替。

==步骤==

  1. 创建一个 Btrfs 子卷作为下层目录(几天或几周后,当您准备好合并时,然后转到步骤 2)
  2. 拍摄下层目录的(可写)快照。
  3. 挂载 Overlayfs 后,使用 rsync 将 Overlayfs 中的所有更改同步到快照。
  4. 卸载 Overlayfs。
  5. 删除下层目录
  6. 将以前的 lowerdir 替换为新快照。
  7. 删除上层目录。
  8. 重新创建一个新的(空)上层目录。
  9. 重新挂载 Overlayfs 文件系统。

==Steps as terminal commands (untested!)==

1# btrfs subvolume create lowerdir
2# btrfs subvolume snapshot lowerdir lowerdir_new
3# rsync --delete -a overlayfs lowerdir_new
4# umount overlayfs
5# btrfs subvolume delete lowerdir
6# mv lowerdir_new lowerdir
7# rm -rf upperdir
8# mkdir upperdir
9# mount -o lowerdir

Btrfs 快照是一个新的子卷,因此此过程可以无限次重复。

相关内容