【问题标题】:How can I overlayfs the root filesystem on linux?如何在 linux 上覆盖根文件系统?
【发布时间】: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


【解决方案1】:

根据我读到的内容,我认为一旦系统启动,就不可能以编程方式执行此操作。

【讨论】:

    猜你喜欢
    • 2019-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-26
    • 1970-01-01
    • 2020-04-18
    • 1970-01-01
    相关资源
    最近更新 更多