![我可以使用读写根文件系统磁盘映像作为 OverlayFS upperdir 吗?](https://linux22.com/image/94216/%E6%88%91%E5%8F%AF%E4%BB%A5%E4%BD%BF%E7%94%A8%E8%AF%BB%E5%86%99%E6%A0%B9%E6%96%87%E4%BB%B6%E7%B3%BB%E7%BB%9F%E7%A3%81%E7%9B%98%E6%98%A0%E5%83%8F%E4%BD%9C%E4%B8%BA%20OverlayFS%20upperdir%20%E5%90%97%EF%BC%9F.png)
是否可以将包含根文件系统的现有磁盘映像联合挂载到挂载upperdir
点overlayfs
以进行读写访问?
/tmp/
我正在尝试使用预先存在的脚本(最初在 Ubuntu 12.04 上编写并移植到 14.04)将一些旧磁盘映像联合挂载到Ubuntu 16.04 计算机上的目录。
旧的自动化脚本用于在映像之上overlayfs
创建和联合挂载可写磁盘映像- 如下所示:ext2/3
squashfs
cd /tmp
mkdir lower upper union
losetup /dev/loop1 /tmp/image.sfs
losetup /dev/loop2 /tmp/image.ext2
mount -t squashfs -o ro /dev/loop1 /tmp/lower
mount -t ext2 -o rw /dev/loop2 /tmp/upper
mount -t overlayfs -o rw,lowerdir=/tmp/lower,upperdir=/tmp/upper overlayfs /tmp/union
它们最后一次在 3.x 内核(可能是 3.18 之前)上使用,并且该方法似乎不再起作用。覆盖现在需要一个workdir
选项,例如:
mount -t overlay -o rw,lowerdir=/tmp/lower,upperdir=/tmp/upper,workdir=/tmp/work overlay /tmp/union
问:是否可以调整自动化脚本以在 4.x 内核上以可写状态挂载和使用现有映像?我可以避免重新编写它们以包含类似root
和work
目录之类的内容吗?在某些情况下,这可能会破坏它们在其他地方的使用。
根据文档,workdir
必须是与 相同文件系统上的空目录,以upperdir
允许原子写入。在我看来,不可能将根文件系统映像联合挂载为读写。它们workdir
必须存在于映像中(与其数据目录分开),这在根文件系统映像中是不可能的。
我曾考虑过在虚拟机中一次性加载 Ubuntu 14.04,但这不是一个长期解决方案。
迄今为止最好的尝试:
我提出的唯一避免将相同数据重复写入磁盘的解决方案是将两个图像作为lowerdir
值挂载,并将upperdir
目录workdir
挂载在tmpfs
挂载上。然后,在自动写入完成并且覆盖联合已卸载后,我可以将rsync
更改从该tmpfs
位置复制到已安装的映像,即:ext2/3
mount -t overlay -o rw,lowerdir=/tmp/upper:/tmp/lower,upperdir=/tmp/tmpfs/root,workdir=/tmp/tmpfs/work overlay /tmp/union
...perform automated reads/writes...
umount /tmp/union
...rsync contents from /tmp/tmpfs/root to /tmp/upper...
不过,它受到可用 RAM 的严格限制,并且将其添加到所有自动化脚本中是一种丑陋的黑客行为。
答案1
创建一个附加级别图像文件中的嵌套:
mkdir /tmp/upper/upper
mkdir /tmp/upper/work
mount -t overlay -o rw,lowerdir=/tmp/lower,upperdir=/tmp/upper/upper,workdir=/tmp/upper/work overlay /tmp/union