将绑定挂载与 Overlayfs 一起使用

将绑定挂载与 Overlayfs 一起使用

我正在尝试使用绑定挂载与 OverlayFS 结合创建虚拟挂载。最优化的情况如下:

图表

根文件夹被绑定挂载到新的子文件夹,并用作下级目录。创建一个新的上层目录来保存覆盖层的差异,一个work_dir用于组件的目录workdir,最后一个mnt用于安装覆盖层的目录。

我遇到的问题是,一旦设置完毕,绑定安装的内容就不会出现在覆盖中。

我研究了挂载的不同属性,包括递归挂载和共享/非共享挂载的使用。或者,我尝试将根目录上的各个文件夹绑定到 lowerdir 下的各个文件夹;仍然没有文件。我是否缺少任何一个安装座的设置,或者这根本不可能?

答案1

可以在overlayfs 的挂载点内创建绑定挂载。我只能使用 C 代码来完成此操作,因为 mount(8) 命令不提供此选项。

<fd> = openat(AT_FDCWD, <merge-dir>, O_RDONLY|O_CLOEXEC|O_PATH)
mount(<source-dir>, "/proc/self/fd/<fd>", "", MS_BIND|MS_REC, NULL)
close(<fd>)

<合并目录>是相对于主机系统要安装的目录,最低/下在你的情况下

<源目录>是要挂载的目录,<根目录>在你的情况下。它也与主机系统相关。

<FD>是openat返回的文件描述符int,需要与/proc/self/fd/字符串连接。

此过程可以在挂载 Overlayfs 后立即完成,也可以在安装后的任何时间完成。

我通过查看“docker run”的系统调用发现了这一点,当使用选项 --mount type=bind 执行时,似乎完全按照您在图表中描述的那样进行。由于覆盖挂载并不隐式包含子挂载(即使使用 MS_REC),打开(2)可用于打开与要挂载的目录相对应的文件描述符。 /proc/self/fd/ 中的文件描述符设备文件可以用作绑定安装的目标,该目标在描述符关闭后将保持打开状态。

相关内容