Docker 存儲引擎 overlay、overlay2 及 AUFS 簡介

Overlay FS

Overlay FS 在 Linux 3.18 開始正式支持,它能夠將上層目錄(upperdir)和下層目錄(lowerdir)進行合併,提供用戶一個統一的合併目錄(mergeddir)。其合併規則如下:

  1. 同名上下層目錄合併;
  2. 同名的文件,上層覆蓋下層;
  3. 對下層的文件修改採用寫時複製(copy_up),下層文件無法直接修改,需要複製到上層進行修改,然後再依規則進行覆蓋。

Overlay FS 在容器技術中應用廣泛,尤其在Docker中。

Docker 容器以鏡像層(Image layer)爲下層目錄,容器可寫層爲上層目錄,合併到容器掛載點(根目錄)。早期 Linux 內核中的 Overlay FS 不支持多下層目錄,Linux 4.0 以後版本才陸續完善了多下層目錄的功能。我們知道 Docker 經常是多鏡像層的,這意味着具有多層的下層目錄。對此,Docker 提供了兩種方式接入 Overlay FS:

  1. Overlay Driver,下層目錄依次進行硬鏈接,然後最上層的鏡像目錄跟容器可寫層合併到掛載點;
  2. Overlay2 Driver,只支持 Linux 4.0以上版本,下層鏡像目錄(最多支持500個)直接根容器可寫層合併到掛載點,不存在硬鏈接導致的 inode 消耗過多問題。

Overlay FS 相比於AUFS的優點:

  1. 支持頁緩存(Page caching)共享,多個容器訪問同一個文件,可以共享一個或多個頁緩存;
  2. copy_up 操作快,因爲 overlay 只有兩層,而 AUFS 有很多層,文件穿越多層較爲耗時;
  3. 代碼融入到 Linux 內核中,廣泛支持各 Linux 發行版。

AUFS

AUFS(Another/Alternative/Advance UnionFS),重寫自 UnionFS 1.x,使用上完全兼容 UnionFS,未進入 Linux內核,僅在部分 Linux 發行版中(比如 Debian、Ubuntu)。

多個目錄(或曰 branch)掛載到同一個掛載點時,默認上層目錄可讀可寫(rw),下層目錄只讀(ro),可以對目錄指定權限;對於重複的文件,修改時只會修改上層目錄的文件。

刪除文件時,如果是上層的文件會被直接刪除;而對於下層文件,因爲一般是隻讀,無法刪除,所以 AUFS 通過在上層目錄中增加一個 whiteout 文件,隱藏下層文件。

軟鏈接和硬鏈接

在 Linux 文件系統中,文件通過 inode(節點索引編號)唯一區分。文件分爲元數據(metadata)和數據域(data block),而 inode 唯一指向數據域。

硬鏈接(Hard link)就是在同一個文件系統中,文件名不同,但 inode 一樣的文件副本;軟鏈接(Soft link, or symbolic link)則是另一個文件,inode 不同,但 inode 指向的數據域中存放的是所鏈接文件的路徑。

硬鏈接可以防止文件誤刪除,因爲在 Linux 中一個文件的數據域被刪除,當且僅當其 inode 的引用爲 0,也就是必須刪除該文件的所有硬鏈接,該文件纔會被最終刪除。

軟鏈接則不同,當所鏈接文件被刪除時,鏈接也會失效。

在 Linux 中進行鏈接的命令如下:

# 軟鏈接
ln -s source target
# 硬鏈接
ln source target

參考

  1. 深入理解overlayfs(一):初識
  2. Docker存儲驅動之AUFS簡介
  3. Docker鏡像原理 aufs overlay overlay2
  4. Docker Storage Driver:存儲驅動
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章