AUFS:多点合一,写时复制

AUFS:多点合一,写时复制

AUFS(全称:advanced multi-layered unification filesystem,高级多层统一文件系统),用于为 Linux 文件系统实现 联合挂载。提到联合挂载,就要先解一下 Union File System。

Union File System

Union File System,简称 UnionFS,是一种为 Linux、FreeBSD 和 NetBSD 操作系统设计的文件系统,它能够多个其他文件系统联合到一个地方来挂载。换句话说,就是不过目录合并 mount 到同一个目录中。
它和核心原理有两个:

  • 分支管理:它使用 branch 把不同文件系统的文件和目录”透明地”覆盖,形成一个单一一致的文件系统。这些 branch 或者是 read-only 的,或者是 read-write 的,所以当对这个虚拟后的联合文件系统进行写操作的时候,系统是真正写到了一个新的文件中。
  • 写时复制:copy-on-write,简写为 CoW,也叫隐式共享,是一种提高资源使用效率的资源管理技术。它的思想是:如果一个资源是重复的,在没有对资源做出修改前,并不需要立即复制出一个新的资源实例,这个资源被不同的所有者共享使用。当任何一个所有者要对该资源做出修改时,复制出一个新的资源实例给该所有者进行修改,修改后的资源成为其所有者的私有资源。通过这种资源共享的方式,可以显著地减少复制相同资源带来的消耗,但是这样做也会在进行资源的修改时增加一部分开销。

AUFS

AUFS 又叫 Another UnionFS,后来叫 Alternative UnionFS,后来可能觉得不够霸气,叫成 Advance UnionFS。是个叫 Junjiro Okajima(岡島順治郎)在 2006 年开发的,AUFS 完全重写了早期的 UnionFS 1.x,其主要目的是为了可靠性和性能,并且引入了一些新的功能,比如可写分支的负载均衡。AUFS 在使用上全兼容 UnionFS,而且比之前的 UnionFS 在稳定性和性能上都要好很多,后来的 UnionFS 2.x 开始抄 AUFS 中的功能。

实战 AUFS

在 Ubuntu 中,我们可以通过 mount 命令手动来创建 AUFS,以此来体验一下 AUFS 的巧妙之处。

创建实验目录和文件

  1. 创建实验目录 aufs
$ mkdir aufs
  1. 在 aufs 目录下创建 mnt 目标作为文件系统的挂载点
$ mkdir aufs/mnt
  1. 在 aufs 目录下创建 container-layer 文件夹,用来模拟容器的读写层
$ mkdir aufs/container-layer
同时创建文件 container-layer.txt 并初始化内容
$ echo "I am container layer" > aufs/container-layer/container-layer.txt
  1. 在 aufs 目录下创建三个文件 image-layer1、image-layer2、image-layer3,用来模拟容器的镜像层
$ mkdir aufs/{image-layer1,image-layer2,image-layer3}
$ echo "I am image layer 1" > aufs/image-layer1/image-layer1.txt
$ echo "I am image layer 2" > aufs/image-layer2/image-layer2.txt
$ echo "I am image layer 3" > aufs/image-layer3/image-layer3.tx

准备好的实验目录和文件结构如下:

AUFS:多点合一,写时复制

创建 AUFS 文件系统

  1. 通过 mount 把 container-layer、image-layer1、image-layer2、image-layer3 以 AUFS 的方式挂载到刚才创建的 mnt 目录下
$ cd aufs
$ sudo mount -t aufs -o dirs=./container-layer:./image-layer1:./image-layer2:./image-layer3 none ./mnt

挂载完成后,查看 mnt 目录的文件结构为:

AUFS:多点合一,写时复制
在 mount 命令中我们没有指定要挂载的 4 个文件夹的权限信息,其默认行为是:dirs 指定的左边起第一个目录是 read-write 权限,后续目录都是 read-only 权限。我们可以通过下面的方式查看详情:
AUFS:多点合一,写时复制
其中的 si_f7dd5867fe18e716 目录是系统为 mnt 这个挂载点创建的,从上图中我们可以清楚的看到各个目录的挂载权限。

验证写时复制

接下来我们向 mnt/image-layer3.txt 文件写入数据:

$ echo "I changed mnt/image-layer3.txt" >> mnt/image-layer3.txt

查看 mnt/image-layer3.txt 的内容,发现已经变化了:

AUFS:多点合一,写时复制
那再去看看底层文件 image-layer3/image-layer3.txt,发现他的内容并没有改变:
AUFS:多点合一,写时复制
那么,改变的内容被存储到了什么地方呢?去看看 container-layer 目录:
AUFS:多点合一,写时复制
原来,当尝试向 mnt/image-layer3.txt 中写入文件时,系统首先在 mnt 目录下查找名为 image-layer3.txt 的文件,将其拷贝到 read-write 层的 container-layer 目录中,接着对 container-layer 目录中的 image-layer3.txt 的文件进行写操作。这个过程也就是 AUFS 的实际工作原理。

