Linux overlay文件系統(tǒng)解析

一個 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)如下:


image

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)盗飒。


image

這里說明一下嚷量,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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末瀑志,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子污秆,更是在濱河造成了極大的恐慌劈猪,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件良拼,死亡現(xiàn)場離奇詭異岸霹,居然都是意外死亡,警方通過查閱死者的電腦和手機将饺,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進店門贡避,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人予弧,你說我怎么就攤上這事刮吧。” “怎么了掖蛤?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵杀捻,是天一觀的道長。 經(jīng)常有香客問我蚓庭,道長致讥,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任器赞,我火速辦了婚禮垢袱,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘港柜。我一直安慰自己请契,他們只是感情好咳榜,可當(dāng)我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著爽锥,像睡著了一般涌韩。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上氯夷,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天臣樱,我揣著相機與錄音,去河邊找鬼腮考。 笑死擎淤,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的秸仙。 我是一名探鬼主播,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼桩盲,長吁一口氣:“原來是場噩夢啊……” “哼寂纪!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起赌结,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤捞蛋,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后柬姚,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體拟杉,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年量承,在試婚紗的時候發(fā)現(xiàn)自己被綠了搬设。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡撕捍,死狀恐怖拿穴,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情忧风,我是刑警寧澤默色,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站狮腿,受9級特大地震影響腿宰,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜缘厢,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一吃度、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧贴硫,春花似錦规肴、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽删壮。三九已至,卻和暖如春兑牡,著一層夾襖步出監(jiān)牢的瞬間央碟,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工均函, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留亿虽,地道東北人。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓苞也,卻偏偏與公主長得像洛勉,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子如迟,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,916評論 2 344

推薦閱讀更多精彩內(nèi)容

  • 上一次在單位吃早餐是什么時候收毫?想不起來。似乎今天是今年以來的第一次殷勘,以往總是來不及此再。 食堂在單位樓下。要想在食堂吃...
    ciweinan閱讀 290評論 1 2
  • 第二章 神秘任務(wù) 比克雖騎上了霸王龍,但這只“坐騎”似乎仍有些不順人意,在叢林里盲目地到處亂跑待笑。比克心生一計翰苫,從樹...
    那天雨中的一陣光明閱讀 147評論 0 0
  • 讀《小學(xué)語文課堂教學(xué)亮點》 第一輯:破題開篇辦法多 閱讀感悟: 1,教學(xué)就是在教師的引導(dǎo)下,學(xué)生的身心素質(zhì)獲得提升...
    呂紅娟閱讀 644評論 0 0
  • 代碼實現(xiàn)效果 無序列表 f e 有序列表 1.one2.two3.three 文字鏈接 堅守[www.baidu....
    kongjn閱讀 179評論 0 0