めもめも

このブログに記載の内容は個人の見解であり、必ずしも所属組織の立場、戦略、意見を代表するものではありません。

RHEL6.2のlibvirtからLinuxコンテナを利用

2012/01/23 追記 「/export/lxcguest01/bin/init」を修正しました。

何の話かというと

まず、LXC(Linuxコンテナ)については「RHEL6.0 で LXC (Linuxコンテナ)」を参照してください。この記事では、Sourceforgeから専用のツールを導入して、コンテナの作成を行いました。

一方、RHEL6.2では、libvirtからコンテナの制御ができるようになっており、virshコマンドを用いてコンテナの作成、管理が行えます。libvirtで作成した仮想ネットワークにコンテナを接続することも可能です。

※ Technology Previewなので、まだ、Red Hatの正式サポートはありません。

ここでは、virshコマンドによる手順を説明しますが、virt-managerから管理することもできます。

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 の定義は削除されています

virt-managerからの管理

作成したコンテナは、virt-managerから操作することもできます。下図の手順で、virt-managerからLXCへの接続を追加します。

冒頭のスクリーンショットにあるように、virt-managerから仮想コンソールを開くこともできます。コンテナを停止するときは、「強制停止」を選択してください。