胡浩
摘 要:MNT名字空間是一個(gè)強(qiáng)大而靈活的工具,用于創(chuàng)建每個(gè)用戶和每個(gè)容器的文件系統(tǒng)樹。MNT名字空間提供了高度的隔離性,然而在不同的容器間也需要適度的共享掛載點(diǎn)或硬件設(shè)備,MNT名字空間的共享子樹技術(shù)很好的適應(yīng)了這種需求,它允許在MNT名字空間之間以自動(dòng)控制的方式傳播掛載和卸載事件。
關(guān)鍵詞:MNT名字空間;;共享子樹
1MNT名字空間
MNT名字空間是一種隔離技術(shù),這種技術(shù)隔離名字空間中進(jìn)程所看到的掛載點(diǎn)列表。每個(gè)MNT名字空間都有自己的掛載點(diǎn)列表,這意味著不同名字空間具有不同的目錄結(jié)構(gòu)視圖。系統(tǒng)默認(rèn)創(chuàng)建初始MNT名字空間,帶有CLONE_NEWNS標(biāo)記fork()或unshare()系統(tǒng)調(diào)用創(chuàng)建新的MNT名字空間【1】。創(chuàng)建新的MNT名字空間時(shí)將復(fù)制從調(diào)用方的名字空間的掛載點(diǎn)列表。fork()和unshare()執(zhí)行后,可以在每個(gè)名字空間通過mount()和umount()獨(dú)立的添加和刪除掛載點(diǎn),默認(rèn)情況下,對(duì)掛載點(diǎn)列表的更改僅對(duì)進(jìn)程所在的MNT名字空間中的進(jìn)程可見;這些更改在其他MNT名字空間中不可見。MNT名字空間有多種用途。它們可以為每個(gè)用戶提供不同的文件系統(tǒng)視圖。其他用途包括為PID名字空間掛載/proc文件系統(tǒng),fork()時(shí)同時(shí)創(chuàng)建PID名字空間(CLONE_NEWPID)和MNT名字空間(CLONE_NEWN),在MNT名字空間掛載/proc文件系統(tǒng)不會(huì)影響主機(jī)的/proc文件系統(tǒng)【3】。另外,MNT名字空間也可與綁定掛載配合使用。
2共享子樹
MNT名字空間的一個(gè)缺點(diǎn)是只提供絕對(duì)的隔離而缺乏共享,假設(shè)加載光盤驅(qū)動(dòng)器,使光盤驅(qū)動(dòng)器在所有MNT名字空間中可見的唯一方法是在每個(gè)名字空間中分別掛載,系統(tǒng)中可能有數(shù)十個(gè)不同MNT名字空間,若其用戶都需要訪問光盤驅(qū)動(dòng)器,則分別在數(shù)十個(gè)不同MNT名字空間逐個(gè)掛載是非常繁瑣的事情,最好是執(zhí)行一次掛載操作,使光盤驅(qū)動(dòng)器在系統(tǒng)上所有MNT名字空間中可見。
共享子樹技術(shù)可以解決上述問題,其主要優(yōu)點(diǎn)是允許在名字空間之間自動(dòng)、受控地傳播掛載和卸載事件。在一個(gè)MNT名字空間中掛載光盤驅(qū)動(dòng)器,所有其他名字空間會(huì)自動(dòng)觸發(fā)光盤驅(qū)動(dòng)器的掛載。在共享子樹特性下,每個(gè)掛載點(diǎn)都被標(biāo)記為一種“傳播類型”,該類型決定了掛載點(diǎn)下創(chuàng)建和刪除的掛載點(diǎn),相應(yīng)的掛載事件是否傳播到其他掛載點(diǎn)。每個(gè)掛載點(diǎn)可以設(shè)置四種不同的傳播類型:
(1)設(shè)置掛載點(diǎn)為MS_SHARED傳播類型,此掛載點(diǎn)與其“對(duì)等組”成員的其他掛載點(diǎn)共享掛載和卸載事件。當(dāng)在此掛載點(diǎn)下添加或移除掛載點(diǎn)時(shí),此更改將傳播到對(duì)等組,因此掛載或卸載也將在每個(gè)對(duì)等掛載點(diǎn)下進(jìn)行。對(duì)等組內(nèi)的其他成員也具有相同的特性。
(2)設(shè)置掛載點(diǎn)為MS_PRIVATE傳播類型,這和MS_SHARED傳播類型剛好相反。掛載點(diǎn)不會(huì)將事件傳播到任何對(duì)等點(diǎn),也不會(huì)接收來自任何對(duì)等點(diǎn)的傳播事件。
(3)設(shè)置掛載點(diǎn)為MS_SLAVE傳播類型,此傳播類型位于共享和私有之間。多個(gè)從掛載點(diǎn)(Slave)和一個(gè)主掛載點(diǎn)(Master)形成一個(gè)共享的對(duì)等組,主掛載點(diǎn)將掛載和卸載事件傳播到從掛載點(diǎn)。但是,從掛載點(diǎn)不會(huì)將事件傳播到主掛載點(diǎn)。
(4)設(shè)置掛載點(diǎn)為MS_UNBINDABLE傳播類型,此掛載點(diǎn)不可綁定和復(fù)制。與私有掛載點(diǎn)一樣,此掛載點(diǎn)不傳播掛載事件。此外,這個(gè)掛載點(diǎn)不能作為綁定掛載操作的源,此掛載也不可被復(fù)制。
傳播類型是在每個(gè)掛載點(diǎn)設(shè)置。在名字空間中,某些掛載點(diǎn)可能被標(biāo)記為共享,而其他掛載點(diǎn)則標(biāo)記為私有(或從屬或不可綁定)。傳播類型決定掛載和卸載事件的傳播。因此,如果在共享掛載下,X創(chuàng)建一個(gè)子掛載Y,該子掛載將傳播到對(duì)等組中的其他掛載點(diǎn)。但是,X的傳播類型對(duì)于在Y下創(chuàng)建和刪除的掛載點(diǎn)沒有影響,Y下的事件是否傳播取決于為Y定義的傳播類型。類似地,卸載事件是否會(huì)在卸載時(shí)傳播取決于X的父掛載的傳播類型。這里的“事件”是一個(gè)抽象的術(shù)語(yǔ),意思是“發(fā)生了什么事情”。事件傳播的概念并不意味著在掛載點(diǎn)之間傳遞某種消息。在一個(gè)掛載點(diǎn)上的掛載或卸載操作會(huì)觸發(fā)一個(gè)或多個(gè)其他掛載點(diǎn)的匹配操作,在代碼的具體的實(shí)現(xiàn)上,事件的傳播是掛載的復(fù)制【1】。
最后,一個(gè)掛載點(diǎn)可以同時(shí)是從節(jié)點(diǎn)(MS_SLAVE)和共享掛載(MS_SHARED)【2】。在這種情況下,掛載事件可能會(huì)從主掛載點(diǎn)傳到從掛載點(diǎn),然后從掛載點(diǎn)又將這些事件傳播到它的共享對(duì)等組中的成員。
參考文獻(xiàn):
[1]《深入Linux內(nèi)核架構(gòu)》郭旭譯人民郵電出版社2010年6月第一版
[2]《Docker容器與容器云》浙江大學(xué)SEL實(shí)驗(yàn)室人民郵電出版社2016年10月第二版
[3]《Docker進(jìn)階與實(shí)戰(zhàn)》華為Docker實(shí)踐小組機(jī)械工業(yè)出版社2016年7月第一版