0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

UnionFS有什么用?AUFS的一些特性

Linux閱碼場(chǎng) ? 來(lái)源:未知 ? 作者:李倩 ? 2018-07-17 18:12 ? 次閱讀

AUFS是一種Union File System,所謂UnionFS就是把不同物理位置的目錄合并mount到同一個(gè)目錄中。UnionFS的一個(gè)最主要的應(yīng)用是,把一張CD/DVD和一個(gè)硬盤(pán)目錄給聯(lián)合 mount在一起,然后,你就可以對(duì)這個(gè)只讀的CD/DVD上的文件進(jìn)行修改(當(dāng)然,修改的文件存于硬盤(pán)上的目錄里)。

AUFS又叫Another UnionFS,后來(lái)叫Alternative UnionFS,后來(lái)可能覺(jué)得不夠霸氣,叫成Advance UnionFS。是個(gè)叫Junjiro Okajima(岡島順治郎)在2006年開(kāi)發(fā)的,AUFS完全重寫(xiě)了早期的UnionFS 1.x,其主要目的是為了可靠性和性能,并且引入了一些新的功能,比如可寫(xiě)分支的負(fù)載均衡。AUFS在使用上全兼容UnionFS,而且比之前的UnionFS在穩(wěn)定性和性能上都要好很多,后來(lái)的UnionFS 2.x開(kāi)始抄AUFS中的功能。但是他居然沒(méi)有進(jìn)到Linux主干里,就是因?yàn)長(zhǎng)inus不讓?zhuān)旧鲜且驗(yàn)榇a量比較多,而且寫(xiě)得爛(相對(duì)于只有3000行的union mount和10000行的UnionFS,以及其它平均下來(lái)只有6000行代碼左右的VFS,AUFS居然有30000行代碼),所以,岡島不斷地改進(jìn)代碼質(zhì)量,不斷地提交,不斷地被Linus拒掉,所以,到今天AUFS都還進(jìn)不了Linux主干(今天你可以看到AUFS的代碼其實(shí)還好了,比起OpenSSL好N倍,要么就是Linus對(duì)代碼的質(zhì)量要求非常高,要么就是Linus就是不喜歡AUFS)。

不過(guò),好在有很多發(fā)行版都用了AUFS,比如:Ubuntu 10.04,Debian6.0, Gentoo Live CD支持AUFS,所以,也OK了。

好了,扯完這些閑話,我們還是看一個(gè)示例吧(環(huán)境:Ubuntu 14.04)

首先,我們建上兩個(gè)目錄(水果和蔬菜),并在這兩個(gè)目錄中放上一些文件,水果中有蘋(píng)果和蕃茄,蔬菜有胡蘿卜和蕃茄。

然后,我們輸入以下命令:

我們可以看到在./mnt目錄下有三個(gè)文件,蘋(píng)果apple、胡蘿卜carrots和蕃茄tomato。水果和蔬菜的目錄被union到了./mnt目錄下了。

我們來(lái)修改一下其中的文件內(nèi)容:

上面的示例,我們可以看到./mnt/apple的內(nèi)容改了,./fruits/apple的內(nèi)容也改了。

上面的示例,我們可以看到,我們修改了./mnt/carrots的文件內(nèi)容,./vegetables/carrots并沒(méi)有變化,反而是./fruits/carrots的目錄中出現(xiàn)了carrots文件,其內(nèi)容是我們?cè)?/mnt/carrots里的內(nèi)容。

也就是說(shuō),我們?cè)趍ount aufs命令中,我們沒(méi)有指它vegetables和fruits的目錄權(quán)限,默認(rèn)上來(lái)說(shuō),命令行上第一個(gè)(最左邊)的目錄是可讀可寫(xiě)的,后面的全都是只讀的。(一般來(lái)說(shuō),最前面的目錄應(yīng)該是可寫(xiě)的,而后面的都應(yīng)該是只讀的)

