zoukankan      html  css  js  c++  java
  • AUFS:多点合一,写时复制

    image

    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
    

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

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

    验证写时复制

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

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

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

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

    $ sudo umount aufs/mnt
    

    image

    Docker by UnionFS

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

  • 相关阅读:
    Intern Day5
    PTA1007
    Intern Day5
    Intern Day2
    Intern Day5
    Intern Day2
    Intern Day2
    Intern Day2
    Intern Day1
    柯南剧场版17绝海的侦探
  • 原文地址:https://www.cnblogs.com/Zioyi/p/15582733.html
Copyright © 2011-2022 走看看