Linux Containers,Linux的容器,容器嘛,可以想象成一個大的裝東西的罐子,罐子口很大,里面可以裝很多同樣形狀,只不過大小不同的小罐子。專業的話,叫做基於容器的操作系統層面的虛擬化技術。
在這個大的容器里面,可以裝很多小的容器,每一個容器都具備完整的運行環境,如特定的CPU、memory節點、可分配的cpu時間,IO時間,受限的內存大小(包括內存和SWAP),提供對底層設備的訪問,擁有獨立的namespace(網絡、pid、ipc、mmt和uts)。
LXC項目地址:https://linuxcontainers.org/
LXC在github上的地址:https://github.com/lxc/lxc
一個LXC的實例,我們稱之為container,類比於PC機器上面的Virtual Box和Vmware。
LXC具體組成
LXC項目在Sourceforge上面的,它有一個Linux內核補丁和一些用戶空間的工具組成,其中內核補丁提供底層新特性,上層工具使用這些新特性,提供一套簡化的工具來維護容器。
LXC在資管管理方面,依賴與Linux內核密切相關的Cgroups子系統,這個子系統是Linux內核提供的一個基於進程組的資源管理框架,可以為特定的進程組限定可以使用的資源,借助cgroups子系統,在當前Linux環境下,實現一個輕量化的虛擬機。
LXC在隔離控制方面,依賴於Linux內核提供的namespace特性,具體來說,就是在clone的時候加入相應的flag。
LXC的優勢
LXC是操作系統層面的虛擬化技術,與傳統的HAL層次的虛擬化技術相比,有以下優勢:
1. 更小的虛擬化開銷。LXC的諸多特性基本有內核提供
2. 快速部署。只需要安裝LXC,就可以利用LXC的相關命令來創建並且啟動容器,為應用提供虛擬執行環節。而傳統的虛擬化技術,需要先創建虛擬機,然后安裝系統,再部署應用。
3. 虛擬機的rootfs就在/var/lib/lxc/container_name ,可以在宿主機上輕松修改container的文件系統。
4. LXC使用apparmor,應用程序訪問控制系統來確保主機不受容器內實例的惡意行為。
LXC的缺點
1. 缺少對磁盤限額(disk quota)的支持,目前使用LVM來限定支持。
2. 缺少對寫時復制(copy on write)的支持,對於每個容器來說,都是一份操作系統的用戶態實例,都有屬於自己的系統庫函數文件等必需文件。在一個系統有多個容器的情況下,這會造成磁盤空間的浪費。這里可以借鑒寫時復制的概念,對於容器共用的文件,在沒有對共享文件進行寫入之前,可以只保存一份拷貝,其他容器采用硬鏈接的方式來共享,當有容器對共享文件進行寫入時,為其單獨創建一份拷貝。
3. 進程和容器之間的動態關聯還不夠完善
理想情況下,進程和容器之間是動態關聯的,進程可以在容器之間遷移。在LXC中,資源管理是通過cgroups實現的,進程可以在cgroup之間有條件的遷移。命名空間的隔離是通過namespace實現的,目前內核只支持進程變更有限的幾類命名空間。
4. 不支持checkpoint
checkpoint技術可以將容器中所有的進程暫時frozen,將當時容器完整的狀態存儲在磁盤上,類似於Vmware的snapshot,目前LXC不支持checkpoint技術,只是借助cgroups的freezer子系統,將進程暫時frozen和resume,沒有完整的存儲容器的狀態。
5. 不支持容器的動態遷移
動態遷移是指將正在運行的容器從一個機器上遷移到另一個機器上,在此過程中,容器中的進程無需停止,此項技術可以用來優化服務器集群的資源配置。目前LXC不支持動態遷移。
LXC安裝使用
在Ubuntu系統下,可以使用apt命令來安裝或者使用源碼來安裝,建議使用apt來安裝,這種方式在安裝過程中會自動安裝LXC所依賴的其他軟件.
在正確使用lxc之前,需要對其配置文件進行簡單的介紹,以便更好的理解LXC的工作原理.
a. /etc/lxc/lxc.conf 創建lxc容器的時候默認使用的配置文件,默認內容如下。
b. /usr/lib/lxc/templates/ 該目錄保存當前LXC支持的各種發行版本的Linux模板配置文件
c. /var/lib/lxc/ 該目錄存放每個創建的容器實例,只有root用戶才有權限訪問其內容
d. /var/cache/lxc 該目錄存放容器實例的cache,加快容器實例創建速度。
LXC根據容器類型的不同而有所不同,一種是系統容器,一種是應用程序容器。系統容器類似於虛擬機,
lxc-start –n name init ,運行init程序。
應用程序容器只是創建用於隔離一個應用程序的單獨的命名空間,類似的命令,lxc-execute –n name cmd
LXC常用命令
1. lxc-checkconfig 用於判斷Linux內核是否支持LXC
2. lxc-create 用於創建一個容器
lxc-create –n name [ –f config_file ]
name 創建的容器名稱
config_file 容器配制文件的路徑
備注: 容器名稱是全局的,也就是說,系統不允許存在重名的容器。lxc-create創建的容器,在停止運行后,不會自動銷毀。
3. lxc-destroy 用於銷毀一個容器
4. lxc-execute 用於在一個容器執行應用程序
lxc-execute –n name [ –f config_file] [ –s KEY=VAL ] command
name 容器名稱
config_file 容器配制文件路徑
-s 后面跟配制鍵值對 例如 lxc.cgroup.cpu.shares = 512
command 待執行的命令
備注:如果不存在name容器,lxc-execute會自動創建一個,容器停止運行后會自動銷毀。
執行過程中,有限選用 –f 指定的配置文件參數。 -s選項可以特別改變配置文件中的某一項參數值。
lxc-execute 先創建lxc-init進程,然后在lxc-init中fork一個進行來執行命令,常用於在容器中執行應用程序。
5. lxc-start 用於在容器中執行給定命令
lxc-start –n name [-f config_file ] [-c console_file ] [-d] [-s KEY=VAL] [command]
-d : 將容器當做守護進程執行
-c : 指定一個文件作為容器的控制台輸出,默認為終端
備注:如果容器還不存在,lxc-start會自動創建一個,容器停止允許后會自動銷毀。它是直接創建進程來運行命令。
lxc-start 用於在容器中啟動system
6. lxc-kill 用於發送信號給容器中的第一個用戶進程(容器內部進程號為1的為init,進程號為2的為第一個用戶進程),默認信號為SIGKILL。
lxc-kill –n name [SIGNUM]
7. lxc-stop 用於停止容器中所有的進程
lxc-stop –n name
8. lxc-destroy 用於銷毀容器
lxc-destroy –n name
9. 其他命令,等到需要的時候再補充。
使用上述命令,需要root權限來執行。
在成成的虛擬機容器中,有config配置文件,可以在里面添加針對這個虛擬機的各種資源限制范圍。
經驗總結
1. 創建虛擬機,需要以root權限來創建和執行上述相關的命令
2. 當嘗試在容器中執行命令出現如下錯誤時,
由於LXC采用cgroup對容器進行資源管理,在實際使用lxc之前,必須執行mount none –t cgroup /cgroup 來掛載cgroup系統,或者將此命令寫到/etc/fstab中,讓系統每次啟動時,自動掛載cgroup。
解決方法: https://groups.google.com/forum/#!topic/ns-3-users/brjBDmGU4PE
Cgroup部分的配置都是以lxc.cgroup.[subsystem name].key=value的形式出現的.例如:
lxc.cgroup.cpu.shares=512
lxc.cgroup.cpuset.cpus=1.2
cgroup下面有cpu子系統、cpuset子系統、memory子系統、blkio子系統、network部分、rootfs部分這些來設置。