如何使用 OverlayFS?

æ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]

[挂载选项]可以是:

  • lowerdir=somedir: lowerdir 是您要放置新文件系统的目录,如果有重复,这些将被(实际上,隐藏以支持)upperdir 的版本覆盖
  • upperdir=somedir: upperdir 是你想要覆盖lowerdir 的目录。如果lowerdir 和upperdir 中存在重复的文件名,则upperdir 的版本优先。
  • 标准安装选项。我从代码中看到的唯一一个是 ro/rw,但您可以进行试验。

一开始让我感到困惑的一件事,所以我可能应该澄清一下,挂载overlayfs 实际上并没有挂载文件系统。我试图使用overlayfs挂载挂载squashfs文件系统,但这不是它的工作原理。您必须首先将(在我的情况下为 squashfs)文件系统挂载到任意目录,然后使用 overlayfs 将挂载点(目录)和另一个目录合并到第三级目录(overlayfs 挂载点)(编辑:这个“第三级”目录实际上可以是 upperdir= 目录)。三级目录是您将看到合并的文件系统(或目录树 - 它很灵活)的地方。

示例 1,覆盖根文件系统

我一直在研究 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 从本质上合并/overlayover的内容/

示例2,两个目录的透明合并

在为每个版本重新构建实时 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 中拥有多个文件副本,同时仍然能够使用它们,就好像它们物理存在于每个位置一样。

  • 最后,应该在 3.18 http://lwn.net/Articles/617099/ (9认同)
  • @Rmano:在我的机器上,它只适用于 `overlay`,而不适用于 `overlayfs` (5认同)
  • *“但由于某种原因它没有出现在 kernel.org 的 git 树中”* - 那是因为 overlayfs 不在上游内核中,就像 aufs 不是(并且永远不会)。这样的联合文件系统由 Ubuntu 内核团队集成。 (3认同)
  • OverlayFS 显然正在进入内核 3.10。 (2认同)

tot*_*tti 27

https://www.kernel.org/doc/Documentation/filesystems/overlayfs.txt

上下

覆盖文件系统结合了两个文件系统——一个“上层”文件系统和一个“下层”文件系统。当两个文件系统中都存在名称时,“上层”文件系统中的对象是可见的,而“下层”文件系统中的对象是隐藏的,或者在目录的情况下与“上层”对象合并。

引用上层和下层“目录树”而不是“文件系统”会更正确,因为两个目录树很可能位于同一个文件系统中,并且不需要为文件系统提供根目录上或下。

下层文件系统可以是 Linux 支持的任何文件系统,不需要是可写的。下层文件系统甚至可以是另一个overlayfs。上层文件系统通常是可写的,如果是,它必须支持创建 trust.* 扩展属性,并且必须在 readdir 响应中提供有效的 d_type,因此 NFS 不适合。

两个只读文件系统的只读覆盖可以使用任何文件系统类型。

目录

覆盖主要涉及目录。如果给定的名称出现在上层和下层文件系统中,并且指的是任一中的非目录,则下层对象是隐藏的 - 该名称仅指上层对象。

在上层对象和下层对象都是目录的情况下,形成合并目录。

在挂载时,作为挂载选项“lowerdir”和“upperdir”给出的两个目录合并为一个合并目录:

mount -t overlay overlay -olowerdir=/lower,upperdir=/upper,workdir=/work /merged
Run Code Online (Sandbox Code Playgroud)

“workdir”必须是与 upperdir 位于同一文件系统上的空目录。

然后,每当在这样的合并目录中请求查找时,都会在每个实际目录中执行查找,并将组合结果缓存在属于覆盖文件系统的 dentry 中。如果两个实际查找都找到目录,则两者都被存储并创建一个合并目录,否则只存储一个:如果存在,则为上层,否则为下层。

仅合并目录中的名称列表。其他内容,例如元数据和扩展属性,仅针对上层目录报告。下级目录的这些属性是隐藏的。

  • 感谢您对 workdir 的澄清。这是一个相当新的变化,无论出于何种原因,我都无法找到任何关于“workdir”实际上做了什么的文档。上次我查看时,内核帮助中也没有。给overlayfs IMO 添加了一层混乱,希望可以在没有它的情况下使用较新的版本——这有点弄乱了我的工作流程。 (4认同)
  • 我读了这篇文章,因为有人告诉我它对工作目录是什么进行了澄清。但是一个都没有看到。(只是在你所说的缓存的后备存储中?所以可以在 FS 离线时删除,但有助于性能?或者它是否包含主数据?) (2认同)

Flo*_*d42 7

我已经扩展了这些artikels 以包含一个用于设置只读根fs 的overlayfs 脚本。

希望能帮助到你。


Cir*_*郝海东 5

最小的可运行示例

# 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)

GitHub 上游.

第一个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:包含一些work/我们不应该关心的随机内容(一个目录)

示例改编自:示例 OverlayFS 用法

这是一个具有多个较低层的更复杂的示例:Overlayfs reload with multiple layers (migration away from aufs)

在 Ubuntu 18.04、Linux 内核 4.15.0 上测试。