一個 overlay 文件系統(tǒng)包含兩個文件系統(tǒng),一個 upper 文件系統(tǒng)和一個 lower 文件系統(tǒng)太抓,是一種新型的聯(lián)合文件系統(tǒng)空闲。overlay是“覆蓋…上面”的意思,overlay文件系統(tǒng)則表示一個文件系統(tǒng)覆蓋在另一個文件系統(tǒng)上面走敌。
為了更好的展示 overlay 文件系統(tǒng)的原理碴倾,現(xiàn)新構(gòu)建一個overlay文件系統(tǒng)。文件樹結(jié)構(gòu)如下:
1掉丽、在一個支持 overlay文件系統(tǒng)的 Linux (內(nèi)核3.18以上)的操作系統(tǒng)上一個同級目錄內(nèi)(如/root下)創(chuàng)建四個文件目錄 lower 跌榔、upper 、merged 捶障、work其中 lower 和 upper 文件夾的內(nèi)容如上圖所示僧须,merged 和work 為空,same文件名相同项炼,內(nèi)容不同担平。
2、在/root目錄下執(zhí)行如下掛載命令锭部,可以看到空的merged文件夾里已經(jīng)包含了 lower 及 upper 文件夾中的所有文件及目錄暂论。
$mount -t overlay overlay -olowerdir=./lower,upperdir=./upper,workdir=./work ./merged
3、使用df –h 命令可以看到新構(gòu)建的 overlay 文件系統(tǒng)已掛載空免。
Filesystem Size Used Avail Use% Mounted on
overlay 20G 13G 7.8G 62% /root /merged
那么 lower 和 upper 目錄里有相同的文件夾及相同的文件,合并到 merged 目錄里時顯示的是哪個呢盆耽?規(guī)則如下:
1. 文件名及目錄不相同蹋砚,則 lower 及 upper 目錄中的文件及目錄按原結(jié)構(gòu)都融入到 merged 目錄中扼菠;
2. 文件名相同,只顯示 upper 層的文件坝咐。如上圖在 lower 和 upper 目錄下及下層目錄 dir_A 下都有 same.txt 文件循榆,但在合并到 merged 目錄時,則只顯示 upper 的墨坚,而 lower 的隱藏 ;
3. 目錄名相同秧饮, 對目錄進行合并成一個目錄。如上圖在 lower 及 upper 目錄下都有 dir_A 目錄泽篮,將目錄及目錄下的所有文件合并到 merged 的 dir_A 目錄盗尸,目錄內(nèi)如有文件名相同,則同樣只顯示 upper 的帽撑,如上圖中 dir_A 目錄下的same.txt文件泼各。
overlay只支持兩層,upper文件系統(tǒng)通常是可寫的亏拉;lower文件系統(tǒng)則是只讀扣蜻,這就表示著,當(dāng)我們對 overlay 文件系統(tǒng)做任何的變更及塘,都只會修改 upper 文件系統(tǒng)中的文件莽使。那下面看一下overlay文件系統(tǒng)的讀,寫笙僚,刪除操作。
讀
? 讀 upper 沒有而 lower 有的文件時味咳,需從 lower 讀庇勃;
? 讀只在 upper 有的文件時,則直接從 upper 讀
? 讀 lower 和 upper 都有的文件時责嚷,則直接從 upper 讀罕拂。
寫
? 對只在 upper 有的文件時爆班,則直接在 upper 寫
? 對在lower 和 upper 都有的文件時柿菩,則直接在 upper 寫枢舶。
? 對只在 lower 有的文件寫時,則會做一個copy_up 的操作凉泄,先從 lower將文件拷貝一份到upper躏尉,同時為文件創(chuàng)建一個硬鏈接。此時可以看到 upper 目錄下生成了兩個新文件后众,寫的操作只對從lower 復(fù)制到 upper 的文件生效胀糜,而 lower 還是原文件。
刪
? 刪除 lower 和 upper 都有的文件時蒂誉,upper 的會被刪除教藻,在 upper 目錄下創(chuàng)建一個 ‘without’ 文件,而 lower 的不會被刪除拗盒。
? 刪除 lower 有而 upper 沒有的文件時怖竭,會為被刪除的文件在 upper 目錄下創(chuàng)建一個 ‘without’ 文件,而 lower 的不會被刪除陡蝇。
? 刪除 lower 和 upper 都有的目錄時痊臭,upper 的會被刪除,在 upper 目錄下創(chuàng)建一個類似‘without’ 文件的 ‘opaque’ 目錄登夫,而 lower 的不會被刪除广匙。
可以看到,因為 lower 是只讀恼策,所以無論對 lower 上的文件和目錄做任何的操作都不會對 lower 做變更鸦致。所有的操作都是對在 upper 做, 涣楷。
copy_up只在第一次寫時對文件做copy_up操作分唾,后面的操作都不再需要做copy_up,都只操作這個文件狮斗,特別適合大文件的場景绽乔。overlay的 copy_up操作要比AUFS相同的操作要快,因為AUFS有很多層碳褒,在穿過很多層時可能會有延遲折砸,而overlay 只有兩層。而且overlay在2014年并入linux kernel mailline 沙峻,但是aufs并沒有被并入linux kernel mailline 睦授,所以overlay 可能會比AUFS快。
lower文件系統(tǒng)可以為任何linux支持的文件系統(tǒng)摔寨,甚至可以為另一個overlayfs去枷。因為雖然overlay文件系統(tǒng)的底層是由兩個文件系統(tǒng)構(gòu)成,但它本身只是一個文件系統(tǒng),就如前面用df命令看到的删顶,所以也可以和其他文件系統(tǒng)組成新的overlay文件系統(tǒng)疗隶。而upper是可寫的,不支持NFS翼闹。多層 lower 可執(zhí)行如下命令:
$mount -t overlay overlay -olowerdir=/lower1:/lower2:/lower3 ,upperdir=./upper,workdir=./work ./merged
上例中,lower 是由三個文件系統(tǒng)合并成一個文件系統(tǒng)蒋纬,其中l(wèi)ower1在最上面猎荠,lower3在最底下。
Docker一直在用AUFS(高級多層次統(tǒng)一文件系統(tǒng))作為容器的文件系統(tǒng)蜀备。AUFS是一個能透明覆蓋一或多個現(xiàn)有文件系統(tǒng)的層狀文件系統(tǒng)关摇。當(dāng)一個進程需要修改一個文件時,AUFS創(chuàng)建該文件的一個副本碾阁。AUFS可以把多層合并成文件系統(tǒng)的單層表示输虱。Docker 的image構(gòu)采用的是AUFS,每個新版本都是一個與之前版本的簡單差異改動脂凶,有效地保持鏡像文件最小化宪睹。那docker 使用 overlay 之后有什么區(qū)別呢?
首先鏡像在下載時每一層的鏡像都有一個自己的鏡像ID蚕钦,每個鏡像都會有自己的目錄亭病,保存在/var/lib/docker/overlay目錄下,但是這些層目錄的名字并不是下載鏡像時的ID名稱嘶居。我們都知道AUFS是多層罪帖,那如何體現(xiàn)為兩層呢?啟動一個容器后邮屁,也在這個目錄下產(chǎn)生一個層目錄整袁,進入到目錄可以看到有三個文件夾,分別是merged佑吝,upper坐昙,work,和一個文件lower-id迹蛤,而在lower-id中保存的就是鏡像最上層的ID民珍,所以對容器來說,還是一個兩層的文件系統(tǒng)盗飒。
這里說明一下嚷量,docker pull image時顯示的鏡像ID名稱與/var/lib/docker/overlay目錄下的鏡像目錄名稱不一樣。鏡像目錄中保存的是這層獨有的文件和硬鏈接下層共享的文件逆趣。這樣可以更有效的利用磁盤資源蝶溶。
從上面這個圖可以看到,overlay的兩層對應(yīng)的就是docker的鏡像層(只讀)和容器層(可寫),只是把原來AUFS中的多層鏡像合并成了lower層抖所,而upper層代表的是容器層梨州。
我們看到雖然overlay和AUFS都是聯(lián)合文件系統(tǒng),但結(jié)構(gòu)比AUFS簡單田轧,且并入了linux kernel mainline暴匠,可能會比AUFS快,但還是太年輕傻粘,要謹慎在生產(chǎn)使用每窖。而AUFS做為docker的第一個存儲驅(qū)動,已經(jīng)有很長的歷史弦悉,比較的穩(wěn)定窒典,且在大量的生產(chǎn)中實踐過,有較強的社區(qū)支持稽莉。
轉(zhuǎn)載自:http://dockone.io/article/1511