容器文件系統(tǒng)

Overlayfs

Overlayfs是一種類似aufs的一種堆疊文件系統(tǒng),于2014年正式合入Linux-3.18主線內(nèi)核,目前其功能已經(jīng)基本穩(wěn)定(雖然還存在一些特性尚未實(shí)現(xiàn))且被逐漸推廣,特別在容器技術(shù)中更是勢(shì)頭難擋。
它依賴并建立在其它的文件系統(tǒng)之上(例如ext4fs和xfs等等),并不直接參與磁盤空間結(jié)構(gòu)的劃分,僅僅將原來(lái)底層文件系統(tǒng)中不同的目錄進(jìn)行"合并",然后向用戶呈現(xiàn)。因此對(duì)于用戶來(lái)說(shuō),它所見(jiàn)到的overlay文件系統(tǒng)根目錄下的內(nèi)容就來(lái)自掛載時(shí)所指定的不同目錄的"合集"。


image.png

overlayfs最基本的特性,簡(jiǎn)單的總結(jié)為以下3點(diǎn):
(1)上下層同名目錄合并;
(2)上下層同名文件覆蓋;
(3)lower dir文件寫時(shí)拷貝。
這三點(diǎn)對(duì)用戶都是不感知的。

lower dirA / lower dirB目錄和upper dir目錄

  • 他們都是來(lái)自底層文件系統(tǒng)的不同目錄,用戶可以自行指定,內(nèi)部包含了用戶想要合并的文件和目錄,merge dir目錄為掛載點(diǎn)。
  • 當(dāng)文件系統(tǒng)掛載后,在merge目錄下將會(huì)同時(shí)看到來(lái)自各lower和upper目錄下的內(nèi)容,并且用戶也無(wú)法(無(wú)需)感知這些文件分別哪些來(lái)自lower dir,哪些來(lái)自u(píng)pper dir,用戶看見(jiàn)的只是一個(gè)普通的文件系統(tǒng)根目錄而已(lower dir可以有多個(gè)也可以只有一個(gè))。

upper dir和各lower dir這幾個(gè)不同的目錄并不完全等價(jià),存在層次關(guān)系。

  • 當(dāng)upper dir和lower dir兩個(gè)目錄存在同名文件時(shí),lower dir的文件將會(huì)被隱藏,用戶只能看見(jiàn)來(lái)自u(píng)pper dir的文件
  • lower dir也存在相同的層次關(guān)系,較上層屏蔽較下層的同名文件。
  • 如果存在同名的目錄,那就繼續(xù)合并(lower dir和upper dir合并到掛載點(diǎn)目錄其實(shí)就是合并一個(gè)典型的例子)。

讀寫數(shù)據(jù):

  • 各層目錄中的upper dir是可讀寫的目錄,當(dāng)用戶通過(guò)merge dir向其中一個(gè)來(lái)自u(píng)pper dir的文件寫入數(shù)據(jù)時(shí),那數(shù)據(jù)將直接寫入upper dir下原來(lái)的文件中,刪除文件也是同理;
  • 而各lower dir則是只讀的,在overlayfs掛載后無(wú)論如何操作merge目錄中對(duì)應(yīng)來(lái)自lower dir的文件或目錄,lower dir中的內(nèi)容均不會(huì)發(fā)生任何的改變。
  • 當(dāng)用戶想要往來(lái)自lower層的文件添加或修改內(nèi)容時(shí),overlayfs首先會(huì)的拷貝一份lower dir中的文件副本到upper dir中,后續(xù)的寫入和修改操作將會(huì)在upper dir下的copy-up的副本文件中進(jìn)行,lower dir原文件被隱藏。

overlayfs特性帶來(lái)的好處和應(yīng)用場(chǎng)景
實(shí)際的使用中,會(huì)存在以下的多用戶復(fù)用共享文件和目錄的場(chǎng)景。


image.png

