zoukankan      html  css  js  c++  java
  • Linux AUFS 文件系统

    主要回答的问题

    1. aufs原始的用途
    2. aufs的普通演示
    3. aufs在docker中的使用的演示
    4. aufs,overlays的架构
    5. 明白docker镜像的本质只是文件.
      docker容器就是在镜像层上又增加了可读写的容器层,然后联合挂载到宿主机的一个挂载点上。使得运行时对容器的所有修改都只针对这个容器层,不影响镜像文件
    6. aufs缺点,overlays优点
    7. aufs没有加入linux内核, ubuntu默认支持,centos默认不支持。

    设置CentOS支持aufs

    更新yum下载repo源为阿里云镜像源三部曲

    [/sys/fs/aufs/目录]

    • /sys/fs目录 按照设计是用于描述系统中所有文件系统,包括文件系统本身和按文件系统分类存放的已挂载点,但目前只有 fuse,gfs2 等少数文件系统支持 sysfs 接口,一些传统的虚拟文件系统(VFS)层次控制参数仍然在 sysctl (/proc/sys/fs) 接口中中;

    • 使用 /sys 文件系统访问 Linux 内核
      sysfs 虚拟文件系统提供了一种比 proc 更为理想的访问内核数据的途径

    https://www.ibm.com/developerworks/cn/linux/l-cn-sysfs/index.html

    root@192:/tmp/aufs# ls /sys/fs/ 
    aufs  bpf  cgroup  ecryptfs  ext4  fuse  pstore
    root@192:/tmp/aufs# ls /sys/fs/ext4/
    features  sda1
    root@192:/tmp/aufs# ls /sys/fs/aufs/
    config  si_e8bf3ef3161c9271
    

    aufs的架构

    • 只读层+读写层 mount> 宿主机的union挂载点, 作为容器的根目录。
      只读层就是镜像,读写层是执行docker run时新增的容器层, 对容器的修改就是对union挂载点的修改,只影响读写层。
      直接修改宿主机的挂载点,也就是修改容器的根目录,反之亦然。

    aufs的关键技术

    看起来这个虚拟后的联合文件系统是可以对任何文件进行操作的,但是其实它并没有改变原来的文件。这是因为 Union File System 用到了一个重要的资源管理技术:写时复制。

    但是 aufs 出现的时间要比 docker 长很多,它常见的用法包括

    参考附录1

    1. Linux 光盘演示和教程,录制了 Linux 的光盘可以用来让用户体验,但是光盘的内容是只读的,可以通过 aufs 把光盘和 U 盘或者磁盘 mount 到一起,用户对文件的修改保存到后面的存储上
    2. 如果系统上因为各种原因,不同用户的 home 目录保存在不同的路径和磁盘上,可以通过 aufs 把它们 mount 到一起,统一进行操作

    AUFS演示

    centos默认是没有启动aufs的,然后安装过程中出现了不少问题,所以就用ubuntu来演示了。

    第一个例子

    参考附录1

    base 作为底层的目录
    top 作为上层的目录
    mnt: aufs 使用的挂载点,会把上面两个目录挂载到这里

    第2个例子

    参考附录2(包含图示讲解)

    // 挂载后未修改时,container-layer目录有1个文件
    root@192:/tmp/aufs# tree
    .
    ├── container-layer
    │   └── container-layer.txt
    ├── image-layer1
    │   ├── image-layer1.txt
    │   └── subdir1
    │       └── subdir1.txt
    ├── image-layer2
    │   ├── image-layer2.txt
    │   └── subdir2
    │       └── subdir2.txt
    ├── image-layer3
    │   ├── image-layer3.txt
    │   └── subdir3
    │       └── subdir3.txt
    ├── mnt
    │   ├── container-layer.txt
    │   ├── image-layer1.txt
    │   ├── image-layer2.txt
    │   ├── image-layer3.txt
    │   ├── subdir1
    │   │   └── subdir1.txt
    │   ├── subdir2
    │   │   └── subdir2.txt
    │   └── subdir3
    │       └── subdir3.txt
    └── run.sh
    
    11 directories, 15 files
    // 2. 对rw层(readwrite)的文件进行修改。直接修改。
    root@192:/tmp/aufs# echo 666 > ./mnt/container-layer.txt
    root@192:/tmp/aufs# cat container-layer/container-layer.txt
    666
    // 3. 对ro层(readonly)的文件进行修改。copy到rw读写层之后再wrtie。(copy on write)
    root@192:/tmp/aufs# echo 777 > ./mnt/image-layer1.txt
    root@192:/tmp/aufs# cat image-layer1/image-layer1.txt
    I am image layer 1
    root@192:/tmp/aufs# cat ./mnt/image-layer1.txt
    777
    // 4. 对ro层进行修改后的目录树,container-layer目录(rw层)增加了1个文件
    root@192:/tmp/aufs# tree
    .
    ├── container-layer
    │   ├── container-layer.txt
    │   └── image-layer1.txt //  ydd:这是copy on write的文件
    ├── image-layer1
    │   ├── image-layer1.txt
    │   └── subdir1
    │       └── subdir1.txt
    ├── image-layer2
    │   ├── image-layer2.txt
    │   └── subdir2
    │       └── subdir2.txt
    ├── image-layer3
    │   ├── image-layer3.txt
    │   └── subdir3
    │       └── subdir3.txt
    ├── mnt
    │   ├── container-layer.txt
    │   ├── image-layer1.txt
    │   ├── image-layer2.txt
    │   ├── image-layer3.txt
    │   ├── subdir1
    │   │   └── subdir1.txt
    │   ├── subdir2
    │   │   └── subdir2.txt
    │   └── subdir3
    │       └── subdir3.txt
    └── run.sh
    
    11 directories, 16 files
    

    演示docker使用aufs作为storage driver

    借助这个场景来理解:宿主机如何往运行中的docker容器中传输文件--Q: docker运行中的容器又是存在哪里的

    AUFS的缺点

    参考附录1

    1. 最大的问题是它不没有进入到 Linux 内核,因此不能保证可移植性,虽然像 ubuntu 这种发行版默认支持 aufs,但并不是所有系统都如此,比如centos 就默认没有提供 aufs 支持。之所以没有合并到内核,据说是因为 aufs 的实现代码很冗杂,Linus 认为代码质量太差,虽然开发者多次精简,最终还是没有进入到内核,而且在短时间内也不会有什么变化。
    2. 我们至少能看到两个性能问题:第一次修改一个大文件会非常耗时;另外层级过多也会影响整体的读写性能。

    docker默认的存储驱动已经演进到了overlay2

    • overlay架构 / /附录5

    • 附录3
      虽然当前 docker 默认的存储驱动已经演进到了 overlay2,但是学习 AUFS 依然可以帮助我们深入理解 docker 中的文件系统。

    • 附录4
      在最新的 Docker 中,overlay2 取代了 aufs 成为了推荐的存储驱动,但是在没有 overlay2 驱动的机器上仍然会使用 aufs 作为 Docker 的默认驱动。

    其他对容器镜像的理解

    附录4

    1. Docker 镜像其实本质就是一个压缩包,我们可以使用下面的命令将一个 Docker 镜像中的文件导出:
    2. 容器和镜像的区别就在于,所有的镜像都是只读的,而每一个容器其实等于镜像加上一个可读写的层,也就是同一个镜像可以对应多个容器。

    Docker五种存储驱动原理及应用场景和性能测试对比 // TODO

    1. aufs 简介以及在 docker 中的使用
    2. [mydocker]---通过例子理解存储驱动AUFS
    3. Linux AUFS 文件系统
    4. Docker 核心技术与实现原理
    5. Docker五种存储驱动原理及应用场景和性能测试对比
  • 相关阅读:
    2020-08-20
    2020-08-19
    2020-08-14
    2020-08-13
    使用numpy实现机器学习模型
    分治法学习
    2020-08-09
    2020-08-02
    四月是你的谎言下载
    新博客
  • 原文地址:https://www.cnblogs.com/yudidi/p/12458571.html
Copyright © 2011-2022 走看看