Linux-overlay基础学习
overlay作为openwrt里面比较有特色的文件系统挂载方式,能够轻松实现系统还原到最初状态,而不破坏掉文件系统,终于明白为啥路由器后面都有一个能够实现复位的小按钮,可以说这个功能很强大,很值得研究。
环境准备
mkdir -p lower1/dir lower2/dir upper/dir
mkdir merge worker
touch lower1/foo1 lower2/foo2 upper/foo3
echo "from lower1" > lower1/dir/aa
echo "from lower2" > lower2/dir/aa
echo "from lower1" > lower1/dir/bb
echo "from upper" > upper/dir/bb
[yubo.wang@localhost test]$ tree
.
├── lower1
│ ├── dir
│ │ ├── aa
│ │ └── bb
│ └── foo1
├── lower2
│ ├── dir
│ │ └── aa
│ └── foo2
├── merge
├── upper
│ ├── dir
│ │ └── bb
│ └── foo3
└── worker
8 directories, 7 files
挂载
sudo mount -t overlay overlay -o lowerdir=lower1:lower2,upperdir=upper,workdir=worker merge
overlay on /home/yubo.wang/overlay/test/merge type overlay (rw,relatime,seclabel,lowerdir=lower1:lower2,upperdir=upper,workdir=worker)
overlay 116G 34G 83G 29% /home/yubo.wang/overlay/test/merge
卸载
umount merge/
合并覆盖
merge/
├── dir
│ ├── aa "from lower1" lowerdir=lower1:lower2,高层次lower1会覆盖低层次lower2同名文件
│ └── bb "from upper" upperdir会覆盖lowerdir同名文件
├── foo1
├── foo2
└── foo3
层次:upper > lower1 > lower2
不指定upperdir和workdir目录挂载
mount -t overlay overlay -o lowerdir=lower1:lower2 merge
overlay on /home/tmp/overlay/merge type overlay (ro,relatime,seclabel,lowerdir=lower1:lower2)
overlay 116G 12G 105G 11% /home/tmp/overlay/merge
merge/
├── dir
│ ├── aa "from lower1"
│ └── bb "from lower1"
├── foo1
└── foo2
不指定upperdir和workdir,但同时必须保证lowerdir >= 2层,文件系统为只读挂载(这也是只读挂载overlayfs的唯一方法)
lowerdir只有1层挂载
mount -t overlay overlay -o lowerdir=lower1 merge
mount: 文件系统类型错误、选项错误、overlay 上有坏超级块、
缺少代码页或助手程序,或其他错误
有些情况下在 syslog 中可以找到一些有用信息- 请尝试
dmesg | tail 这样的命令看看。
挂载失败,必须保证lowerdir >= 2层
文件系统要求:lowerdir、upperdir和workdir
upperdir和workdir需为可读写文件系统
lowerdir要求较低,只读或读写都可以
删除文件和目录
1、要删除的文件或目录来自upper层,且lower层中没有同名的文件或目录
foo3是upper独有的,在merge中进行删除,可见在upper目录下也同时被直接删除
rm -rf merge/foo3
2、要删除的文件或目录来自lower层,upper层不存在覆盖文件
foo1是lower1独有的,Overlayfs针对这种场景设计了一套“障眼法”——Whiteout文件。
Whiteout文件在用户删除文件时创建,用于屏蔽底层的同名文件,同时该文件在merge层是不可见的,所以用户就看不到
删除的文件或目录
rm -rf merge/foo1 在merge下看不到foo1文件了
upper/
c---------. 1 root root 0, 0 11月 8 10:57 foo1
└── worker
└── work 删除lower层文件后会创建出work目录,目录为空
3、要删除的文件是upper层覆盖lower层的文件,要删除的目录是上下层合并的目录
该场景就理论上来讲其实是前两个场景的合并,overlayfs即需要删除upper层对应文件系统中的文件或目录,
也需要在对应位置创建同名whiteout文件,让upper层的文件被删除后不至于lower层的文件被暴露出来。
rm -rf merge/dir
c---------. 1 root root 0, 0 11月 8 11:23 dir
总结:
新增和修改的文件都在upper里面体现,删除和修改的文件也是在upper里面体现;
新增的文件可直接删除,删除底层文件是在upper里面创建字符设备Whiteout进行隐藏;
修改文件是利用写时复制(copy-up)特性,拷贝底层文件修改后放在upper里面。
创建文件和目录
1、全新的创建一个文件或目录
在merge下创建,也直接在upper中创建
2、创建一个在lower层已经存在且在upper层有whiteout文件的同名文件
在lower层中之前已经存在同名的文件或目录了,同时upper层也有whiteout文件将其隐藏(显然是通过merge层删除它了),
所以用户在merge层看不到它们,可以新建一个同名的文件。
这种场景下,overlayfs需要删除upper层中的用新建的文件替换原有的whiteout文件,这样在merge层中看到的文件就是来自upper层的新文件了。
3、创建一个在lower层已经存在且在upper层有whiteout文件的同名目录
两种情况,这个目录有无Opaque属性
无Opaque属性:创建目录直接暴露出lower层目录文件,并删除whiteout文件
有Opaque属性:创建一个全新的目录文件,并被设置Opaque属性
setfattr -n "trusted.overlay.opaque" upper/dir
getfattr -n "trusted.overlay.opaque" upper/dir
写时复制(copy-up)特性
用户在写文件时,如果文件来自upper层,那直接写入即可。
但是如果文件来自lower层,由于lower层文件无法修改,因此需要先复制到upper层,
然后再往其中写入内容,这就是overlayfs的写时复制(copy-up)特性。
Rename文件和目录
1、关闭redirect dir特性
拷贝文件到upper,并删除原文件,在upper中创建一个whiteout文件;
系统调用,非原子,遇系统和崩溃后恢复时,可看到前后文件同时存在。
2、打开redirect dir特性
不像mv命令那样将目录里的各个子目录和文件都挨个copyup到upper层中,所以overlayfs设计了一种redirect xattr扩展属性
最后文件都还是在lower层,只是在upper层有个同名文件,文件带有redirect xattr扩展属性
getfattr -n "trusted.overlay.redirect" upper/dir
挂载选项"redirect_dir=on/off"
原子性保证(Workdir)
当用户在删除上下层都存在的文件时,overlayfs需要删除upper层的文件然后创建whiteout文件来屏蔽lower层的文件,
想要创建同名文件必然需要先删除原有的文件,这删除和创建分为两个步骤,如何做到原子性以保证文件系统的一致性?
其他属性
"trusted.overlay.origin"
"trusted.overlay.impure"
挂载选项“index=on/off”,怎么使用的?
参考链接:https://blog.csdn.net/luckyapple1028/article/details/78075358
更多推荐
所有评论(0)