ænd*_*rük 64 filesystem overlayfs
此答复和电子邮件消息表明 Ubuntu 11.10 中提供了名为“OverlayFS”的内容,并将强制替换 Ubuntu 12.04 中的 aufs。
我如何使用它?它的文档在哪里?
Chu*_*k R 72
编辑:自从写下这个答案后,overlayfs 中的一些事情发生了变化,即添加了一个必需的参数workdir
,请参阅下面的totti 的答案以获取有关此新参数的详细说明。
我终于设法找到了。我在内核源代码中找到了对它的引用,但由于某种原因它没有出现在 kernel.org 的 git 树中。但!如果您像这样拉取 Ubuntu 内核源代码:apt-get source linux-image-3.0.0-16-generic
您可以在linux-3.0.0/Documentation/overlayfs.txt
. 它也可以在 linux-doc 包中找到/usr/share/doc/linux-doc/filesystems/overlayfs.txt.gz
。
由于实际的帮助文档更多的是“它是如何工作的”而不是“如何安装它”,这里有一个简短的纲要(内核文档中有一个示例):
mount -t overlayfs -o [mount options] overlayfs [mountpoint for merged system]
[挂载选项]可以是:
一开始让我感到困惑的一件事,所以我可能应该澄清一下,挂载overlayfs 实际上并没有挂载文件系统。我试图使用overlayfs挂载挂载squashfs文件系统,但这不是它的工作原理。您必须首先将(在我的情况下为 squashfs)文件系统挂载到任意目录,然后使用 overlayfs 将挂载点(目录)和另一个目录合并到第三级目录(overlayfs 挂载点)(编辑:这个“第三级”目录实际上可以是 upperdir= 目录)。三级目录是您将看到合并的文件系统(或目录树 - 它很灵活)的地方。
我一直在研究 Ubuntu 混合启动盘,其中基本 Ubuntu 系统作为 filesystem.squashfs 存在,我有名为 ubuntu.overlay kubuntu.overlay xubuntu.overlay 和 lubuntu.overlay 的文件。.overlay 文件是所述系统的基本安装,其中 filesystem.squashfs 的内容被修剪(以节省空间)。然后我修改了 init 脚本以使用overlayfs 和上述选项覆盖正确的发行版的 .overlay 文件(来自引导参数),它就像一个魅力!
这些是我在 init 脚本中使用的行(一旦所有变量都被翻译):
mkdir -p /overlay
mount -t squashfs /cdrom/casper/ubuntu.overlay /overlay
mount -t overlayfs -o lowerdir=/filesystem.squashfs,upperdir=/overlay overlayfs /
Run Code Online (Sandbox Code Playgroud)
注意上面的filesystem.squashfs是casper创建的目录,不是文件。
这三个语句创建一个/overlay
目录,在该/overlay
目录上挂载一个 squashfs 文件系统,然后使用 OverlayFS 从本质上合并/overlay
over的内容/
。
在为每个版本重新构建实时 USB 的过程中,我使用 OverlayFS 来节省大量时间。我从一个名为 ubuntu-base 的目录开始,其中包含最基本的安装 ubuntu-core 映像的内容。然后我将创建名为 ubuntu、kubuntu、lubuntu 和 xubuntu 的目录。
然后,我使用 OverlayFS 使来自 ubuntu-base 的文件显示在各个目录中。我会使用这样的东西:
mount -t overlayfs -o lowerdir=ubuntu-base,upperdir=kubuntu overlayfs kubuntu
Run Code Online (Sandbox Code Playgroud)
这使得来自 ubuntu-base 的文件显示在 kubuntu 文件夹中。然后,我可以chroot
到 kubuntu 文件夹并执行类似apt-get install kubuntu-desktop
. 在此 OverlayFS 挂载中所做的任何更改都将保留在上层目录中,在本例中为 kubuntu 文件夹。然后,一旦我卸载 OverlayFS,就会挂载真正存在于 ubuntu-base 但“镜像”到 kubuntu 文件夹中的文件,除非它们已被更改。这使我不必在 ubuntu-base 中拥有多个文件副本,同时仍然能够使用它们,就好像它们物理存在于每个位置一样。
tot*_*tti 27
从https://www.kernel.org/doc/Documentation/filesystems/overlayfs.txt:
上下
覆盖文件系统结合了两个文件系统——一个“上层”文件系统和一个“下层”文件系统。当两个文件系统中都存在名称时,“上层”文件系统中的对象是可见的,而“下层”文件系统中的对象是隐藏的,或者在目录的情况下与“上层”对象合并。
引用上层和下层“目录树”而不是“文件系统”会更正确,因为两个目录树很可能位于同一个文件系统中,并且不需要为文件系统提供根目录上或下。
下层文件系统可以是 Linux 支持的任何文件系统,不需要是可写的。下层文件系统甚至可以是另一个overlayfs。上层文件系统通常是可写的,如果是,它必须支持创建 trust.* 扩展属性,并且必须在 readdir 响应中提供有效的 d_type,因此 NFS 不适合。
两个只读文件系统的只读覆盖可以使用任何文件系统类型。
目录
覆盖主要涉及目录。如果给定的名称出现在上层和下层文件系统中,并且指的是任一中的非目录,则下层对象是隐藏的 - 该名称仅指上层对象。
在上层对象和下层对象都是目录的情况下,形成合并目录。
在挂载时,作为挂载选项“lowerdir”和“upperdir”给出的两个目录合并为一个合并目录:
Run Code Online (Sandbox Code Playgroud)mount -t overlay overlay -olowerdir=/lower,upperdir=/upper,workdir=/work /merged
“workdir”必须是与 upperdir 位于同一文件系统上的空目录。
然后,每当在这样的合并目录中请求查找时,都会在每个实际目录中执行查找,并将组合结果缓存在属于覆盖文件系统的 dentry 中。如果两个实际查找都找到目录,则两者都被存储并创建一个合并目录,否则只存储一个:如果存在,则为上层,否则为下层。
仅合并目录中的名称列表。其他内容,例如元数据和扩展属性,仅针对上层目录报告。下级目录的这些属性是隐藏的。
我已经扩展了这些artikels 以包含一个用于设置只读根fs 的overlayfs 脚本。
希望能帮助到你。
最小的可运行示例
# Create the filesystems.
dd if=/dev/zero of=lower.ext4 bs=1024 count=102400
mkfs -t ext4 lower.ext4
cp lower.ext4 upper.ext4
mkdir lower upper overlay
sudo mount lower.ext4 lower
sudo mount upper.ext4 upper
sudo chown "$USER:$USER" lower upper
printf lower-content > lower/lower-file
# Upper and work must be on the same filesystem.
mkdir upper/upper upper/work
printf upper-content > upper/upper/upper-file
# Work must be empty. E.g. this would be bad:
#printf work-content > upper/work/work-file
# Make the lower readonly to show that that is possible:
# writes actually end up on the upper filesystem.
sudo mount -o remount,ro lower.ext4 lower
# Create the overlay mount.
sudo mount \
-t overlay \
-o lowerdir=lower,upperdir=upper/upper,workdir=upper/work \
none \
overlay \
;
# Interact with the mount.
printf 'overlay-content' > overlay/overlay-file
ls lower upper/upper upper/work overlay
# Write to underlying directories while mounted
# gives undefined behaviour.
#printf lower-content-2 > lower/lower-file-2
#printf upper-content-2 > upper/upper-file-2
# Unmount the overlay and observe state.
sudo umount overlay
ls lower upper/upper upper/work
# Cleanup.
sudo umount upper lower
Run Code Online (Sandbox Code Playgroud)
第一个ls
带有挂载的输出:
lower:
lost+found lower-file
overlay:
lost+found lower-file overlay-file upper-file
upper/upper:
overlay-file upper-file
upper/work:
work
Run Code Online (Sandbox Code Playgroud)
ls
没有挂载的第二个输出:
lower:
lost+found lower-file
upper/upper:
overlay-file upper-file
upper/work:
work
Run Code Online (Sandbox Code Playgroud)
解释:
work/
我们不应该关心的随机内容(一个目录)示例改编自:示例 OverlayFS 用法
这是一个具有多个较低层的更复杂的示例:Overlayfs reload with multiple layers (migration away from aufs)
在 Ubuntu 18.04、Linux 内核 4.15.0 上测试。