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處理的過程大致如下:
- 按需創建目錄結構
- 用相同的元數據創建文件對象
- 拷貝文件數據
- 拷貝擴展屬性
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.