Overlay文件系統是一種聯合文件系統,它允許將多個目錄層疊在一起,形成一個統一的視圖。這種技術最初在Linux內核3.18版本中被引入,現在已經成為容器技術(如Docker)中常用的存儲解決方案。以下是Overlay文件系統的工作原理:
- 組成目錄:
- lowerdir:只讀層,包含基礎文件系統的內容,用戶不能修改這個層的數據。
- upperdir:可讀寫層,用戶可以修改這個層的數據。
- merged:最終呈現給用戶的目錄,包含了lower和upper層的所有文件和目錄。
- workdir:工作目錄,用于存儲臨時文件和中間數據,在合并操作完成前,對這部分數據所做的修改都不會影響到最終的合并視圖。
- 掛載過程:
使用mount
命令將lowerdir和upperdir目錄掛載到workdir目錄上,并創建merged目錄作為最終的掛載點。這個過程涉及到系統調用sys_mount()
,它會執行虛擬文件系統的通用掛載過程,如申請和初始化超級塊對象,并調用具體文件系統的fill_super()
接口來填充超級塊對象。
- 文件系統操作:
- 文件的讀取:如果容器層中不存在文件,OverlayFS會從lowerdir中讀??;如果容器層中存在文件,則直接從容器層讀取。如果容器層和鏡像層都存在文件,OverlayFS會讀取容器層中的文件,并隱藏鏡像層中的同名文件。
- 文件的修改:當用戶在upperdir中修改文件時,數據會直接寫入upperdir中的原目錄。如果用戶在lowerdir中修改數據,由于lowerdir是只讀的,OverlayFS會首先將lowerdir中的文件副本拷貝到upperdir中,然后在upperdir中進行修改。
- 文件的刪除:為了支持刪除操作,OverlayFS引入了whiteout文件的概念。如果需要在lower層刪除文件或目錄,需要在upper層創建一個對應的whiteout文件。
- 合并策略:
OverlayFS使用“最后寫入者勝出”(last writer wins)的策略來合并文件系統。這意味著,如果有多個覆蓋文件系統包含相同的文件,那么位于頂層的覆蓋文件系統中的文件將被保留,而較低層覆蓋文件系統中的文件將被覆蓋。
Overlay文件系統的設計使其在處理大量小文件時性能更優,因為它支持頁緩存共享,減少了內存占用。此外,OverlayFS的優點包括輕量級、高性能、易于與Docker等容器技術集成。然而,它也需要Linux內核3.18及以上版本,并且對共享存儲的支持有限。