如何在较低的子挂载位置挂载overlayfs?

如何在较低的子挂载位置挂载overlayfs?

我正在尝试为 chroot 环境设置 Overlayfs。该环境由多个只读的squashfs 文件系统(下)和一个可写目录(上)组成。

棘手的部分是,只有一个 squashfs 文件系统具有 chroot 的根目录,其他文件系统不包含回到 root 的完整祖先链。所以我尝试:

mount -o ro,loop base.squash /media/foo/myimage
mount -o ro,loop home.squash /media/foo/myimage/home/
mount -t overlay overlay -o lowerdir=/media/foo/myimage,upperdir=/var/lib/myimage,workdir=/var/chache/myimage /media/bar

这产生了(令人惊讶的)结果/media/bar其中包括仅有的 base.squash/var/lib/myimagehome.squash被忽略留空/media/bar/home

我在文档中查找了一种添加home.squash为附加较低层的方法,但所有层似乎都假设所有层都将包含回到 root 的祖先目录的完整链/

在不更改 squashfs 图像内容的情况下,我应该如何安装它?

答案1

我找到了解决此问题的方法:使用合并文件系统将多个嵌套挂载的层次结构重新映射到单个挂载点,overlayfs 将在其中工作。例如

mount -o ro,loop file1 /mnt/dir/part1
mount -o ro,loop file2 /mnt/dir/part2
mount.mergerfs /mnt/dir /mnt/view
mount -t overlayfs lowerdir=/mnt/view,... 

答案2

这是一个令人惊讶的发现,我希望找到解决方案。我尝试了一些绑定安装的变体,但没有得到我希望的结果。

但我看到了另一个与嵌套覆盖相关的问题,这显然应该可以工作,但 Linux 内核 4.2 中存在一个回归,导致它无法在该版本中工作。幸运的是我是4.15所以我尝试了这个方法;

mount -o ro,loop base.squash /media/foo/myimage
mount -o ro,loop home.squash /media/foo/myhome
mount -t overlay overlay -o lowerdir=/media/foo/myimage,upperdir=/var/lib/myimage,workdir=/var/chache/myimage /media/bar
mount -t overlay overlay -o lowerdir=/media/foo/myhome,upperdir=/var/lib/myhome,workdir=/var/chache/myhome /media/bar/home

这似乎达到了预期的效果。

我尝试不指定“upperdir”和“workdir”部分,因为它在某处声明它可以工作,但会创建一个只读覆盖。但这没有用。至少对我来说不是。

相关内容