所以,如果我們像下面這樣指定權(quán)限來(lái)mount aufs,你就會(huì)發(fā)現(xiàn)有不一樣的效果(記得先把上面./fruits/carrots的文件刪除了):

現(xiàn)在,在這情況下,如果我們要修改./mnt/tomato這個(gè)文件,那么究竟是哪個(gè)文件會(huì)被改寫(xiě)?

可見(jiàn),如果有重復(fù)的文件名,在mount命令行上,越往前的就優(yōu)先級(jí)越高。

你可以用這個(gè)例子做一些各種各樣的試驗(yàn),我這里主要是給大家一個(gè)感性認(rèn)識(shí),就不展開(kāi)試驗(yàn)下去了。

那么,這種UnionFS有什么用?

歷史上,有一個(gè)叫Knoppix的Linux發(fā)行版,其主要用于Linux演示、光盤(pán)教學(xué)、系統(tǒng)急救,以及商業(yè)產(chǎn)品的演示,不需要硬盤(pán)安裝,直接把CD/DVD上的image運(yùn)行在一個(gè)可寫(xiě)的存儲(chǔ)設(shè)備上(比如一個(gè)U盤(pán)上),其實(shí),也就是把CD/DVD這個(gè)文件系統(tǒng)和USB這個(gè)可寫(xiě)的系統(tǒng)給聯(lián)合mount起來(lái),這樣你對(duì)CD/DVD上的image做的任何改動(dòng)都會(huì)在被應(yīng)用在U盤(pán)上,于是乎,你可以對(duì)CD/DVD上的內(nèi)容進(jìn)行任意的修改,因?yàn)楦膭?dòng)都在U盤(pán)上,所以你改不壞原來(lái)的東西。

我們可以再發(fā)揮一下想像力,你也可以把一個(gè)目錄,比如你的源代碼,作為一個(gè)只讀的template,和另一個(gè)你的working directory給union在一起,然后你就可以做各種修改而不用害怕會(huì)把源代碼改壞了。有點(diǎn)像一個(gè)ad hoc snapshot。

Docker把UnionFS的想像力發(fā)揮到了容器的鏡像。你是否還記得我在介紹Linux Namespace上篇中用mount namespace和chroot山寨了一鏡像?,F(xiàn)在當(dāng)你看過(guò)了這個(gè)UnionFS的技術(shù)后,你是不是就明白了,你完全可以用UnionFS這樣的技術(shù)做出分層的鏡像來(lái)。

下圖來(lái)自Docker的官方文檔Layer,其很好的展示了Docker用UnionFS搭建的分層鏡像。

關(guān)于docker的分層鏡像,除了aufs,docker還支持btrfs, devicemapper和vfs,你可以使用 -s 或 –storage-driver= 選項(xiàng)來(lái)指定相關(guān)的鏡像存儲(chǔ)。在Ubuntu 14.04下,docker默認(rèn)Ubuntu的 aufs(在CentOS7下,用的是devicemapper,關(guān)于devicemapper,我會(huì)以以后的文章中講解)你可以在下面的目錄中查看相關(guān)的每個(gè)層的鏡像:

在docker執(zhí)行起來(lái)后(比如:docker run -it ubuntu /bin/bash ),你可以從/sys/fs/aufs/si_[id]目錄下查看aufs的mount的情況,下面是個(gè)示例:

你會(huì)看到只有最頂上的層(branch)是rw權(quán)限,其它的都是ro+wh權(quán)限只讀的。

關(guān)于docker的aufs的配置,你可以在/var/lib/docker/repositories-aufs這個(gè)文件中看到。

AUFS的一些特性

AUFS有所有Union FS的特性,把多個(gè)目錄,合并成同一個(gè)目錄,并可以為每個(gè)需要合并的目錄指定相應(yīng)的權(quán)限,實(shí)時(shí)的添加、刪除、修改已經(jīng)被mount好的目錄。而且,他還能在多個(gè)可寫(xiě)的branch/dir間進(jìn)行負(fù)載均衡。

