LXC 自kernel 2.6.27 加入linux 內核,依賴Linux 內核的cgroup和namespace功能而實現,非常輕量級,設計用於操作系統內部應用級別的隔離。
不同於vmware,kvm等虛擬化技術,它是一種類似chroot的技術,非常的輕量級。
與傳統的硬件虛擬化技術相比有以下優勢:
a、更小的虛擬化開銷。 Linux內核本身是一個很好的硬件資源調度器,LXC的諸多特性基本由內核提供,而內核實現這些特性只有極少的花費,CPU,內存,硬盤都是直接使用。 b、更快的啓動速度。 lxc容器技術將操作系統抽象到了一個新的高度。直接從init啓動,省去了硬件自檢、grub引導、加載內核、加載驅動等傳統啓動項目,因此啓動飛速。 c、更快速的部署。 lxc與帶cow特性的後端文件系統相結合,一旦建好了模板,利用快照功能,半秒鐘即可實現克隆一臺lxc虛擬機。LXC虛擬機本質上只是宿主機上的一個目錄,這也爲備份和遷移提供了極大便利。 d、更高內存使用效率。 普通虛擬機一般會獨佔一段內存,即使閒置,其他虛擬機也無法使用,例如KVM。而容器可以只有一個內存上限,沒有下限。如果它只使用1MB內存,那麼它只佔用宿主機1MB內存。宿主機可以將富餘內存作爲他用。
LXC 目前已經比較成熟,官方在2014年2月推出1.0版本後就開始了長期維護,目前最新版本已經是1.07,CentOS 從6.5 開始支持LXC技術。
將LXC投入生產環境完全沒有問題,因爲LXC並不是什麼新技術,而是重新聚合了已經成熟了的技術。
環境CentOS 6.5 x64
1、安裝LXC
yum install libcgroup lxc lxc-templates --enablerepo=epel /etc/init.d/cgconfig start /etc/init.d/lxc start
2、檢查環境
lxc-checkconfig
輸出如下即是OK
Kernel configuration not found at /proc/config.gz; searching... Kernel configuration found at /boot/config-2.6.32-431.1.2.0.1.el6.x86_64 --- Namespaces --- Namespaces: enabled Utsname namespace: enabled Ipc namespace: enabled Pid namespace: enabled User namespace: enabled Network namespace: enabled Multiple /dev/ptsinstances: enabled --- Control groups--- Cgroup: enabled Cgroup namespace: enabled Cgroup device: enabled Cgroup sched: enabled Cgroup cpu account: enabled Cgroup memory controller: enabled Cgroup cpuset: enabled --- Misc --- Veth pair device: enabled Macvlan: enabled Vlan: enabled File capabilities: enabled Note : Before booting a new kernel, you can check its configuration usage : CONFIG=/path/to/config/usr/bin/lxc-checkconfig
/usr/share/lxc/templates/ 自帶了常用的模板可供選擇,debian/ubuntu,centos/redhat 都有。
3、使用模板安裝一個centos 6 虛擬機
lxc-create -n vm01 -t centos
或者
lxc-create -n vm01 -t download -- -d centos -r 6 -a amd64
安裝後,虛擬機默認位於/var/lib/lxc/vm01/rootfs,配置文件爲/var/lib/lxc/vm01/config
download模板默認在官網倉庫(http://images.linuxcontainers.org/)裏下載鏡像,速度比較慢,可以指定使用國內的鏡像源
lxc-create -n vm01 -t download -- -d centos -r 6 -a amd64 --server mirrors.tuna.tsinghua.edu.cn/lxc-images
a、如果你係統裏恰好有個lvm VG 名字叫做lxc,那麼lxc會識別到,加上一個參數 -B lvm,創建的虛擬機配置文件依然是/var/lib/lxc/vm01/config,但是lxc鏡像會在/dev/lxc/vm01 這個LV 上 (默認500M大小);
示例:
lxc-create -n vm01 -t centos -B lvm --thinpool --fssize 250G --fstype xfs
上面的命令將會在lvm上創建一個lv,名爲vm01,最大容量250G(因爲加了thinpool參數,用多少佔多少),文件系統是xfs。
b、如果你的/var 單獨分區,恰好使用的是btrfs文件系統,lxc也會識別,創建lxc容器時自動創建子卷,並將容器鏡像放在裏面;
4、lxc容器
打開lxc容器並進入開機console,
lxc-start -n vm01
在後臺運行容器,並通過console連接過去 (使用ctrl+a+q退出console)
lxc-start -n vm01 -d lxc-console -n vm01
查看lxc容器相關信息(名稱、是否在運行、PID,CPU使用、IO使用、內存使用、IP地址、網絡吞吐量)
lxc-info -n vm01
監視lxc容器的資源使用
lxc-top
5、配置容器網絡,
新版lxc自帶一個橋接lxcbr0 (10.0.3.1),物理網卡通過NAT橋接到lxcbr0 ,網段爲10.0.3.0/24。
如果上面新創建的虛擬機啓動失敗,很可能是lxcbr0 沒有啓動。
編輯文件/var/lib/lxc/vm01/config,確保文件包含一下內容
lxc.network.type= veth lxc.network.link = lxcbr0 lxc.network.flags = up lxc.network.name = eth0 lxc.network.ipv4 = 10.0.3.2/24 lxc.network.ipv4.gateway = 10.0.3.1
如果需要第二塊網卡,則繼續在/var/lib/lxc/vm01/config添加一組配置
lxc.network.type = veth lxc.network.link = lxcbr0 lxc.network.flags = up lxc.network.name = eth1 lxc.network.ipv4 = 10.0.3.3/24
容器網絡默認由dnsmasq分配,如果沒有在lxc中指定,則由容器內部dhcp獲得。
veth依賴網卡橋接,且可以與任何機器(宿主機,其他虛擬機,局域網其他機器)通訊。
在網絡層,可以採取下面的方式加固安全:
如果要隔絕容器與宿主機的通訊(容器之間可以通信,與局域網其他機器也可以通信),網卡可選擇macvlan中的bridge模式
lxc.network.type = macvlan lxc.network.macvlan.mode = bridge lxc.network.flags = up lxc.network.link = eth0
如果要進一步隔離同一宿主機上不同容器之間的通訊(僅可與局域網其他機器通信),網卡要選擇macvlan中的vepa模式
lxc.network.type = macvlan lxc.network.macvlan.mode = vepa lxc.network.flags = up lxc.network.link = eth0
下面是三種特殊的網絡
lxc.network.type = none
none表示停用網絡空間的namespace,複用宿主機的網絡。
據說關閉容器也會關閉宿主機,ubuntu phone通過lxc裏的安卓容器,使用網絡複用達到兼容安卓應用的目的。(個人沒有測試通過)
lxc.network.type = empty
empty表示容器沒有網卡,僅有一個迴環lo,無法通過網絡層與外部通信。用於某些特殊的場合。比如將宿主機的某個圖片目錄掛載到容器裏,容器利用有限的資源對圖片進行處理,如果放在宿主機上處理,圖片處理佔用的資源可能不好控制,影響整體性能。
lxc.network.type = vlan
這種模式需要上聯的物理交換機支持,用不同的vlan id 隔離容器與宿主機之間的通信。
6、調整容器的配置參數
容器默認與宿主機共享硬件資源,CPU,內存,IO等,也可以用cgroup實現資源隔離。
直接使用命令可動態調整容器的資源,重啓後失效
#設置虛擬機只使用0,1兩個CPU核心 lxc-cgroup -n centos cpuset.cpus 0,1 #設置虛擬機可用內存爲512M lxc-cgroup -n centos memory.limit_in_bytes 512M #設置虛擬機消耗的CPU時間 lxc-cgroup -n centos cpu.shares 256 #設置虛擬機消耗的IO權重 lxc-cgroup -n centos blkio.weight 500
另一種限制資源的方法是將具體的限制寫入虛擬機的配置文件,可選的參數如下:
#設置虛擬機只使用0,1兩個CPU核心 lxc.cgroup.cpuset.cpus = 0,1 #設置虛擬機消耗的CPU時間 lxc.cgroup.cpu.shares = 256 #設置虛擬機可用內存爲512M lxc.cgroup.memory.limit_in_bytes = 512M #限制虛擬機可用的內存和swap空間一共1G lxc.cgroup.memory.memsw.limit_in_bytes = 1G #設置虛擬機可使用的IO權重 lxc.cgroup.blkio.weight=500
設置容器開機啓動
lxc.start.auto = 1 #開機自動啓動 lxc.start.delay = 5 #延遲5秒開機,防止容器併發啓動造成宿主機過載
7、安裝ubuntu 12.04
LXC強大到有點變態,在centos上運行ubuntu?沒錯,因爲內核對於LInux發行版來說是通用的。
lxc-create -n ubuntu -t ubuntu -- -r precise
或者加上MIRROR參數(僅適用於ubuntu,用於選擇較近的軟件源)
MIRROR="http://cn.archive.ubuntu.com/ubuntu" lxc-create -n ubuntu-test -t ubuntu -- -r precise
點到爲止,不深入。
8、容器克隆
你可以創建一個標準化的lxc容器作爲模板,然後對它進行克隆,避免重新安裝,實現橫向擴展和環境的標準化。下面以基於lvm卷的容器爲例
lxc-clone vm01 webserver01 -B lvm
克隆後的容器,是一個獨立的lvm邏輯卷,默認與原來的大小一致(也可以指定大小),僅僅會改變mac地址和主機名。
如果你想節約空間,克隆時帶上 -s (--snapshot) 參數,可以創建一個源容器的可讀寫快照,它幾乎不佔用空間,使得在一個機器上運行成百上千個容器成爲可能,僅支持lvm和btrfs,因爲它們都有cow功能 。-L 參數可以指定快照的大小。更多參數詳見 man lxc-clone 。
lxc-clone vm01 webserver01 -s -B lvm
9、lxc容器的系統安全
lxc容器裏的系統完全可以不需要用到root密碼和ssh,可以設置空密碼或者超級長的密碼,openssh服務可以不必啓動甚至不必安裝。因爲從宿主機運行下面的命令可以直接獲得root shell,相當於chroot
lxc-attach -n webserver01
如果是應用容器,則更簡單,因爲容器裏只有應用進程,比如httpd,連init 都木有。具體實現參考模板lxc-sshd 。還只是玩具,相反,docker卻將應用容器發揚光大。
lxc 1.0還支持非特權容器,利用uidmap映射技術,將容器裏的root映射爲宿主機上的普通用戶,允許以普通用戶身份運行LXC容器,大大提高了宿主機的安全性。
使用方法省略,見我的另一篇文章。《ubuntu 14.04 體驗LXC非特權容器》
http://purplegrape.blog.51cto.com/1330104/1528503
update 2014-11-13
對文章內容進行了適當編排和刪節。添加了lxc 1.0之後的特性,深入介紹了基於lvm的操作。