Linux AUFS 檔案系統

2022-01-12 21:26:45 字數 3243 閱讀 4432

aufs 的英文全稱為 advanced mult-layered unification filesystem,曾經是 another mult-layered unification filesystem,顯然,現在的內涵規格更高些。說明:本文的演示環境為 ubuntu 16.04。

union file system,簡稱 unionfs,是一種為 linux、freebsd 和 netbsd 作業系統設計的,把其它檔案系統聯合到乙個聯合掛載點的檔案系統服務。它使用 branch 把不同檔案系統的檔案和目錄"透明地"覆蓋,形成乙個單一一致的檔案系統。這些 branch 或者是 read-only 的,或者是 read-write 的,所以當對這個虛擬後的聯合檔案系統進行寫操作的時候,系統是真正寫到了乙個新的檔案中。看起來這個虛擬後的聯合檔案系統是可以對任何檔案進行操作的,但是其實它並沒有改變原來的檔案。這是因為 union file system 用到了乙個重要的資源管理技術:寫時複製。

寫時複製(copy-on-write,常被簡寫為 cow),也叫隱式共享,是一種提高資源使用效率的資源管理技術。它的思想是:如果乙個資源是重複的,在沒有對資源做出修改前,並不需要立即複製出乙個新的資源例項,這個資源被不同的所有者共享使用。當任何乙個所有者要對該資源做出修改時,複製出乙個新的資源例項給該所有者進行修改,修改後的資源成為其所有者的私有資源。通過這種資源共享的方式,可以顯著地減少複製相同資源帶來的消耗,但是這樣做也會在進行資源的修改時增加一部分開銷。

我們可以通過 mount 命令手動建立 aufs,接下來我們就用這種方式來演示 aufs 的主要特徵。

建立演示用的目錄和檔案

先建立乙個名稱為 aufs 的資料夾用作實驗目錄:

$ mkdir aufs
然後在 aufs 中建立名稱為 mnt 的目錄作為檔案系統的掛載點:

$ mkdir aufs/mnt
接下來在 aufs 目錄下建立 container-layer 資料夾(模擬容器的讀寫層),並且在資料夾中建立檔案 container-layer.txt,檔案的內容初始化為 "i am container layer":

$ mkdir aufs/container-layer

$ echo

"i am container layer

" > aufs/container-layer/container-layer.txt

最後在 aufs 目錄下建立三個資料夾 image-layer1、image-layer2、image-layer3(用它們來模擬容器的映象層)。在這三個資料夾中分別建立檔案,並初始化為對應的內容:

$ mkdir aufs/

$ 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

準備的目錄和檔案結構如下圖所示:

建立 aufs 檔案系統

mount 是乙個非常強大的命令,我們可以用它來建立 aufs 檔案系統。下面的命令把 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 目錄下的檔案結構為:

其中的 si_99b90cdd124201eb 目錄是系統為 mnt 這個掛載點建立的,從上圖中我們可以清楚的看到各個目錄的掛載許可權。

驗證寫時複製

下面讓我們向 mnt/image-layer2.txt 檔案中寫入些資料,看看會發生什麼變化?

$ echo

"i changed mnt/image-layer2.txt

" >> mnt/image-layer2.txt

檢視 mnt/image-layer2.txt 的內容,發現已經變化了:

i am image layer 2

i changed mnt/image-layer2.txt

再去看看 image-layer2/image-layer2.txt,發現它的內容沒有變化,還是:

i am image layer 2
原因在**呢?去 container-layer 目錄下看看:

這裡多了乙個 image-layer2.txt 檔案,其內容如下:

原來,當嘗試向 mnt/image-layer2.txt 中寫入檔案時,系統首先在 mnt 目錄下查詢名為 image-layer2.txt 的檔案,將其拷貝到 read-write 層的 container-layer 目錄中,接著對 container-layer 目錄中的 image-layer2.txt 的檔案進行寫操作。這個過程也就是 aufs 的實際工作原理。

至此,我們完成了乙個簡單的 aufs demo。可以看出 aufs 的原理並不是很複雜,但是當與容器技術相結合後,就展示出來超強的魅力,並成為初代 docker 預設的儲存驅動。雖然當前 docker 預設的儲存驅動已經演進到了 overlay2,但是學習 aufs 依然可以幫助我們深入理解 docker 中的檔案系統。

參考:

維基百科 aufs

linux aufs examples

aufs source code

docker use the aufs storage driver

《自己動手寫 docker》

檔案系統 why檔案系統

為什麼需要檔案系統,可否由作業系統直接寫裸裝置?裸裝置是一種沒有經過格式化的磁碟或分割槽,即讓作業系統直接管理操作磁碟設定,進行資料讀寫等。通過檔案系統的方式組織磁碟儲存和資料管理有很多好處,比如 1.資料讀取 管理等操作變得簡單便捷 檔案系統給使用者提供了乙個簡單的操作介面,只需簡單的操作就能實現...

檔案系統 檔案系統的架構

vfs是具體檔案系統的抽象,依靠超級塊 inode dentry以及檔案這些結構來發揮作用,檔案系統的架構就體現在這些結構的使用方式中。1 超級塊作用分析 1 2 所有的dentry都指向乙個dentry hashtable dentry hashtable是乙個樹組,每乙個樹組成員都是hash鍊錶...

檔案系統 編寫檔案系統

8.5 編寫乙個檔案系統 如果寫乙個實際檔案系統,但是涉及的東西太多,不容易簡明扼要的理解檔案系統的實現。linux核心中提供的romfs檔案系統是個非常理想的例子,既有實際應用架構,也清晰明了,故以romfs為例項分析檔案系統的實現。一 linux檔案系統的實現要素 編寫新檔案系統涉及一些基本物件...