<commit_before>---
layout: post
title: AUFS
permalink: /:categories/:year/:month/:day/:title.html
description: This is repost from my old blog, this has been write at 2015-03-04, i actually want to learn something about docker and it's essential, aufs. But i could not find any detail information about it. So i learn it and write some of my learned.
date: 2015-03-04 10:22:22 +08:00
tags: 
    aufs
---

AUFS可能是受到不会进入linux主线的传言影响，资料真是难找，除了主页以外，比较少有细节的资料供参考。但是眼下docker这么火的技术，要是光用，真心不符合我等Diors的内心需求，不搞清楚点到底什么东西，最起码原理是什么样子，真心不踏实。

只好自己去浏览源码了。

但说句真心话，出身决定命运，我作为vxworks出身的人，对linux的命名风格真是打心里想问候他娘。
***
*AUFS*，人如其名，*another unionfs*，所以很多概念和unionfs类似：     
 1, *可堆叠联合的文件系统*。
   就是可以把多个目录，合并显示到另一个目录，只是显示合并了，并不改变源目录。
 2, *Branch*，也可以理解为层，layer。
   和unionfs相同的概念，多个子目录合并显示，子目录即branch，只是branch的使用策略与unionfs有不同。
 3, *Copy on write, Copyup, 写时复制*。
   当需要做修改时，会查找已有branch中是否已存在文件或者文件夹，若存在，则选择可写的最优branch，把该文件或者文件夹拷贝到最优branch，再做修改。
 4, *Whiteout, 白障*。
   删除文件，如果下层branch为只读，无法修改，那上层建立一个屏蔽文件，.wh.xxxx, 用来屏蔽下层的已知文件。
     
AUFS就是讲多个目录转化为自己目录的branch，其中branch可以设置为读写，或者只读。多个branch的内容都虚拟的显示到自己的目录中，实际物理上的内容并不改变。当需要操作任何文件时，通过一定的策略，将修改操作可能作用到不同的branch上，单基本的原理是如果branch是只读的，那选择一个可写的branch，并把相应的内容拷贝到新的branch上，然后修改。自己的目录中显示最新的修改。最典型的应用就是docker中的image layer。最简单的配置就是一个可读写branch+一堆只读branch，这时所有的修改都只会出现在第一个可读写的branch上，想象一下，相当于做了个diff，当前的内容和原来内容的的差异全都在第一个branch上，只需要保存diff就能复原当前环境，其他的branch可以作为基础branch，这样就可以快速部署基础branch，并在其上很快添加不同的branch。
利用docker的一张image的图，比较形象的解释了层叠文件系统的情况，每一层都可以是一个aufs的branch。感受一下:

![docker box frame](https://cl.ly/1C1K3J2c0j0J/docker%20box%20frame.png)

AUFS就是相关操作网上一堆，不过推荐直接去主页看:aufs。
下面从具体的操作过程感受一下：


<commit_msg>post 20161011-3<commit_after>---
layout: post
title: AUFS
permalink: /:categories/:year/:month/:day/:title.html
description: This is repost from my old blog, this has been write at 2015-03-04, i actually want to learn something about docker and it's essential, aufs. But i could not find any detail information about it. So i learn it and write some of my learned.
date: 2015-03-04 10:22:22 +08:00
tags: 
    aufs
---

AUFS可能是受到不会进入linux主线的传言影响，资料真是难找，除了主页以外，比较少有细节的资料供参考。但是眼下docker这么火的技术，要是光用，真心不符合我等Diors的内心需求，不搞清楚点到底什么东西，最起码原理是什么样子，真心不踏实。

只好自己去浏览源码了。

但说句真心话，出身决定命运，我作为vxworks出身的人，对linux的命名风格真是打心里想问候他娘。
***
*AUFS*，人如其名，*another unionfs*，所以很多概念和unionfs类似：     
 1, *可堆叠联合的文件系统*。
   就是可以把多个目录，合并显示到另一个目录，只是显示合并了，并不改变源目录。
 2, *Branch*，也可以理解为层，layer。
   和unionfs相同的概念，多个子目录合并显示，子目录即branch，只是branch的使用策略与unionfs有不同。
 3, *Copy on write, Copyup, 写时复制*。
   当需要做修改时，会查找已有branch中是否已存在文件或者文件夹，若存在，则选择可写的最优branch，把该文件或者文件夹拷贝到最优branch，再做修改。
 4, *Whiteout, 白障*。
   删除文件，如果下层branch为只读，无法修改，那上层建立一个屏蔽文件，.wh.xxxx, 用来屏蔽下层的已知文件。
     
AUFS就是讲多个目录转化为自己目录的branch，其中branch可以设置为读写，或者只读。多个branch的内容都虚拟的显示到自己的目录中，实际物理上的内容并不改变。当需要操作任何文件时，通过一定的策略，将修改操作可能作用到不同的branch上，单基本的原理是如果branch是只读的，那选择一个可写的branch，并把相应的内容拷贝到新的branch上，然后修改。自己的目录中显示最新的修改。最典型的应用就是docker中的image layer。最简单的配置就是一个可读写branch+一堆只读branch，这时所有的修改都只会出现在第一个可读写的branch上，想象一下，相当于做了个diff，当前的内容和原来内容的的差异全都在第一个branch上，只需要保存diff就能复原当前环境，其他的branch可以作为基础branch，这样就可以快速部署基础branch，并在其上很快添加不同的branch。
利用docker的一张image的图，比较形象的解释了层叠文件系统的情况，每一层都可以是一个aufs的branch。感受一下:

![docker box frame](https://cl.ly/1C1K3J2c0j0J/docker%20box%20frame.png)

AUFS就是相关操作网上一堆，不过推荐直接去主页看:[aufs](http://aufs.sourceforge.net/aufs.html)。
下面从具体的操作过程感受一下：



{'fraction_non_alphanumeric': 0.09899175068744272, 'fraction_numerical': 0.027192178429575314, 'mean_word_length': 9.073846153846153, 'pattern_counts': {'":': 0, '<': 3, '<?xml version=': 0, '>': 3, 'https://': 2, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '1186058', 'n_tokens_mistral': 2174, 'n_tokens_neox': 2376, 'n_words': 181}