【发布时间】:2017-04-28 10:17:33
【问题描述】:
我正在使用overlayFS 创建一种简单的实验性沙盒。
我想我明白它是如何工作的:
- lower 层应该总是挂载 R/O
- 上层是所有变化发生的地方
- 工作层是出于交易原因
- target 是所有合并的 lower + upper 去的地方
例如,我在/disk2 上安装了一个物理磁盘。然后我想覆盖以保留内容,所以我可以这样做:
mount("overlay", "/disk2", "overlay", MS_MGC_VAL, "lowerdir=/disk2,upperdir=./upper,workdir=./work");
这很好用:当我的新进程尝试修改/disk2 下的内容时,它只会在upper 下修改:这确实按预期工作。例如,我还可以看到 0, 0 文件,表明在 upper 中删除了某些内容,但在 lower 中没有。 p>
不幸的是,如果我执行以下代码,我似乎无法以某种方式覆盖 root /:
mount("overlay", "/", "overlay", MS_MGC_VAL, "lowerdir=/disk2,upperdir=./upper,workdir=./work")
我仍然可以看到整个real /,当我写文件时,它们会被写入它们的real(即lower)位置,不在上层。
我在这里做错了什么?
我在内核 4.4.0-53.
【问题讨论】:
-
覆盖根文件系统需要由init(或systemd或更早版本)执行,以确保所有进程都将使用这个
/,而不是真实设备的/。所有进程都有一个固有的/概念,一旦创建了进程就不能更改它(我愿意对此进行更正)。你应该看看overlayrootblog posting的详细信息。 -
@petesh 不确定它有多大帮助,因为我需要在 C 代码中的 clone 调用之后动态地执行此操作。还是会看看的。
-
我记得去年在都柏林举行的欧洲 linuxcon 上,一家公司的演示文稿使用了类似的东西——我只记得演示文稿发生过——当时的名字让我回避了。你也许可以在网上找到与它相关的东西。
-
如果您可以从 initramfs 运行 'init',请在 initramfs 文件系统的某个位置挂载您的只读“真实”根分区和可写分区。我正在使用类似于
mount -t overlayfs none -o lowerdir=$ro_rootfs,upperdir=$writeable /mnt/overlayfs的命令维护的系统上执行此操作。在那之后,您可能需要将您的 proc、sysfs 和 devfs 绑定到 /mnt/overlay,然后exec chroot /mnt/overlay /init以启动“真正的”初始化。就像@Petesh 所说的那样,这就是你如何更改/的位置,以获取从init分叉的所有内容。
标签: c linux filesystems mount overlays