一、overlay文件系统简介:
OverlayFS 是一种堆叠文件系统,它依赖并建立在其它的文件系统之上(例如 ext4fs 和 ubifs 等),并不直接参与磁盘空间结构的划分,仅仅将原来底层文件系统中不同的目录进行 “合并”,
然后向用户呈现,这也就是联合挂载技术,对比于 AUFS,OverlayFS 速度更快,实现更简单。 而 Linux 内核为 Docker 提供的 OverlayFS 驱动有两种:overlay 和 overlay2。而 overlay2 是相对于 overlay 的
一种改进,在 inode 利用率方面比 overlay 更有效。
overlayfs 通过三个目录:lower 目录、upper 目录、以及 work 目录实现,其中 lower 目录可以是多个,work 目录为工作基础目录,挂载后内容会被清空,且在使用过程中其内容用户不可见,
最后联合挂载完成给用户呈现的统一视图称为为 merged 目录。以下使用 mount 将演示其如何工作的。
基本操作语法:
mount -t overlay overlay -o lowerdir=lower1:lower2,upperdir=upper,workdir=work merged_dir
二、实际应用场景和目的:
如将目标系统上的 rootfs 设计成 overlay 文件系统,将原始的 rootfs_base 部分放在 lower layer, 然后将系统运行时产生的文件系统的变动放在 upper layer。
这样就可以将原始文件和运行时文件进行了隔离。
例如:
例如lxc/docker三个目录层结构,即:lowerdir、uperdir、merged,其中 lowerdir 是只读的 image layer,其实就是 rootfs,对比我们上述演示的目录 A 和 B,我们知道 image layer 可以分很多层,所以对应的 lowerdir 是可以有多个目录。
而 upperdir 则是在 lowerdir 之上的一层,这层是读写层,在启动一个容器时候会进行创建,所有的对容器数据更改都发生在这里层,对比示例中的 C。
最后 merged 目录是容器的挂载点,也就是给用户暴露的统一视角,对比示例中的/tmp/test
三、操作实例如下
mkdir -p /tmp/test A B C worker
echo froma > A/a.txt
echo fromb > B/b.txt
echo fromB > B/a.txt
echo fromc > C/c.txt
挂载:
mount -t overlay overlay -o lowerdir=A:B,upperdir=C,workdir=worker/ /tmp/test/
挂载查询:
mount | grep overlay
overlay on /tmp/test type overlay (rw,relatime,lowerdir=A:B,upperdir=C,workdir=worker/)
挂载后的目录分布:
# find .
./worker
./worker/work
./C
./C/c.txt
./B
./B/a.txt
./B/b.txt
./A
./A/a.txt
./test
./test/a.txt
./test/b.txt
./test/c.txt
说明:对于merged_dir目录,相同文件名的文件会进行 “覆盖”,这里覆盖并不是真正的覆盖,而是当合并时候目录中两个文件名称都相同时,merged 层目录会显示离它最近层的文件。
四、overlay和bind对比:
目录结构不同:Overlay mount是将多个文件系统合并成一个虚拟文件系统,而bind mount则是将一个目录挂载到另一个目录上。
内容来源不同:Overlay mount的文件内容来自于下层文件系统和上层文件系统的合并,而bind mount的文件内容来自于被挂载的目录。
文件可见性不同:Overlay mount会将下层文件系统和上层文件系统的文件合并到同一个目录下,因此可以看到所有文件。而bind mount则会隐藏被挂载的目录的原始内容,只显示挂载后的内容。
权限控制不同:Overlay mount会继承上层文件系统的权限控制,而bind mount则会继承被挂载目录的权限控制。
用途不同:Overlay mount通常用于容器化应用程序和分发系统中,而bind mount则用于共享已经存在的目录或文件。 总的来说,Overlay mount和bind mount都是Linux中非常重要的文件系统挂载方式,
它们各有优点,可以根据具体的需求使用不同的挂载方式。
五、对于inode信息查询:
可使用ls -i查询,或者stat filename查询
如对于bind信息:mount --bind /data/testnode.conf /etc/testnode.conf(或者mount -o bind /data/testnode.conf /etc/testnode.conf)可见mount前后对应的inode信息一致,都为Inode: 129;同样overlay merge下面对应的inode信息也和原来的一致,类似于硬链接(但是类似软链接这种是不占空间的:如ln -sf aa.cfg yyu,yyu显示是0字节大小)
# stat /data/testnode.conf
File: `/data/testnode.conf'
Size: 1188 Blocks: 4 IO Block: 1024 regular file
Device: 1031fh/66335d Inode: 129 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2023-11-02 07:59:29.000000000 +0000
Modify: 2023-11-02 07:59:29.000000000 +0000
Change: 2023-11-02 07:59:29.000000000 +0000
#
#
# stat /etc/testnode.conf
File: `/etc/testnode.conf'
Size: 1188 Blocks: 4 IO Block: 1024 regular file
Device: 1031fh/66335d Inode: 129 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2023-11-02 07:59:29.000000000 +0000
Modify: 2023-11-02 07:59:29.000000000 +0000
Change: 2023-11-02 07:59:29.000000000 +0000