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: 没有那个设备或地址

overlay fs挂载及操作测试的更多相关文章

  1. Ceph FS 挂载

    Cephfs使用挂载方式有两种 1.使用linux kernel挂载 mount 2.使用ceph-fuse挂载. 1.下图为mount挂载 mount -t ceph 10.110.180.112: ...

  2. rm: cannot remove ‘overlay/’: Device or resource busy

    umount /var/lib/docker/overlay #取消挂载就可以啦 rm -rf overlay/

  3. [docker]存储驱动overlay和overlay2的区别

    overlay和overlay2的区别 参考:http://blog.csdn.net/styshoo/article/details/60715942 docker pull ubuntu 本质区别 ...

  4. 拓展 centos 7

    查看端口的占用情况 Centos6/contos7(ECS) 使用 netstat 查询系统上有多少TCP 多少UDP会话 netstat -tun -t: tcp -u: udp -a: all 表 ...

  5. 容器安全拾遗 - Rootless Container初探

    摘要: Docker和Kubernetes已经成为企业IT架构的基础设施,安全容器运行时越来越被关注.近期Docker 19.03中发布了一个重要的特性 “Rootless Container”,在提 ...

  6. 揭秘!containerd 镜像文件丢失问题,竟是镜像生成惹得祸

    导语 作者李志宇,腾讯云后台开发工程师,日常负责集群节点和运行时相关的工作,熟悉 containerd.docker.runc 等运行时组件.近期在为某位客户提供技术支持过程中,遇到了 contain ...

  7. Android系统启动顺序

    Android是一个基于Linux的开源操作系统.x86(x86是一系列的基于intel 8086 CPU的计算机微处理器指令集架构)是linux内核部署最常见的系统.然而,所有的Android设备都 ...

  8. Android系统启动分析(Init->Zygote->SystemServer->Home activity)

    整个Android系统的启动分为Linux Kernel的启动和Android系统的启动.Linux Kernel启动起来后,然后运行第一个用户程序,在Android中就是init程序. ------ ...

  9. Android(java)学习笔记162:Android启动过程(转载)

    转载路径为: http://blog.jobbole.com/67931/ 1. 关于Android启动过程的问题: 当按下Android设备电源键时究竟发生了什么? Android的启动过程是怎么样 ...

随机推荐

  1. jpg转yuv420抠图后转为jpg

    最近遇到个需求,已有全景图和其中的人脸坐标,将人脸小图从全景图中抠出来,最开始使用libjpeg,奈何使用libjpeg将jpg转为yuv420的资料实在少,libjpeg自身的readme和exam ...

  2. 为Firefox浏览器安装Firebug插件

    一.确保联网 二.打开Firefox 三.菜单:工具 -> 附加组件 显示附加组件管理器界面,点扩展 在搜索框输入firebug,搜,在搜索结果列表中找到Firebug项,安装 安装进度 安装完 ...

  3. python中并发编程基础1

    并发编程基础概念 1.进程. 什么是进程? 正在运行的程序就是进程.程序只是代码. 什么是多道? 多道技术: 1.空间上的复用(内存).将内存分为几个部分,每个部分放入一个程序,这样同一时间在内存中就 ...

  4. maven项目发布到tomcat的错误

    Could not publish to the server. java.lang.IndexOutOfBoundsException "Updating status for Tomca ...

  5. asp.net文件/大文件上传需要配置的项目整理

    HTTP 错误 404.13 - Not Found 请求筛选模块被配置为拒绝超过请求内容长度的请求. 最可能的原因: •Web 服务器上的请求筛选被配置为拒绝该请求,因为内容长度超过配置的值. 可尝 ...

  6. intellij idea 配置gitlab ssh key

    1 安装git,登录官网https://www.git-scm.com/download/ ,选择相应系统版本,下载后安装好. 公司网慢的可以用第三方的软件管家下载. 2 打开git bash,不需要 ...

  7. win10系统goole浏览器安装postMan插件

    1. 首先是下载PostMan工具,可以通过谷歌插件网站查询下载postman插件工具.解压文件 2. 解压压缩包 3. 修改_metadata文件重命名为metadata文件,保存待用.修改后为: ...

  8. DJango 基础 (1)

    django基础 知识点: 基本认知 工具准备 新建项目 目录及文件说明 开发服务器 创建视图函数 新建应用(app) 1.基本认知 Django是用Python开发的一个免费开源的Web框架,可以用 ...

  9. kafka 学习笔记

    一.为什么需要消息系统 1.解耦: 允许你独立的扩展或修改两边的处理过程,只要确保它们遵守同样的接口约束. 2.冗余: 消息队列把数据进行持久化直到它们已经被完全处理,通过这一方式规避了数据丢失风险. ...

  10. 天天向上的力量 III

    描述 一年365天,以第1天的能力值为基数,记为1.0. 当好好学习时,能力值相比前一天提高N‰:当没有学习时,能力值相比前一天下降N‰. 每天努力或放任,一年下来的能力值相差多少呢?其中,N的取值范 ...