我可以使用读写根文件系统磁盘映像作为 OverlayFS upperdir 吗?

cod*_*ael 5 linux root-filesystem overlayfs union-mount

是否有可能工会安装包含根文件系统到一个现有的磁盘映像upperdiroverlayfs安装架,用于读写访问?

我正在尝试/tmp/使用预先存在的脚本(最初在 Ubuntu 12.04 上编写并移植到 14.04)将一些旧磁盘映像联合挂载到Ubuntu 16.04 机器上的目录中。

旧的自动化脚本用于overlayfsext2/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
Run Code Online (Sandbox Code Playgroud)

它们最后用于 3.x 内核(可能是 3.18 之前的),并且该方法似乎不再起作用。叠加现在需要一个workdir选项——例如:

mount -t overlay -o rw,lowerdir=/tmp/lower,upperdir=/tmp/upper,workdir=/tmp/work overlay /tmp/union
Run Code Online (Sandbox Code Playgroud)

问:是否可以调整自动化脚本以在 4.x 内核上以可写状态挂载和使用现有映像?我可以避免重新编写它们以包含类似rootwork目录的内容吗?在某些情况下,这可能会破坏它们在其他地方的使用。

根据文档,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...
Run Code Online (Sandbox Code Playgroud)

但是,它严格限于可用 RAM,并且将其添加到所有自动化脚本中是一种丑陋的技巧。

小智 0

在图像文件中创建额外的嵌套级别:

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
Run Code Online (Sandbox Code Playgroud)