復(fù)用共享目錄文件

  • 在同一個(gè)設(shè)備上,用戶A和用戶B有一些共同使用的共享文件(例如運(yùn)行程序所依賴的動(dòng)態(tài)鏈接庫(kù)等),一般是只讀的;同時(shí)也有自己的私有文件(例如系統(tǒng)配置文件等),往往是需要能夠?qū)懭胄薷牡?;最后即使用戶A修改了被共享的文件也不會(huì)影響到用戶B。

  • 對(duì)于以上的需求場(chǎng)景,我們并不希望每個(gè)用戶都有一份完全一樣的文件副本,因?yàn)檫@樣不僅帶來(lái)空間的浪費(fèi)也會(huì)影響性能,因此overlayfs是一個(gè)較為完美的解決方案。我們將這些共享的文件和目錄所在的目錄設(shè)定為lower dir (1~n),將用戶私有的文件和目錄所在的目錄設(shè)定為upper dir,然后掛載到用戶指定的掛載點(diǎn),這樣即能夠保證前面列出的3點(diǎn)需求,同時(shí)也能夠保證用戶A和B獨(dú)有的目錄樹結(jié)構(gòu)。最后最為關(guān)鍵的是用戶A和用戶B在各自掛載目錄下看見(jiàn)的共享文件其實(shí)是同一個(gè)文件,這樣磁盤空間的節(jié)省自是不必說(shuō)了,還有就是共享同一份cache而減少內(nèi)存的使用和提高訪問(wèn)性能,因?yàn)橹灰猚ache不被回收,只需某個(gè)用戶首次訪問(wèn)時(shí)創(chuàng)建cache,后續(xù)其他所有用戶都可以通過(guò)訪問(wèn)cache來(lái)提高IO性能。
    這種使用場(chǎng)景在容器技術(shù)中應(yīng)用最為廣泛

Overlay和Overlay2

以docker容器為例來(lái)介紹overlay的兩種應(yīng)用方式:Overlay和Overlay2.

  • Docker容器將鏡像層(image layer)作為lower dir
  • 將容器層(container layer)作為upper dir
  • 最后掛載到容器merge掛載點(diǎn),即容器的根目錄下。

遺憾的是,早期內(nèi)核中的overlayfs并不支持多l(xiāng)ower layer,在Linux-4.0以后的內(nèi)核版本中才陸續(xù)支持完善。而容器中可能存在多層鏡像,所以出現(xiàn)了兩種overlayfs的掛載方式,早期的overlay不使用多l(xiāng)ower layer的方式掛載而overlay2則使用該方式掛載。

1. Overlay Driver

Overlay掛載方式如下
--該圖引用自Miklos Szeredi的《overlayfs and containers》2017 linux內(nèi)核大會(huì)演講材料


image.png

鏡像層和容器層的組織方式
黃色框中的部分是鏡像層和容器層的組織方式

  • 各個(gè)鏡像層中,每下一層中的文件以硬鏈接的方式出現(xiàn)在它的上一層中,以此類推,最終掛載overlayfs的lower dir為最上層鏡像層目錄imager layer N。
  • 與此同時(shí),容器的writable dir作為upper dir,掛載成為容器的rootfs。

本圖中雖然只描述了一個(gè)容器的掛載方式,但是其他容器也類似,鏡像層lower dir N共享,只是各個(gè)容器的upper dir不同而已。

2、Overlay2 Driver

image.png

Overlay2掛載方式如下。
--該圖引用自Miklos Szeredi的《overlayfs and containers》2017 linux內(nèi)核大會(huì)演講材料


image.png

Overlay2的掛載方式比Overlay的要簡(jiǎn)單許多,它基于內(nèi)核overlayfs的Multiple lower layers特性實(shí)現(xiàn),不再需要硬鏈接,直接將鏡像層的各個(gè)目錄設(shè)置為overlayfs的各個(gè)lower layer即可(Overlayfs最多支持500層lower dir),對(duì)比Overlay Driver將減少inode的使用。

分別查看鏡像的詳細(xì)信息和運(yùn)行成容器之后的容器詳細(xì)信息
lower1:lower2:lower3 :
表示不同的lower層目錄,不同的目錄使用":"分隔,層次關(guān)系依次為lower1 > lower2 > lower3
注:多l(xiāng)ower層功能支持在Linux-4.0合入,Linux-3.18版本只能指定一個(gè)lower dir

  • upper和目錄:
    表示upper層目錄
  • work目錄:
    ? 和文件系統(tǒng)掛載后用于存放臨時(shí)和間接文件的工作基目錄(work base dir)
  • merged目錄:
    就是最終的掛載點(diǎn)目錄
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容