我如何使用OverlayFS?

这个答案和电子邮件消息表明在Ubuntu 11.10中可以使用名为“OverlayFS”的东西,并将在Ubuntu 12.04中强制替换aufs。

我该如何使用它? 它的文件在哪里?

编辑:自编写此答案以来,overlayfs中的一些内容已经发生了变化,即添加了必需参数workdir ,有关此新参数的详细说明,请参阅下面的totti答案 。

我终于找到了它。 我在内核源代码中找到了它的引用,但由于某种原因它没有出现在kernel.org的git树中。 但! 如果您像这样提取Ubuntu内核源代码: apt-get source linux-image-3.0.0-16-generic您可以在linux-3.0.0/Documentation/overlayfs.txt找到它。 它也可以在/usr/share/doc/linux-doc/filesystems/overlayfs.txt.gz中的linux-doc包中找到。

由于实际的帮助文档更像是“它如何工作”而不是“如何使用它”,这里有一个简短的概述(内核文档中有一个例子):

mount -t overlayfs -o [mount options] overlayfs [mountpoint for merged system]

[mount options]可以是:

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

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

示例1,覆盖根文件系统

我一直在研究一个Ubuntu混合启动盘,其中基础Ubuntu系统作为filesystem.squashfs存在,我有一些名为ubuntu.overlay kubuntu.overlay xubuntu.overlay和lubuntu.overlay的文件。 .overlay文件是所述系统的基本安装,其中filesystem.squashfs的内容被修剪(以节省空间)。 然后我使用overlayfs和上面的选项修改了init脚本以覆盖正确的发行版.overlay文件(来自引导参数),它就像一个魅力!

这些是我在init脚本中使用的行(一旦所有变量都被翻译):

 mkdir -p /overlay mount -t squashfs /cdrom/casper/ubuntu.overlay /overlay mount -t overlayfs -o lowerdir=/filesystem.squashfs,upperdir=/overlay overlayfs / 

请注意,上面的filesystem.squashfs是由casper创建的目录 ,而不是文件。

这三个语句创建一个/overlay目录,在/overlay目录下安装一个squashfs文件系统,然后使用OverlayFS基本上合并/overlay over /的内容。

例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 

这使得来自ubuntu-base的文件显示在kubuntu文件夹中。 然后,我可以chroot到kubuntu文件夹,并执行类似apt-get install kubuntu-desktop 。 在此OverlayFS安装中所做的任何更改都将保留在上层目录中,在本例中为kubuntu文件夹。 然后,一旦我卸载OverlayFS挂载,真正存在于ubuntu-base但被“镜像”到kubuntu文件夹中的文件将消失,除非它们已被更改。 这使我不必在ubuntu-base中拥有多个文件副本,同时仍然可以使用它们,就好像它们实际存在于每个位置一样。

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

上下

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

引用上层和下层“目录树”而不是“文件系统”更为正确,因为两个目录树很可能位于同一文件系统中,并且不要求给出文件系统的根目录无论是上部还是下部。

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

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

目录

覆盖主要涉及目录。 如果给定名称出现在上部和下部文件系统中并引用其中任何一个中的非目录,则隐藏下部对象 – 该名称仅指上部对象。

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

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

 mount -t overlay overlay -olowerdir=/lower,upperdir=/upper,workdir=/work /merged 

“workdir”需要是与upperdir相同的文件系统上的空目录。

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

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

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

  • 英语: https : //help.ubuntu.com/community/aufsRootFileSystemOnUsbFlash
  • 德语: http : //wiki.ubuntuusers.de/Nur-Lesen_Root-Dateisystem

希望能帮助到你。

最小的可运行示例

 # 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. Eg 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 

GitHub上游 。

使用mount输出第一个ls

 lower: lost+found lower-file overlay: lost+found lower-file overlay-file upper-file upper/upper: overlay-file upper-file upper/work: work 

没有安装的第二个ls输出:

 lower: lost+found lower-file upper/upper: overlay-file upper-file upper/work: work 

解释:

  • lower:写入叠加后没有变化
  • upper:收到overlay的修改
  • overlay:显示上下两个文件
  • work:包含一些我们不应该关心的随机内容( work/目录)

示例改编自: 示例OverlayFS用法

这是一个具有多个较低层的更复杂的示例: Overlayfs重新加载多个层(从aufs迁移)

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