Linux Namespaces機制

轉自:http://www.cnblogs.com/lisperl/archive/2012/05/03/2480316.htmlhtml

Linux Namespaces機制提供一種資源隔離方案。PID,IPC,Network等系統資源再也不是全局性的,而是屬於特定的Namespace。每一個Namespace裏面的資源對其餘Namespace都是透明的。要建立新的Namespace,只須要在調用clone時指定相應的flag。Linux Namespaces機制爲實現基於容器的虛擬化技術提供了很好的基礎,LXC(Linux containers)就是利用這一特性實現了資源的隔離。不一樣container內的進程屬於不一樣的Namespace,彼此透明,互不干擾。下面咱們就從clone系統調用的flag出發,來介紹各個Namespace。網絡

當調用clone時,設定了CLONE_NEWPID,就會建立一個新的PID Namespace,clone出來的新進程將成爲Namespace裏的第一個進程。一個PID Namespace爲進程提供了一個獨立的PID環境,PID Namespace內的PID將從1開始,在Namespace內調用fork,vfork或clone都將產生一個在該Namespace內獨立的PID。新建立的Namespace裏的第一個進程在該Namespace內的PID將爲1,就像一個獨立的系統裏的init進程同樣。該Namespace內的孤兒進程都將以該進程爲父進程,當該進程被結束時,該Namespace內全部的進程都會被結束。PID Namespace是層次性,新建立的Namespace將會是建立該Namespace的進程屬於的Namespace的子Namespace。子Namespace中的進程對於父Namespace是可見的,一個進程將擁有不止一個PID,而是在所在的Namespace以及全部直系祖先Namespace中都將有一個PID。系統啓動時,內核將建立一個默認的PID Namespace,該Namespace是全部之後建立的Namespace的祖先,所以系統全部的進程在該Namespace都是可見的。socket

當調用clone時,設定了CLONE_NEWIPC,就會建立一個新的IPC Namespace,clone出來的進程將成爲Namespace裏的第一個進程。一個IPC Namespace有一組System V IPC objects 標識符構成,這標識符有IPC相關的系統調用建立。在一個IPC Namespace裏面建立的IPC object對該Namespace內的全部進程可見,可是對其餘Namespace不可見,這樣就使得不一樣Namespace之間的進程不能直接通訊,就像是在不一樣的系統裏同樣。當一個IPC Namespace被銷燬,該Namespace內的全部IPC object會被內核自動銷燬。spa

PID Namespace和IPC Namespace能夠組合起來一塊兒使用,只需在調用clone時,同時指定CLONE_NEWPID和CLONE_NEWIPC,這樣新建立的Namespace既是一個獨立的PID空間又是一個獨立的IPC空間。不一樣Namespace的進程彼此不可見,也不能互相通訊,這樣就實現了進程間的隔離。htm

當調用clone時,設定了CLONE_NEWNS,就會建立一個新的mount Namespace。每一個進程都存在於一個mount Namespace裏面,mount Namespace爲進程提供了一個文件層次視圖。若是不設定這個flag,子進程和父進程將共享一個mount Namespace,其後子進程調用mount或umount將會影響到全部該Namespace內的進程。若是子進程在一個獨立的mount Namespace裏面,就能夠調用mount或umount創建一份新的文件層次視圖。該flag配合pivot_root系統調用,能夠爲進程建立一個獨立的目錄空間。blog

當調用clone時,設定了CLONE_NEWNET,就會建立一個新的Network Namespace。一個Network Namespace爲進程提供了一個徹底獨立的網絡協議棧的視圖。包括網絡設備接口,IPv4和IPv6協議棧,IP路由表,防火牆規則,sockets等等。一個Network Namespace提供了一份獨立的網絡環境,就跟一個獨立的系統同樣。一個物理設備只能存在於一個Network Namespace中,能夠從一個Namespace移動另外一個Namespace中。虛擬網絡設備(virtual network device)提供了一種相似管道的抽象,能夠在不一樣的Namespace之間創建隧道。利用虛擬化網絡設備,能夠創建到其餘Namespace中的物理設備的橋接。當一個Network Namespace被銷燬時,物理設備會被自動移回init Network Namespace,即系統最開始的Namespace。接口

當調用clone時,設定了CLONE_NEWUTS,就會建立一個新的UTS Namespace。一個UTS Namespace就是一組被uname返回的標識符。新的UTS Namespace中的標識符經過複製調用進程所屬的Namespace的標識符來初始化。Clone出來的進程能夠經過相關係統調用改變這些標識符,好比調用sethostname來改變該Namespace的hostname。這一改變對該Namespace內的全部進程可見。CLONE_NEWUTS和CLONE_NEWNET一塊兒使用,能夠虛擬出一個有獨立主機名和網絡空間的環境,就跟網絡上一臺獨立的主機同樣。進程

以上全部clone flag均可以一塊兒使用,爲進程提供了一個獨立的運行環境。LXC正是經過在clone時設定這些flag,爲進程建立一個有獨立PID,IPC,FS,Network,UTS空間的container。一個container就是一個虛擬的運行環境,對container裏的進程是透明的,它會覺得本身是直接在一個系統上運行的。資源

一個container就像傳統虛擬化技術裏面的一臺安裝了OS的虛擬機,可是開銷更小,部署更爲便捷。路由

做者曰:Linux Namespaces機制自己就是爲了實現container based virtualizaiton開發的。它提供了一套輕量級、高效率的系統資源隔離方案,遠比傳統的虛擬化技術開銷小,不過它也不是完美的,它爲內核的開發帶來了更多的複雜性,它在隔離性和容錯性上跟傳統的虛擬化技術比也還有差距。

相關文章
相關標籤/搜索