LXC又名Linux container,是一種虛擬化的解決方案,這種是內核級的虛擬化。(主流的解決方案Xen ,KVM, LXC)
介紹
通過namespace進行資源的隔離,Gust1下的進程與Guset2下的進程是獨立的,可以看作運行在兩台物理機上一樣。Contaniner管理工具就是對Guest進行管理的(創建、銷毀)。
圖是對LXC架構的介紹
下圖是LXC與KVM技術的比較,KVM的優點是一個物理機上可以跑多個操作系統(Guest-OS),然后在每個操作系統運行應用,通過這種方式實現應用的隔離。而使用LXC技術直接可以在Host-OS的基礎上實現隔離的。這就是LXC的優勢--運行快。但是,如果有兩個應用一個是在windows運行的,一個是在linux上運行的,這時只能使用KVM技術來實現了。
namespace
Linux Namespaces機制提供一種資源隔離方案。PID,IPC,Network等系統資源不再是全局性的(在Linux2.6內核以前是全局的),而是屬於特定的Namespace。每個Namespace里面的資源對其他Namespace都是透明的。namespace是container中使用到的重要技術之一,是對系統資源的操作上的隔離。使Guest-OS1的操作對Guest-OS2無法產生影響。
當然namespace的實現還在完善中,下面是3.8以上的內核實現的namespace
Mount
Mount namespace是對掛載的文件系統布局進行隔離。圖中顯示在Namespace1中的進程看到的文件系統的掛載方式是一致的,但是在Mount Namespace2中看到的是一另一種情況
IPC
處於同一namespace下的進程才可以進行進程間通信。
NET
NET NAMESPACE實現網絡協議棧上的隔離,在自己的namespace中對網絡的設置只能在本namespace中生效。
PID
我們通過fork來創建進程時可以為每個進程指定命名空間。linux下的進程關系是一棵樹,所以有了父命名空間和子名字空間之分。
在namespace2創建的P2進程有兩個pid。第一個是在父命名空間的下的它的PID號,一個是在自己空間下的PID號。之所以有父pid號是因為P2最終還是在父命名空間下運行的,而為進程指定命名空間是為了讓P2和P3實現隔離。
USER
User namespace中使用到了map轉換,由於container並不是真正的虛擬化,所以在Guest-OS中創建的root用戶會被映射到Host-OS中的普通用戶中去。
下圖中的例子中,root用戶在自己的namespace下創建了一個文件,那這個文件的所有者ID應該是0,當時在磁盤上存的時候文件UID會被轉換為kuid,並且所有者ID為1000。想說名一點是在Guest-OS下你是個root用戶,但是在Host-OS你只不過被轉為一個普通用戶而已。因為我們知道在Host-OS下已經有一個root用戶了。
system API/ABI
linux下的proc目錄是對整個系統狀態的描述,用戶可以通過查看proc目錄來了解當前的系統狀態。在proc目錄下有很多數字,這些數字對應的是系統創建的進程ID,以前我們說進程是看不見摸不着的,但是通過proc目錄我們的確可以看到一些關於進程的信息。
每個進程下有個ns目錄,在目下記錄了該進程使用的到namespace
clone函數的使用
clone函數是系統的API,是用於創建進程的。我們常用到的fork函數其實底層調用的是clone函數。在使用clone函數的可以為其指定namespace。下面是一個指定IPC名字空間的例子。
p2會運行在新的IPC namespace中,其他namespace會從P1繼承下來
unshare函數
unshare函數用於修改當前的進程的namespace的信息。比如更換當前進程的namespace等等。
setns函數
將當前進程的namespace設置為另一進程的namespace
container管理工具
container與KVM的比較
container並未實現完全虛擬化,在Guest-OS中執行的一些操作會直接影響到HOST-OS。下面是兩者的對比。
參考博文
http://www.ibm.com/developerworks/cn/linux/l-cn-chroot/
http://www.open-open.com/lib/view/open1427350543512.html
http://www.cnblogs.com/wang_yb/p/3923040.html
https://linux.cn/article-5019-1.html
http://blog.csdn.net/preterhuman_peak/article/details/40857117