2011年5月9日 星期一

linux containers (LXC)

最近新版的 linux kernel 2.6.29 以後,支援了一種叫 LXC (linux containers) 的東東,是由 IBM 所開發,license 是 GNU LGPL,類似 linux vserver, openvz 的機制。在同一個 kernel 下,可以執行另外不同的 os,譬如在 debian stable 6.0 下,再跑另一個 debian testing,不同的 filesystem,但共用同一個 kernel,基本上和 chroot 差不多,但是功能更完整。

lxc 不但有不同的 filesystem,還能夠設定不同的網路,就好像是另一台虛擬機器,但是不會像 kvm 或 xen 那樣耗費那麼多的資源。LXC 可限制用多少 memory、cpu 等等,才不會讓某一個 container 影響到另一個 container 或甚至是 host,這都是 chroot 做不到的。

底下說明如何在 debian squeeze (6.0)上面使用 lxc 的步驟:
# apt-get install lxc

檢查看看目前 kernel 是否完整支援 lxc:
# lxc-checkconfig
Kernel config /proc/config.gz not found, looking in other places...
Found kernel config file /boot/config-2.6.32-5-amd64
--- Namespaces ---
Namespaces: enabled
Utsname namespace: enabled
Ipc namespace: enabled
Pid namespace: enabled
User namespace: enabled
Network namespace: enabled
Multiple /dev/pts instances: enabled

--- Control groups ---
Cgroup: enabled
Cgroup namespace: enabled
Cgroup device: enabled
Cgroup sched: enabled
Cgroup cpu account: enabled
Cgroup memory controller: missing
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

大致上都 ok,但是卻有一項沒通過
Cgroup memory controller: missing
所以無法限制 memory 使用量,若要用,則要自己重編核心就是。

debian squeeze 中共有五個範本 (busybox debian fedora sshd ubuntu)
# ls /usr/lib/lxc/templates/
lxc-busybox lxc-debian lxc-fedora lxc-sshd lxc-ubuntu

由於 template 中的 lxc-debian 是安裝 lenny,要裝 squeeze 請自行修改
# cp /usr/lib/lxc/templates/lxc-debian /usr/lib/lxc/templates/lxc-squeeze
dhcp-client 改成 dhcp3-client
debootstrap 那行 lenny 改成 squeeze
順便改一下 debian mirror
反正這個檔案可以改的地方很多,修改成符合自己需求

建立一個叫 foo 的新 container,OS 為 debian (lxc-debian 中是寫 debian lenny,會安裝失敗,請改成 squeeze)
# lxc-create -n foo -t squeeze /var/lib/lxc/foo
這樣會在 /var/lib/lxc/foo 建立 foo 的 container,OS 為 debian squeeze,user:name 為 root:root,並產生 config 檔
/var/lib/lxc/foo/config

啟動 foo
# lxc-start -n foo -f /var/lib/lxc/foo/config
若正常的話會出現登入畫面,以 root:root 登入即可。

如果之前的 lxc-start 可正常登入,就可以加上 -d (or --daemon),執行成 daemon mode。之後再用 lxc-console 去開啟 console 登入。

加上 -d
# lxc-start -n foo -f /var/lib/lxc/foo/config -d
這次就會直接回到命令列,不會有登入畫面

檢查目前有哪幾個 container 啟動中(若沒有任何結果,則目前都沒有 container 啟動中)
# lxc-ls
foo

連接到 console 登入
# lxc-console -n foo
如果按 Enter 還是沒看到登入畫面,就先關掉 foo,這裡因為 container 內少掉 /dev/tty1 這個裝置,所以無法登入
# cd /var/lib/lxc/foo/rootfs/dev
# mknod tty1 c 4 1
再重新開啟 foo,用 lxc-console 應該就可以登入了。

另外,可以將目前狀態給凍結起來,類似 suspend
# lxc-freeze -n foo

恢復一個被凍結的 container
# lxc-unfreeze -n foo

監控 containers 的狀態
# lxc-monitor -n foo
剛執行是沒任何輸出,但是若 foo 有開機或關機,則會出現訊息
'wheezy' changed state to [STOPPING]
'wheezy' changed state to [STOPPED]
'wheezy' changed state to [STARTING]
'wheezy' changed state to [RUNNING]

再來 lxc 強的地方開始了
檢查目前 foo 使用了哪些 cpu(預設是全部)
$ lxc-cgroup -n foo cpuset.cpus
0-1

設定成 'foo' 只能用 cpu 0
$ lxc-cgroup -n foo cpuset.cpus "0"

檢查看看
# lxc-cgroup -n foo cpuset.cpus
0

甚至可將一顆 cpu 切開看誰可以用多少
$ lxc-cgroup -n foo cpu.shares
1024

$ lxc-cgroup -n bar cpu.shares
1024

預設 'foo' 及 'bar' 都是 1024 比重,都一樣,所以若同時啟動,各用 50 %

將 bar 設成 512
# lxc-cgroup -n bar cpu.shares 512

$ lxc-cgroup -n foo cpu.shares
1024
$ lxc-cgroup -n bar cpu.shares
512

所以這時 foo 用 66%,bar 用 33%


停止 foo (lxc-stop 是直接拔掉插頭,沒有依照正常關機程序來關機,若要正常關機,從 container 裡打 init 0 或 poweroff 或 shutdown -h now)
# lxc-stop -n foo

將 foo 給移除(包含砍掉 /var/lib/lxc/foo 整個目錄)
# lxc-destroy -n foo

基本上,lxc 是新的 linux 技術,雖然功能還不是非常的完整,但是已經堪用,尤其一些舊硬體,若不支援 vmx 或 svm,無法用 redhat kvm 的情況,但又不想花太多時間去學 xen,則 lxc 是最好的選擇了。

P.S. 在 container 中,udev 是無法運作的。
P.S. 由於是共用同一個 kernel,所以在 linux 上是無法跑 windows、freebsd 的,只能跑 linux

沒有留言:

張貼留言