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