如何使用OverlayFS?


53

答案电子邮件消息表明,在Ubuntu 11.10中提供了一个名为“ OverlayFS”的东西,并将在Ubuntu 12.04中强制替换aufs。

如何使用?它的文档在哪里?


1
你和我俩,兄弟。到目前为止,我已经遇到了:mount -t overlayfs -o rw,uppderdir=x,lowerdir=y overlayfs /mount/point。除此之外,我一无所知。我正在实时系统中对其进行修改,但是我还没有设法使其开始工作。我希望我能确切找出“ upperdir”和“ lowerdir”的含义。我什么都没找到。
Chuck R

Answers:


63

编辑:自编写此答案以来,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文件是所述系统的基本安装,其文件系统.squashfs的内容被删除(以节省空间)。然后,我修改了初始化脚本,使用overlayfs和以上选项覆盖了正确发行版的.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实质上合并/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

这使得来自ubuntu-base的文件显示在kubuntu文件夹中。然后,我可以chroot进入kubuntu文件夹并执行类似的操作apt-get install kubuntu-desktop。在此OverlayFS挂载中进行的任何更改都将保留在上级目录中,在本例中为kubuntu文件夹。然后,一旦我卸载OverlayFS挂载,除非已更改,否则实际上存在于ubuntu-base中但实际上“镜像”到kubuntu文件夹中的文件将消失。这使我不必在ubuntu-base中拥有多个文件副本,而仍然能够像在每个位置实际存在文件一样使用它们。


3
“但是由于某种原因,它没有出现在kernel.org上的git树中” -这是因为overlayfs不在上游内核中,就像aufs不在(并且永远不会)一样。这样的联合文件系统由Ubuntu Kernel Team集成。
MestreLion'5

2
OverlayFS显然已进入内核3.10。
David C. Bishop

8
最后,应该进入3.18 lwn.net/Articles/617099
Rmano 2014年

4
@Rmano:在我的机器上,它仅与overlay不兼容一起使用overlayfs
Janus Troelsen

1
谢谢@austinmarton,我也发现了这一点,在更新我的答案之前,totti已将其覆盖在下面,因此我将他的回答归功于我的最爱。
Chuck R

20

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

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

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

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


4
感谢您对workdir的澄清。那是一个相当近期的变化,无论出于什么原因,我都无法找到有关“ workdir”实际功能的任何文档。上次查看时,它也不在内核帮助中。给overlayfs IMO增添了一层混乱,希望没有它就可以使用较新的版本,这会弄乱我的工作流程。
Chuck R

7

我已经扩展了这些术语,以包括用于overlayfs的脚本,该脚本设置了只读根fs。

希望能帮助到你。


1
多亏了其他人所做的工作,Dustin和我为quantal添加了一个名为“ overrootroot”的普通包,它是cloud-initramfs-tools源包的一部分。请参阅使用文档/etc/overlayroot.conf
smoser

2

最小的可运行示例

# 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

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

ls没有挂载的第二个输出:

lower:
lost+found  lower-file

upper/upper:
overlay-file  upper-file

upper/work:
work

解释:

  • 较低:写入覆盖后未更改
  • 上部:已收到对覆盖的修改
  • 覆盖:显示上下两个文件
  • 作品:包含一些work/我们不应该在意的随机内容(目录)

示例改编自:示例OverlayFS用法

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

在Ubuntu 18.04和Linux内核4.15.0上进行了测试。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.