上面的例子,我們已經(jīng)看到AUFS的mount的示例了。下面我們來(lái)看一看被union的目錄(分支)的相關(guān)權(quán)限:

rw表示可寫(xiě)可讀read-write。

ro表示read-only,如果你不指權(quán)限,那么除了第一個(gè)外ro是默認(rèn)值,對(duì)于ro分支,其永遠(yuǎn)不會(huì)收到寫(xiě)操作,也不會(huì)收到查找whiteout的操作。

rr表示real-read-only,與read-only不同的是,rr標(biāo)記的是天生就是只讀的分支,這樣,AUFS可以提高性能,比如不再設(shè)置inotify來(lái)檢查文件變動(dòng)通知。

權(quán)限中,我們看到了一個(gè)術(shù)語(yǔ):whiteout,下面我來(lái)解釋一下這個(gè)術(shù)語(yǔ)。

一般來(lái)說(shuō)ro的分支都會(huì)有wh的屬性,比如 “[dir]=ro+wh”。所謂whiteout的意思,如果在union中刪除的某個(gè)文件,實(shí)際上是位于一個(gè)readonly的分支(目錄)上,那么,在mount的union這個(gè)目錄中你將看不到這個(gè)文件,但是read-only這個(gè)層上我們無(wú)法做任何的修改,所以,我們就需要對(duì)這個(gè)readonly目錄里的文件作whiteout。AUFS的whiteout的實(shí)現(xiàn)是通過(guò)在上層的可寫(xiě)的目錄下建立對(duì)應(yīng)的whiteout隱藏文件來(lái)實(shí)現(xiàn)的。

看個(gè)例子:

假設(shè)我們有三個(gè)目錄和文件如下所示(test是個(gè)空目錄):

我們?nèi)缦耺ount:

現(xiàn)在我們?cè)跈?quán)限為rw的test目錄下建個(gè)whiteout的隱藏文件.wh.apple,你就會(huì)發(fā)現(xiàn)./mnt/apple這個(gè)文件就消失了:

上面這個(gè)操作和 rm ./mnt/apple是一樣的。

相關(guān)術(shù)語(yǔ)

?Branch– 就是各個(gè)要被union起來(lái)的目錄(就是我在上面使用的dirs的命令行參數(shù)

?Branch根據(jù)被union的順序形成一個(gè)stack,一般來(lái)說(shuō)最上面的是可寫(xiě)的,下面的都是只讀的。

?Branch的stack可以在被mount后進(jìn)行修改,比如:修改順序,加入新的branch,或是刪除其中的branch,或是直接修改branch的權(quán)限

?Whiteout和Opaque

?如果UnionFS中的某個(gè)目錄被刪除了,那么就應(yīng)該不可見(jiàn)了,就算是在底層的branch中還有這個(gè)目錄,那也應(yīng)該不可見(jiàn)了。

?Whiteout就是某個(gè)上層目錄覆蓋了下層的相同名字的目錄。用于隱藏低層分支的文件,也用于阻止readdir進(jìn)入低層分支。

?Opaque的意思就是不允許任何下層的某個(gè)目錄顯示出來(lái)。

?在隱藏低層檔的情況下,whiteout的名字是’.wh.’。

?在阻止readdir的情況下,名字是’.wh..wh..opq’或者 ’.wh.__dir_opaque’。

相關(guān)問(wèn)題

看到上面這些,你一定會(huì)有幾個(gè)問(wèn)題:

其一、你可能會(huì)問(wèn),要有文件在原來(lái)的地方被修改了會(huì)怎么樣?mount的目錄會(huì)一起改變嗎?答案是會(huì)的,也可以是不會(huì)的。因?yàn)槟憧梢灾付ㄒ粋€(gè)叫udba的參數(shù)(全稱(chēng):User’s Direct Branch Access),這個(gè)參數(shù)有三個(gè)取值:

