zoukankan      html  css  js  c++  java
  • overlay fs挂载及操作测试

    overlayfs是目前使用比较广泛的层次文件系统,实现简单,性能较好,可以充分利用不同或则相同overlay文件系统的page cache,具有

    • 上下合并
    • 同名遮盖
    • 写时拷贝

    等特点。

    一个 overlay 文件系统包含两个文件系统,一个 upper 文件系统和一个 lower 文件系统。lower文件系统的数据不会被修改,所有修改都发生在upper文件系统。除此之外,还有两个空目录:work 和 merged。work目录属于操作过程目录,merged目录属于overlay挂载目录(及挂载后的工作目录),会包含lower和upper两个系统的内容。 

    下面以实例演示挂载及操作:

    首先加载overlay模块:

    $ sudo modprobe overlay
    

    然后在/tmp/overlay下创建四个目录,并在lower和upper下创建几个测试数据。

    $ cd /tmp/
    $ mkdir overlay/
    $ cd overlay/
    $ mkdir lower upper merged work
    $ tree
    .
    ├── lower
    │   ├── ld
    │   │   └── ld.txt
    │   └── ld1.txt
    ├── merged
    ├── upper
    │   ├── ud
    │   │   └── ud.txt
    │   └── ud2.txt
    └── work
    
    6 directories, 4 files
    
    $ cat lower/ld1.txt 
    ld 1 test 
    $ cat upper/ud2.txt 
    ud 2 test 
    

     然后执行mount操作,可以看到merged下包含了lower和upper的所有文件,work目录已经没有权限读取。

    $ sudo mount -t overlay overlay -olowerdir=./lower,upperdir=./upper,workdir=./work ./merged
    $ df -lh
    文件系统        容量  已用  可用 已用% 挂载点
    overlay          88G   65G   19G   78% /tmp/overlay/merged
    $ tree
    .
    ├── lower
    │   ├── ld
    │   │   └── ld.txt
    │   └── ld1.txt
    ├── merged
    │   ├── ld
    │   │   └── ld.txt
    │   ├── ld1.txt
    │   ├── ud
    │   │   └── ud.txt
    │   └── ud2.txt
    ├── upper
    │   ├── ud
    │   │   └── ud.txt
    │   └── ud2.txt
    └── work
        └── work [error opening dir]
    
    9 directories, 8 files
    

    那么 lower 和 upper 目录里有相同的文件夹及相同的文件,合并到 merged 目录里时显示的是哪个呢?规则如下:

    • 文件名及目录不相同,则 lower 及 upper 目录中的文件及目录按原结构都融入到 merged 目录中;
    • 文件名相同,只显示 upper 层的文件,而 lower的隐藏 ;
    • 目录名相同, 对目录进行合并成一个目录。将目录及目录下的所有文件合并到 merged 的 dir目录,目录内如有文件名相同,则同样只显示 upper 的。

    overlay只支持两层,upper文件系统通常是可写的;lower文件系统则是只读,这就表示着,当我们对 overlay 文件系统做任何的变更,都只会修改 upper 文件系统中的文件。那下面看一下overlay文件系统的读,写,删除操作。

    【读】:

    • 读 upper 没有而 lower 有的文件时,需从 lower 读;
    • 读只在 upper 有的文件时,则直接从 upper 读;
    • 读 lower 和 upper 都有的文件时,则直接从 upper 读。

    【写】:

    • 对只在 upper 有的文件时,则直接在 upper 写;
    • 对在lower 和 upper 都有的文件时,则直接在 upper 写;
    • 对只在 lower 有的文件写时,则会做一个copy_up 的操作,先从 lower将文件拷贝一份到upper,同时为文件创建一个硬链接。此时可以看到 upper 目录下生成了两个新文件,写的操作只对从lower 复制到 upper 的文件生效,而 lower 还是原文件。

    【删】:

    • 删除 lower 和 upper 都有的文件时,upper 的会被删除,在 upper 目录下创建一个 ‘without' 文件,而 lower 的不会被删除;
    • 删除 lower 有而 upper 没有的文件时,会为被删除的文件在 upper 目录下创建一个 ‘without' 文件,而 lower 的不会被删除;
    • 删除 lower 和 upper 都有的目录时,upper 的会被删除,在 upper 目录下创建一个类似‘without' 文件的  ‘opaque' 目录,而 lower 的不会被删除。

    可以看到,因为 lower 是只读,所以无论对 lower 上的文件和目录做任何的操作都不会对 lower 做变更。所有的操作都是对在 upper 做 。

    然后就可以进入merged目录对ld1.txt和ud2.txt进行修改,然后可以看到lower下的文件不会发生任何改变,而upper下被改变了。对于upper下原本不存在的ld1.txt被修改后,upper下会多出一个ld1.txt的副本,内容是修改过的。

    $ ls upper/ -l
    总用量 12
    -rw-rw-r-- 1 zwang zwang   29 5月  16 13:08 ld1.txt
    drwxrwxr-x 2 zwang zwang 4096 5月  16 13:04 ud
    -rw-rw-r-- 1 zwang zwang   28 5月  16 13:09 ud2.txt
    

     如果删除merged下的ld1.txt,则upper下的ld1.txt会变成一个c标识文件,表明已经删除:

    $ ls upper/ -l
    总用量 8
    c--------- 1 root  root  0, 0 5月  16 13:23 ld1.txt
    drwxrwxr-x 2 zwang zwang 4096 5月  16 13:04 ud
    -rw-rw-r-- 1 zwang zwang   28 5月  16 13:09 ud2.txt
    $ cat upper/ld1.txt 
    cat: upper/ld1.txt: 权限不够
    $ sudo cat upper/ld1.txt 
    cat: upper/ld1.txt: 没有那个设备或地址
    
  • 相关阅读:
    git的最常用命令总结
    java 多线程 sleep 和wait
    java 多线程 线程的状态和操作系统中进程状态的对应关系
    IDEA的最常见快捷键
    设计模式 单例模式的几种实现方式
    spring boot 项目部署到服务器上出现的问题
    算法与数据结构 (八) HashMap源码
    算法与数据结构 (七) 查找 数组的优化方向: 二分查找和哈希查找,
    算法与数据结构 (六) 排序 三 非比较类的排序 基数排序
    Native Crash定位方法
  • 原文地址:https://www.cnblogs.com/wzc0066/p/6861174.html
Copyright © 2011-2022 走看看