热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

AUFS:多点合一,写时复制

AUFS(全称:advancedmulti-layeredunificationfilesystem,高级多层统一文件系统),用于为Linux文件系统实现联合挂载。提到联合挂载,就

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 镜像时,写时复制就在发挥着作用。



推荐阅读
  • baresip android编译、运行教程1语音通话
    本文介绍了如何在安卓平台上编译和运行baresip android,包括下载相关的sdk和ndk,修改ndk路径和输出目录,以及创建一个c++的安卓工程并将目录考到cpp下。详细步骤可参考给出的链接和文档。 ... [详细]
  • 本文介绍了Hyperledger Fabric外部链码构建与运行的相关知识,包括在Hyperledger Fabric 2.0版本之前链码构建和运行的困难性,外部构建模式的实现原理以及外部构建和运行API的使用方法。通过本文的介绍,读者可以了解到如何利用外部构建和运行的方式来实现链码的构建和运行,并且不再受限于特定的语言和部署环境。 ... [详细]
  • 本文介绍了在CentOS上安装Python2.7.2的详细步骤,包括下载、解压、编译和安装等操作。同时提供了一些注意事项,以及测试安装是否成功的方法。 ... [详细]
  • 本文概述了JNI的原理以及常用方法。JNI提供了一种Java字节码调用C/C++的解决方案,但引用类型不能直接在Native层使用,需要进行类型转化。多维数组(包括二维数组)都是引用类型,需要使用jobjectArray类型来存取其值。此外,由于Java支持函数重载,根据函数名无法找到对应的JNI函数,因此介绍了JNI函数签名信息的解决方案。 ... [详细]
  • 本文介绍了在Android Studio中使用命令行build gradle的方法,并解决了一些常见问题,包括手动配置gradle环境变量和解决External Native Build Issues的方法。同时提供了相关参考文章链接。 ... [详细]
  • 1.脚本功能1)自动替换jar包中的配置文件。2)自动备份老版本的Jar包3)自动判断是初次启动还是更新服务2.脚本准备进入ho ... [详细]
  • Git GitHub多人协作
    在学校做一个小项目需要多人协作,就用到了gitHub,百度了一下多数写得乱七八糟或者支离破碎,于是总结了一下自己的步骤如下,第一次使用GitHUb,哪里不对望大神指出一.前期准备: ... [详细]
  • Android系统移植与调试之如何修改Android设备状态条上音量加减键在横竖屏切换的时候的显示于隐藏
    本文介绍了如何修改Android设备状态条上音量加减键在横竖屏切换时的显示与隐藏。通过修改系统文件system_bar.xml实现了该功能,并分享了解决思路和经验。 ... [详细]
  • 本文总结了在开发中使用gulp时的一些技巧,包括如何使用gulp.dest自动创建目录、如何使用gulp.src复制具名路径的文件以及保留文件夹路径的方法等。同时介绍了使用base选项和通配符来保留文件夹路径的技巧,并提到了解决带文件夹的复制问题的方法,即使用gulp-flatten插件。 ... [详细]
  • 本文讨论了在手机移动端如何使用HTML5和JavaScript实现视频上传并压缩视频质量,或者降低手机摄像头拍摄质量的问题。作者指出HTML5和JavaScript无法直接压缩视频,只能通过将视频传送到服务器端由后端进行压缩。对于控制相机拍摄质量,只有使用JAVA编写Android客户端才能实现压缩。此外,作者还解释了在交作业时使用zip格式压缩包导致CSS文件和图片音乐丢失的原因,并提供了解决方法。最后,作者还介绍了一个用于处理图片的类,可以实现图片剪裁处理和生成缩略图的功能。 ... [详细]
  • 本文介绍了深入浅出Linux设备驱动编程的重要性,以及两种加载和删除Linux内核模块的方法。通过一个内核模块的例子,展示了模块的编译和加载过程,并讨论了模块对内核大小的控制。深入理解Linux设备驱动编程对于开发者来说非常重要。 ... [详细]
  • 在Oracle11g以前版本中的的DataGuard物理备用数据库,可以以只读的方式打开数据库,但此时MediaRecovery利用日志进行数据同步的过 ... [详细]
  • systemd-nspawn可以创建最轻量级的容器(ns的意思就是namespace),本文的实验平台是Ubuntu16.04,x86_64机器。本文的目的是:在Ubuntu中用syst ... [详细]
  • mysql自动打开文件_让docker中的mysql启动时自动执行sql文件
    本文提要本文目的不仅仅是创建一个MySQL的镜像,而是在其基础上再实现启动过程中自动导入数据及数据库用户的权限设置,并且在新创建出来的容器里自动启动My ... [详细]
  • 本文主要介绍关于linux文件描述符设置,centos7设置文件句柄数,centos7查看进程数的知识点,对【Linux之进程数和句柄数】和【linux句柄数含义】有兴趣的朋友可以看下由【东城绝神】投 ... [详细]
author-avatar
大鱼小鱼比目鱼
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有