udba=none– 設(shè)置上這個(gè)參數(shù)后,AUFS會(huì)運(yùn)轉(zhuǎn)的更快,因?yàn)槟切┎辉趍ount目錄里發(fā)生的修改,aufs不會(huì)同步過(guò)來(lái)了,所以會(huì)有數(shù)據(jù)出錯(cuò)的問(wèn)題。

udba=reval– 設(shè)置上這個(gè)參數(shù)后,AUFS會(huì)去查文件有沒(méi)有被更新,如果有的話,就會(huì)把修改拉到mount目錄內(nèi)。

udba=notify– 這個(gè)參數(shù)會(huì)讓AUFS為所有的branch注冊(cè)inotify,這樣可以讓AUFS在更新文件修改的性能更高一些。

其二、如果有多個(gè)rw的branch(目錄)被union起來(lái)了,那么,當(dāng)我創(chuàng)建文件的時(shí)候,aufs會(huì)創(chuàng)建在哪里呢?aufs提供了一個(gè)叫create的參數(shù)可以供你來(lái)配置相當(dāng)?shù)膭?chuàng)建策略,下面有幾個(gè)例子。

create=rr | round?robin輪詢。下面的示例可以看到,新創(chuàng)建的文件輪流寫(xiě)到三個(gè)目錄中

reate=mfs[:second] | most?free?space[:second]選一個(gè)可用空間最好的分支??梢灾付ㄒ粋€(gè)檢查可用磁盤(pán)空間的時(shí)間。

create=mfsrr:low[:second]選一個(gè)空間大于low的branch,如果空間小于low了,那么aufs會(huì)使用 round-robin 方式。

更多的關(guān)于AUFS的細(xì)節(jié)使用參數(shù),大家可以直接在Ubuntu 14.04下通過(guò)man aufs來(lái)看一下其中的各種參數(shù)和命令。

AUFS的性能

AUFS的性能慢嗎?也慢也不慢。因?yàn)锳UFS會(huì)把所有的分支mount起來(lái),所以,在查找文件上是比較慢了。因?yàn)樗闅v所有的branch。是個(gè)O(n)的算法(很明顯,這個(gè)算法有很大的改進(jìn)空間的)所以,branch越多,查找文件的性能也就越慢。但是,一旦AUFS找到了這個(gè)文件的inode,那后以后的讀寫(xiě)和操作原文件基本上是一樣的。

所以,如果你的程序跑在在AUFS下,open和stat操作會(huì)有明顯的性能下降,branch越多,性能越差,但是在write/read操作上,性能沒(méi)有什么變化。

IBM的研究中心對(duì)Docker的性能給了一份非常不錯(cuò)的性能報(bào)告(PDF)《An Updated Performance Comparison of Virtual Machinesand Linux Containers》

我截了兩張圖出來(lái),第一張是順序讀寫(xiě),第二張是隨機(jī)讀寫(xiě)?;緵](méi)有什么性能損失的問(wèn)題。而KVM在隨機(jī)讀寫(xiě)的情況也就有點(diǎn)慢了(但是,如果硬盤(pán)是SSD的呢?)

順序讀寫(xiě)

隨機(jī)讀寫(xiě)

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11304

    瀏覽量

    209498

原文標(biāo)題:DOCKER基礎(chǔ)技術(shù):AUFS

