淺談overlayfs

overlayfs

overlayfs試圖在其它文件系統之上提供一個聯合的文件系統視圖

 

 

Upper and Lower

overlayfs組合了2個文件系統---Upper文件系統和Lower文件系統。

當同名文件在Upper和Lower中都存在時,Lower中的文件會隱藏,如果是目錄,則會合並顯示.

 

Lower文件系統更準確的說法應該是目錄樹,因爲這些目錄樹可以屬於不同的文件系統。

Lower文件系統可以是linux支持的任何文件系統類型,其甚至可以是overlayfs.

 

目錄合併

對於非目錄文件,如果upper和lower中都存在,那麼lower中的對象會被隱藏.

如果是目錄,upper和lower中的目錄會合並.

 

我們通過下面的命令來指定upperdir, lowerdir,它們將會合併成merged目錄.

mount -t overlay overlay -o lowerdir=/root/lowerdir/,upperdir=/root/overlayt/upper,workdir=/root/overlayt/work /root/overlayt/merged

 

其中lowerdir目錄中的內容如下:

[root@localhost overlayt]# ls -l /root/lowerdir/

總用量 4

-rw-r--r-- 1 root root 4 3月  15 18:35 1

-rw-r--r-- 1 root root 0 3月  15 18:35 2

-rw-r--r-- 1 root root 0 3月  15 18:35 3

drwxr-xr-x 2 root root 6 3月  15 18:35 4

[root@localhost overlayt]#

 

 

upper:我們的可寫層

lower:底層目錄樹

merged:聯合視圖

workdir:需要是一個空目錄,且和upper在同一個文件系統中

 

當在merged目錄進行lookup操作時,lookup會在各個目錄中搜尋並將結果聯合起來緩存到overlayfs文件系統的dentry中。

如果upper,lower中存在相同的目錄,則會合並在merged中顯示

 

我們在lower中的dir1目錄下創建low1文件

在upper的dir1目錄下創建up1文件

 

在merged中的dir1目錄下會同時出現up1,low1.

 

再來看看刪除文件的處理

whiteouts和opaque目錄

爲了支持rm,rmdir操作,且不影響lowdir的內容,overlayfs需要在upper中記錄被刪除文件的信息。

whiteout是一個主從設備號爲0/0的字符設備文件,當在merged目錄下有whiteout文件時,lower目錄中的同名文件會被忽略.whiteout文件本身也會隱藏,我們在upper目錄中能夠找到它.

 

readdir

當在merged目錄調用readdir時,upper和lower目錄的文件都會被讀取(先讀取upper目錄,再讀取lower目錄).這個合併列表會被緩存在file結構中並保持到file關閉。如果目錄被兩個不同的進程打開並讀取,那麼它們有不同的緩存。seekdir設置偏移爲0後再調用readdir會使緩存無效並進行重建。

 

這意味着,merged的變化在dir打開期間不會體現,對於很多程序容易忽略這一點。

 

 

非目錄

對於非目錄對象(文件,符號鏈接,特殊設備文件)。當對lowdir的對象進行寫操作時,會先進行copy_up操作。創建硬鏈接也需要copy_up,軟鏈接則不需要。

copy_up有時可能不需要,比如以read-write方式打開而實際上並沒有進行修改.

copy_up處理的過程大致如下:

  1. 按需創建目錄結構
  2. 用相同的元數據創建文件對象
  3. 拷貝文件數據
  4. 拷貝擴展屬性

 

copy_up完成之後,overlayfs就可以簡單的在upper文件系統上提供對對象的訪問。

 

 

多個lower layers

我們可以通過":"來指定多個lower layers.

 mount -t overlay overlay -olowerdir=/lower1:/lower2:/lower3 /merged

 

在上面的例子中,我們沒有指定upper,workdir.這意味着overlayfs是隻讀的。

多個lower layers從右邊依次入棧,按照在棧中的順序在merge中體現。lower3在最底層,lower1在是頂層.

 

非標準行爲

copy_up操作創建了一個新的文件。新文件可能處於和老文件不同的文件系統中,因此st_dev,st_ino都是新的。

在copy_up之前老文件上的文件鎖不會copy_up

如果一個有多個硬鏈接的文件被copy_up,那麼會打斷這種鏈接。改變不會傳播給相同硬鏈接文件。

 

 

修改底層underlay文件系統

線下修改,當overlay沒有mount時,允許修改upper,lower目錄

不允許在mount overlay時對underlay進行修改。如果對underlay進行了修改,那麼overlay的行爲是不確定的。儘管不會crash或者deadlock.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章