如何使用 overlayfs 将 lowerdir 挂载到特定子目录中?

如何使用 overlayfs 将 lowerdir 挂载到特定子目录中?

我想使用 overlayfs 挂载以下目录:

(lowerdir) /chroot in /merged
(lowerdir) /home   in /merged/home
(upperdir) /tmpfs  in /merged

...这样合并后的目录就是包含 /chroot 和 /home 的 COW 系统。

我找不到任何办法来做到这一点。

1)尝试多个较低的目录:

mount -t overlay -o lowerdir=/chroot:/home,upperdir=/tmpfs,workdir=/workdir overlay /merged
ls /merged

==> 失败,/home 内容直接在 /merged 中与 /chroot 内容合并,而没有进入 /merged/home 子目录。

2)尝试绑定挂载:

mount --bind /home /chroot/home
mount -t overlay -o lowerdir=/chroot,upperdir=/tmpfs,workdir=/workdir overlay /merged
ls /merged/home

==> 空的,/chroot/home submount 内容不会显示在 /merged/home 中。

有什么想法吗?谢谢。

答案1

我今晚遇到了这个确切的问题,但是我使用/,作为测试,因为我想从包安装中捕获对文件系统的更改并将其从 OverlayFS“upperdir”中删除/usr/var

我发现 OverlayFS 不是为此设计的,然后我想起了 unionfs-fuse... 我还看到 OverlayFS 可以将自身用作lowerdir,因此我尝试使用 unionfs-fuse,并且成功了。

请记住,这只是一个快速的“实验室” PoC 测试,我相信您会希望根据您的需要对 unionfs-fuse 选项进行一些调整……

mkdir merged union upper work
sudo unionfs-fuse /=RO:/usr=RO:/var=RO:/home=RO union
sudo mount -t overlay overlay -olowerdir=union,upperdir=upper,workdir=work merged
sudo echo test > merged/newtestfile
ls merged/newtestfile # exists
ls upper/newtestfile # exists

总体而言,该解决方案有点扭曲/疯狂,但至少对于我试图通过隔离可以从 ./upper 目录中略过的更改来完成的任务而言,它似乎可以正常工作。

答案2

一个解决方案是为最终应该出现在其他地方的内容制作一个单独的覆盖层/chroot/home,然后将其绑定到覆盖层的顶部/chroot

答案3

相关内容