文章出處:【微信號(hào):LinuxDev,微信公眾號(hào):Linux閱碼場(chǎng)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    斬波器什么用

    斬波器什么用找來(lái)個(gè)東西象電子管的樣子,全金屬封裝,7腳,常州繼電器廠出的。ZB-2-6.3    6.3v/50HZ。不知干什么用的,請(qǐng)教大
    發(fā)表于 11-10 10:28 ?1853次閱讀

    模擬電路的一些簡(jiǎn)單的特性

    準(zhǔn)備分析模擬電路的一些簡(jiǎn)單的特性 偶是本科和研究生都是學(xué)儀器工程的,偶老師在這個(gè)方面也是很厲害的。師兄多人在這個(gè)行業(yè),1人在NI做硬件工程師
    發(fā)表于 11-21 15:13 ?869次閱讀

    GPS天線什么用?

    GPS天線什么用?      天線主要是指GPS接收信號(hào)時(shí)所用的電線是處于接收器什么位置上,如內(nèi)置天線、外置天線、車(chē)載天線等。
    發(fā)表于 01-29 09:33 ?1096次閱讀

    esata接口什么用

    esata接口什么用 簡(jiǎn)單說(shuō)eSATA實(shí)際上就是外置式SATA II規(guī)范,是業(yè)界標(biāo)準(zhǔn)接口Serial ATA(SATA)的延伸。簡(jiǎn)單說(shuō)就是通過(guò)eSATA技術(shù),讓外部I/
    發(fā)表于 03-25 11:05 ?1.8w次閱讀

    智能手環(huán)什么用

    智能手環(huán)是智能硬件中應(yīng)用較多的智能設(shè)備,本文講解智能手環(huán)什么用,從智能手環(huán)品牌以及常規(guī)則功能進(jìn)行介紹。
    發(fā)表于 08-25 19:13 ?7601次閱讀

    一些經(jīng)典的濾波電路介紹

    一些經(jīng)典的濾波電路,興趣的朋友們可以參考參考,若該文檔做違法行為,后果自負(fù)
    發(fā)表于 07-19 17:34 ?0次下載

    智能插座什么用

    本視頻主要詳細(xì)介紹了智能插座什么用,分別是充電、定時(shí)、遙控、監(jiān)測(cè)、電路保護(hù)、照明。
    的頭像 發(fā)表于 02-26 15:43 ?1.1w次閱讀

    折疊屏幕什么用

    在智能機(jī)中,可折疊屏幕的意義在于能夠在維持機(jī)身體積不變的前提下帶來(lái)更大的顯示面積。臺(tái)手機(jī)是手機(jī)也是平板,只需簡(jiǎn)單折疊就能變換形態(tài),科技感十足。那么發(fā)展折疊屏幕什么用呢?
    的頭像 發(fā)表于 03-10 09:41 ?8699次閱讀

    PCB設(shè)計(jì)中開(kāi)窗什么用?如何設(shè)計(jì)?

    我經(jīng)常聽(tīng)到人們說(shuō)在PCB設(shè)計(jì)中開(kāi)窗。什么是開(kāi)窗,PCB設(shè)計(jì)開(kāi)窗什么用,怎么開(kāi)窗?接下來(lái)為您解答。
    發(fā)表于 05-01 16:24 ?2.8w次閱讀

    藍(lán)牙信標(biāo)定位什么用

    藍(lán)牙信標(biāo)定位什么用?
    的頭像 發(fā)表于 07-28 14:11 ?9967次閱讀

    小米機(jī)器狗什么用

    小米機(jī)器狗什么用
    的頭像 發(fā)表于 08-12 09:33 ?1.4w次閱讀

    直流電機(jī)的一些特性

    直流電機(jī)的一些特性(現(xiàn)代電源技術(shù)基礎(chǔ)計(jì)算題)-直流電機(jī)的一些特性,需要的可以參考!
    發(fā)表于 09-15 15:48 ?5次下載
    直流電機(jī)的<b class='flag-5'>一些</b><b class='flag-5'>特性</b>

    解析Armv8.1-M的一些特性

    簡(jiǎn)單闡述下ARMv8.1-M的一些特性,更多的特性及其詳細(xì)信息,請(qǐng)查看Armv8-M Architecture Reference Manual-DDI0553B_m。
    的頭像 發(fā)表于 02-06 10:55 ?1341次閱讀

    鋰電池防爆箱什么用?

    鋰電池防爆箱什么用
    的頭像 發(fā)表于 07-02 15:17 ?1782次閱讀
    鋰電池防爆箱<b class='flag-5'>有</b><b class='flag-5'>什么用</b>?

    pcb仿真技術(shù)什么用

    pcb仿真技術(shù)什么用
    的頭像 發(fā)表于 11-28 15:22 ?1125次閱讀