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

GitHub 加速计划 / li / linux-dash
10.39 K
1.2 K
下载
A beautiful web dashboard for Linux
最近提交(Master分支:2 个月前 )
186a802e added ecosystem file for PM2 4 年前
5def40a3 Add host customization support for the NodeJS version 4 年前
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