1. 程式人生 > >Linux中的namespace資源隔離【待不停補充】

Linux中的namespace資源隔離【待不停補充】

Linux中的namespace資源隔離(仍在學習中,不斷補充)

1. Linux中提供的六種namespace隔離

2. Linux中呼叫以上六種隔離的具體操作:

(1)clone()

clone(),使用clone可以在建立一個新的程序的同時,來建立新的namespace,使用方法如下:

int clone(int (*child_func)(void *), void *child_stack, int flags, void *arg);  
  • 引數child_func傳入子程序執行的程式主函式。
  • 引數child_stack傳入子程序使用的棧空間
  • 引數flags表示使用哪些CLONE_*標誌位
  • 引數args則可用於傳入使用者引數

(2)sents()

使用sents可以將程序從原先的namespace,加入到一個新建好的namespace

Int  setns(int fd, int nstype);
  • 引數fd表示我們要加入的namespace的檔案描述符
  • 引數nstyle表示是否檢查指向的namespace符合我們的實際要求,如果寫0則表示不檢查  

(3)unshare()

不啟動新程序就可以起到隔離的效果,相當於跳出了原先的namespace進行操作。這個方法在Docker中沒有被使用過。

(4)unshare()和setns()在PID namespace中的特別之處:

在PID中,無論呼叫unshare還是sentc,其呼叫者都不會和其他的namespace一樣進入新的PID namespace。因為在程序建立之後,其PID被認為是一個常量,不能被變更。

3. 六種NameSpace隔離的具體說明

(1)UTS namespace

UTS namespace 提供了主機名和域名之間的隔離,Docker中使用這種隔離,為每個Docker容器配 置獨立的主機名和域名。

(2)IPC namespace

提供了程序之間通訊的資源的隔離,其中包括訊號量、訊息佇列、共享記憶體等在同一個IPC namespace下的程序彼此可見,而不同的IPCnamespace下的程序相互不可見。

(3)PID namespace

對程序的PID重新標號,使得在不通namespace下的程序可以有相同的PID。

(4)Mount namespace

通過隔離檔案系統掛載點對隔離檔案系統提供支援,在建立新的mount namespace時,會把當前的檔案結構複製給新的namespace,其中的所有操作都不會對外界產生任何影響。

但是這樣的方法太過嚴格,父程序的很多操作在掛載的過程中容易受到影響,例如CD等,因此引入了掛載傳播,其中有共享關係、從屬關係等。掛載的具體型別可以分為:共享掛載、從屬掛載、共享掛載、私有掛載、不可繫結掛載。如下圖所示,為Linux系統中的常用的掛載情況

(5)network namespace

主要提供了關於網路資源的隔離,包括網路裝置、IPV4和IPV6協議、IP路由表、套接字等。一個物理網路裝置最多存在於一個network namespace中,可以通過建立veth pair在不通的network namespace間建立通道,以達到通訊的目的。

容器額經典做法就是建立一個veth pair,一端放置在新的namespace中,通常命名為eth0,一端放在原先的namespace中連線物理網路裝置,再通過把多個裝置接入網橋或者進行路由轉發來實現通訊 的目的。具體結構入下圖所示:

在veth pair建立之前,新舊namespace通過pipe(管道)進行通訊,知道veth裝置啟動起來之後,管道才會關閉起來,並且結束初始化狀態。

(6)User namespace

主要隔離了安全相關的識別符號和屬性,例如使用者ID、使用者組ID、root目錄以及特 殊許可權。通俗來講,相當於一個普通使用者的程序在建立新的程序時,可以擁有不同的使用者和使用者組,相當於沒有特權的普通使用者也可以建立擁有超級許可權的程序。這一方式給了容器很大的自由,但是由於安全問題,在很多版本的linux系統中並不支援。