新聞中心
AUFS是一種聯(lián)合文件系統(tǒng)。它使用同一個Linux host上的多個目錄,逐個堆疊起來,對外呈現(xiàn)出一個統(tǒng)一的文件系統(tǒng)。AUFS使用該特性,實(shí)現(xiàn)了Docker鏡像的分層。下圖展示出ubuntu:latest的鏡像的分層。

站在用戶的角度思考問題,與客戶深入溝通,找到橋東網(wǎng)站設(shè)計(jì)與橋東網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗(yàn),讓設(shè)計(jì)與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個性化、用戶體驗(yàn)好的作品,建站類型包括:網(wǎng)站制作、網(wǎng)站設(shè)計(jì)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣、國際域名空間、虛擬空間、企業(yè)郵箱。業(yè)務(wù)覆蓋橋東地區(qū)。
Union File System
Union File System,簡稱 UnionFS,是一種為 Linux、FreeBSD 和 NetBSD 操作系統(tǒng)設(shè)計(jì)的,把其它文件系統(tǒng)聯(lián)合到一個聯(lián)合掛載點(diǎn)的文件系統(tǒng)服務(wù)。它使用 branch 把不同文件系統(tǒng)的文件和目錄”透明地”覆蓋,形成一個單一一致的文件系統(tǒng)。這些 branch 或者是 read-only 的,或者是 read-write 的,所以當(dāng)對這個虛擬后的聯(lián)合文件系統(tǒng)進(jìn)行寫操作的時候,系統(tǒng)是真正寫到了一個新的文件中??雌饋磉@個虛擬后的聯(lián)合文件系統(tǒng)是可以對任何文件進(jìn)行操作的,但是其實(shí)它并沒有改變原來的文件。這是因?yàn)?Union File System 用到了一個重要的資源管理技術(shù):寫時復(fù)制。
寫時復(fù)制(copy-on-write,常被簡寫為 CoW),也叫隱式共享,是一種提高資源使用效率的資源管理技術(shù)。它的思想是:如果一個資源是重復(fù)的,在沒有對資源做出修改前,并不需要立即復(fù)制出一個新的資源實(shí)例,這個資源被不同的所有者共享使用。當(dāng)任何一個所有者要對該資源做出修改時,復(fù)制出一個新的資源實(shí)例給該所有者進(jìn)行修改,修改后的資源成為其所有者的私有資源。通過這種資源共享的方式,可以顯著地減少復(fù)制相同資源帶來的消耗,但是這樣做也會在進(jìn)行資源的修改時增加一部分開銷。
創(chuàng)建 AUFS
我們可以通過 mount 命令手動創(chuàng)建 AUFS,接下來我們就用這種方式來演示 AUFS 的主要特征。
創(chuàng)建演示用的目錄和文件
先創(chuàng)建一個名稱為 aufs 的文件夾用作實(shí)驗(yàn)?zāi)夸洠?/p>
$ mkdir aufs
然后在 aufs 中創(chuàng)建名稱為 mnt 的目錄作為文件系統(tǒng)的掛載點(diǎn):
$ mkdir aufs/mnt
接下來在 aufs 目錄下創(chuàng)建 container-layer 文件夾(模擬容器的讀寫層),并且在文件夾中創(chuàng)建文件 container-layer.txt,文件的內(nèi)容初始化為 “I am container layer”:
$ mkdir aufs/container-layer
$ echo "I am container layer" > aufs/container-layer/container-layer.txt
最后在 aufs 目錄下創(chuàng)建三個文件夾 image-layer1、image-layer2、image-layer3(用它們來模擬容器的鏡像層)。在這三個文件夾中分別創(chuàng)建文件,并初始化為對應(yīng)的內(nèi)容:
$ 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.txt
準(zhǔn)備的目錄和文件結(jié)構(gòu)如下圖所示:
創(chuàng)建 AUFS 文件系統(tǒng)
mount 是一個非常強(qiáng)大的命令,我們可以用它來創(chuàng)建 AUFS 文件系統(tǒng)。下面的命令把 container-layer、image-layer1、image-layer2、image-layer3 以 AUFS 的方式掛載到剛才創(chuàng)建的 mnt 目錄下:
$ cd aufs
$ sudo mount -t aufs -o dirs=./container-layer:./image-layer1:./image-layer2:./image-layer3 none ./mnt
掛載完成后可以看到 mnt 目錄下的文件結(jié)構(gòu)為:
注意,在 mount 命令中我們沒有指定要掛載的 4 個文件夾的權(quán)限信息,其默認(rèn)行為是:dirs 指定的左邊起第一個目錄是 read-write 權(quán)限,后續(xù)目錄都是 read-only 權(quán)限。我們可以通過下面的方式查看詳情:
其中的 si_99b90cdd124201eb 目錄是系統(tǒng)為 mnt 這個掛載點(diǎn)創(chuàng)建的,從上圖中我們可以清楚的看到各個目錄的掛載權(quán)限。
驗(yàn)證寫時復(fù)制
下面讓我們向 mnt/image-layer2.txt 文件中寫入些數(shù)據(jù),看看會發(fā)生什么變化?
$ echo "I changed mnt/image-layer2.txt" >> mnt/image-layer2.txt
查看 mnt/image-layer2.txt 的內(nèi)容,發(fā)現(xiàn)已經(jīng)變化了:
I am image layer 2
I changed mnt/image-layer2.txt
再去看看 image-layer2/image-layer2.txt,發(fā)現(xiàn)它的內(nèi)容沒有變化,還是:
I am image layer 2
原因在哪里呢?去 container-layer 目錄下看看:
這里多了一個 image-layer2.txt 文件,其內(nèi)容如下:
原來,當(dāng)嘗試向 mnt/image-layer2.txt 中寫入文件時,系統(tǒng)首先在 mnt 目錄下查找名為 image-layer2.txt 的文件,將其拷貝到 read-write 層的 container-layer 目錄中,接著對 container-layer 目錄中的 image-layer2.txt 的文件進(jìn)行寫操作。這個過程也就是 AUFS 的實(shí)際工作原理。
至此,我們完成了一個簡單的 AUFS demo??梢钥闯?AUFS 的原理并不是很復(fù)雜,但是當(dāng)與容器技術(shù)相結(jié)合后,就展示出來超強(qiáng)的魅力,并成為初代 docker 默認(rèn)的存儲驅(qū)動。雖然當(dāng)前 docker 默認(rèn)的存儲驅(qū)動已經(jīng)演進(jìn)到了 overlay2,但是學(xué)習(xí) AUFS 依然可以幫助我們深入理解 docker 中的文件系統(tǒng)。
網(wǎng)頁標(biāo)題:講解一下LinuxAUFS文件系統(tǒng)
文章出自:http://www.dlmjj.cn/article/djedsds.html


咨詢
建站咨詢
