2012/01/23 追記 「/export/lxcguest01/bin/init」を修正しました。
何の話かというと
まず、LXC(Linuxコンテナ)については「RHEL6.0 で LXC (Linuxコンテナ)」を参照してください。この記事では、Sourceforgeから専用のツールを導入して、コンテナの作成を行いました。
一方、RHEL6.2では、libvirtからコンテナの制御ができるようになっており、virshコマンドを用いてコンテナの作成、管理が行えます。libvirtで作成した仮想ネットワークにコンテナを接続することも可能です。
※ Technology Previewなので、まだ、Red Hatの正式サポートはありません。
LXCの使い方について
先の記事で紹介したようにLXCは2種類の使い方ができます。
(1) 特定のアプリケーションをコンテナ内で実行する。(アプリケーションコンテナ)
(2) 独立した OS 環境一式をコンテナ内で実行する。(システムコンテナ)
Red Hatの開発チームでは、現在は、(1)の使い方にフォーカスして開発を進めています。システムコンテナとして求められるセキュリティ要件を満たすには、現状のLXCでは機能が不足しているのが主な理由です。長期的には、システムコンテナにも対応していくと思いますが、現状では、OS環境一式を仮想化したい場合は、普通にKVMを使うことをお勧めします。
ここでは、アプリケーションコンテナの簡単な例として、busyboxによる簡易Webサーバをコンテナ内部で起動する手順を紹介します。
事前準備
RHEL6.2で仮想化ホスト環境を構成します。
# yum groupinstall "Virtualization" "Virtualization Client" "Virtualization Platform" # chkconfig libvirtd on # reboot
仮想ネットワークは、デフォルトで用意される「default」を使用します。NAT構成なので外部ネットワークからコンテナ内へのアクセスはできません。ここでは、ホストLinuxからアクセスして簡易Webサーバの動作確認を行います。
仮想ルートファイルシステムの用意
コンテナの仮想ルートファイルシステムを用意します。ここでは、busyboxの動作に必要な最小限の環境を/export/lxcguest01/以下に準備します。
# mkdir -p /export/lxcguest01/bin # mkdir -p /export/lxcguest01/html # cd /export/lxcguest01/bin # cp /sbin/busybox ./ # for i in echo grep ifconfig kill ps route test which cat false head ls pwd sh true date find httpd ip ping rm sleep wget; do ln -s busybox $i; done
コンテナの起動時に最初に実行するスクリプトを次の内容で用意して、実行権をつけておきます。
/export/lxcguest01/bin/init
#!/bin/sh ifconfig eth0 192.168.122.50 route add default gw 192.168.122.1 eth0 httpd -h /html while [[ true ]]; do sh done
# chmod u+x /export/lxcguest01/bin/init
ここでは、IPアドレスのアサインと簡易Webサーバの起動を行なっています。最後のshは、仮想コンソールで使用するシェルになります。
簡易Webサーバで公開するindex.htmlも用意します。
/export/lxcguest01/html/index.html
<h1>Hello, LXC!</h1>
コンテナの定義と実行
コンテナを定義するXMLファイルを次の内容で用意します。
lxcguest01.xml
<domain type='lxc'> <name>lxcguest01</name> <memory>200000</memory> <os> <type>exe</type> <init>/bin/init</init> </os> <devices> <interface type='network'> <source network='default'/> </interface> <console type='pty'/> <filesystem type='mount'> <source dir='/export/lxcguest01'/> <target dir='/'/> </filesystem> </devices> </domain>
ここで指定した仮想メモリの割り当ては、cgroupで制御されます。
次のコマンドでコンテナを定義して、おもむろに実行します。
# export LIBVIRT_DEFAULT_URI=lxc:/// # virsh define lxcguest01.xml ドメイン lxcguest01 が lxcguest01.xml から定義されました # virsh start lxcguest01 ドメイン lxcguest01 が起動されました # virsh list Id 名前 状態 ---------------------------------- 25503 lxcguest01 実行中
環境変数「LIBVIRT_DEFAULT_URI」はvirshコマンドで操作する対象をKVMからLXCに切り替えるためのものです。
ホストLinuxからpingを打つとコンテナが起動していることがわかります。HTTPアクセスもOKです。
# ping 192.168.122.50 PING 192.168.122.50 (192.168.122.50) 56(84) bytes of data. 64 bytes from 192.168.122.50: icmp_seq=1 ttl=64 time=1.23 ms 64 bytes from 192.168.122.50: icmp_seq=2 ttl=64 time=0.031 ms ^C --- 192.168.122.50 ping statistics --- 2 packets transmitted, 2 received, 0% packet loss, time 1359ms rtt min/avg/max/mdev = 0.031/0.631/1.232/0.601 ms # curl http://192.168.122.50 <h1>Hello, LXC!</h1>
仮想コンソールに接続して、プロセスやネットワーク構成を確認するとこのようになります。
# virsh console lxcguest01 Connected to domain lxcguest01 エスケープ文字は ^] です # ps -ef PID USER TIME COMMAND 1 0 0:00 /bin/sh /bin/init 8 0 0:00 httpd -h /html 9 0 0:00 sh 14 0 0:00 ps -ef # ifconfig eth0 Link encap:Ethernet HWaddr 52:54:00:F8:E3:52 inet addr:192.168.122.50 Bcast:192.168.122.255 Mask:255.255.255.0 inet6 addr: fe80::5054:ff:fef8:e352/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:321 errors:0 dropped:0 overruns:0 frame:0 TX packets:32 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:23259 (22.7 KiB) TX bytes:3560 (3.4 KiB) lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 inet6 addr: ::1/128 Scope:Host UP LOOPBACK RUNNING MTU:16436 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:0 (0.0 B) TX bytes:0 (0.0 B) # (Ctrl+] で終了)
最後は、Ctrl+] でコンソールから切断します。
ホストLinux上では、コンテナ用のcgroupディレクトリが自動で用意されます。たとえばメモリの上限は次のように設定されています。
# cat /cgroup/memory/libvirt/lxc/lxcguest01/memory.limit_in_bytes 204800000
コンテナを停止して、定義を削除するのは、次のコマンドです。
# virsh destroy lxcguest01 ドメイン lxcguest01 は強制停止されました # virsh undefine lxcguest01 ドメイン lxcguest01 の定義は削除されています