到这里,我们就完成了 AUFS 的实验,从中也学到了 AUFS 写时复制的技术原理。实验结束完,别忘了回收实验环境:

$ sudo umount aufs/mnt

AUFS:多点合一,写时复制

Docker by UnionFS

虽然当前 docker 默认的存储驱动已经演进到了 overlay2,但是学习 AUFS 依然可以帮助我们深入理解 docker 中的文件系统。当我们以后在使用 Docker 容器时,我们在 build 镜像时,写时复制就在发挥着作用。

Original: https://www.cnblogs.com/Zioyi/p/15582733.html
Author: Zioyi
Title: AUFS:多点合一,写时复制

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/575852/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • MySQL的插入性能优化

    MySQL的插入性能优化 修改系统变量的方法 一、通过编辑ini配置文件进行修改; 二、通过输入sql命令进行修改; 查询和修改系统变量; 如果要修改全局变量, 必须要显示指定&#…

    数据库 2023年6月14日
    0129
  • MySQL函数学习(五)—–流程控制函数

    md函数笔记五 注:笔记旨在记录 五、MySQL 流程控制函数 0. 表 0.1 num表: 1. IF() — 条件判断 1.1. 函数: 1.2. sql示例: 2…

    数据库 2023年5月24日
    0116
  • Spring常见问题

    Spring常见问题 问渠那得清如许?为有源头活水来。 Spring 是个 java 企业级应用的开源开发框架。Spring 主要用来开发 Java 应用,但是有些扩展是针对构建 …

    数据库 2023年6月14日
    0102
  • 简单的2021年终总结

    当大家开开心心跨年的时候,我在补年终总结。 小时候恨不得时间过得快一点,现在不这么想了。 我的 2021年,都是平静、反复的一天天,没有出书、没有开源、没有跳槽、没有升官。没错,这…

    数据库 2023年6月6日
    0102
  • 二分查找及其应用

    概述 二分查找算法是一种效率极高的算法,也是为数不多时间复杂度在 O(logn)量级的算法。算法思想并不难理解,但是某些细节却十分复杂,…

    数据库 2023年6月11日
    097
  • 数据库基础,看完这篇就够了!

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    数据库 2023年6月11日
    0115
  • ubuntu设置时区

    posted @2022-06-21 08:30 一份人间烟火 阅读(2 ) 评论() 编辑 Original: https://www.cnblogs.com/zcxxcvbn/…

    数据库 2023年6月9日
    0125
  • 1_MySQL

    概念: 数据库是按照数据结构来组织, 存储和管理数据的仓库, 是一个长期存储在计算机内的, 有组织的, 有共享的, 统一管理的数据集合 分类: 网状结构数据库: 美国通用汽车公司I…

    数据库 2023年6月11日
    099
  • Elasticsearch搜索引擎的使用

    当用户在搜索框输入关键字后,我们要为用户提供相关的搜索结果。 这种需求依赖数据库的模糊查询like关键字可以实现,但是like关键字的效率极低,而且查询需要在多个字段中进行,使用l…

    数据库 2023年6月14日
    0167
  • 聊天软件的后端架构NIO

    聊天软件等的技术,朋友圈,钉钉,微博分两种技术模式:1.读扩散:也就是拉模式消息会存储到自己的发件箱里面,然后让每个上线的人去拉取未读消息,缺点是每次都要去好多底线去拉取数据,读操…

    数据库 2023年6月16日
    0154
  • 【SQL实战】一条SQL统计全国各地疫情分布情况

    — 疫情表,三个字段:城市/地区 省份 当前确诊人数DROP TABLE IF EXISTS yiqing;CREATE TABLE datacenter.yiqing…

    数据库 2023年5月24日
    0126
  • SpringBoot整合Redis和SpringBoot(SpringCache)整合Redis

    参考博客: https://blog.csdn.net/lingerlan510/article/details/121906813 https://blog.csdn.net/u…

    数据库 2023年6月14日
    0145
  • 生产数据库主键超出限制解决方案

    不说那种建表的时候 设置好主键格式 的 解决方案. 事后诸葛啊. 谁都会 不靠谱方案1改主键表结构. 费时! 主键已经超长了.说明 数据量相当大. 改表结构的时间成本你能等得起吗方…

    数据库 2023年6月14日
    0112
  • Podman部署及应用

    点击查看代码 什么是podman Podman是一个开源项目,可在大多数Linux平台上使用并开源在GitHub上。Podman是一个无守护进程的容器引擎,用于在Linux系统上开…

    数据库 2023年6月14日
    0100
  • mysql中group by,having,order by,limit,distinct的用法和简单的的多表查询

    group:组 by:通过 group by :通过….。分组group by列名:通过指定列来分组 一般情况下在题目中出现 “每个” &#82…

    数据库 2023年6月16日
    0138
  • java crm 进销存 模块设计方案

    主页: 记录总进货额、总销售额、总销售利润、30天内销售金额统计总客户数、30天新增客户数图表统计(折线图和柱状图)展示从当前月份开始前12个月销售情况1. 客户资料:记录客户资料…

    数据库 2023年6月6日
    0111
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球