Answers:
编辑:自编写此答案以来,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文件是所述系统的基本安装,其文件系统.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实质上合并/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
这使得来自ubuntu-base的文件显示在kubuntu文件夹中。然后,我可以chroot
进入kubuntu文件夹并执行类似的操作apt-get install kubuntu-desktop
。在此OverlayFS挂载中进行的任何更改都将保留在上级目录中,在本例中为kubuntu文件夹。然后,一旦我卸载OverlayFS挂载,除非已更改,否则实际上存在于ubuntu-base中但实际上“镜像”到kubuntu文件夹中的文件将消失。这使我不必在ubuntu-base中拥有多个文件副本,而仍然能够像在每个位置实际存在文件一样使用它们。
overlay
不兼容一起使用overlayfs
从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中。如果两个实际查找都找到目录,则将两者都存储并创建一个合并目录,否则仅存储一个:如果存在则上一个,否则下一个。
仅合并目录中的名称列表。其他内容(例如元数据和扩展属性)仅针对上层目录报告。下层目录的这些属性被隐藏。
我已经扩展了这些术语,以包括用于overlayfs的脚本,该脚本设置了只读根fs。
希望能帮助到你。
最小的可运行示例
# 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
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上进行了测试。
mount -t overlayfs -o rw,uppderdir=x,lowerdir=y overlayfs /mount/point
。除此之外,我一无所知。我正在实时系统中对其进行修改,但是我还没有设法使其开始工作。我希望我能确切找出“ upperdir”和“ lowerdir”的含义。我什么都没找到。