LXCをlibvirtd経由で起動させる。

Sidでlxcを使うには、lxcパッケージをインストールし、README.Debianにあるとおり/etc/fstabに

cgroup /sys/fs/cgroup cgroup defaults 0 0

と記述し、cgroupをマウントすれば使えます。一方、libvirtd経由で起動させる場合、

<domain type='lxc'>
  <name>vm1</name>
  <memory>100000</memory>
  <os>
    <type>exe</type>
    <init>/bin/sh</init>
  </os>
  <vcpu>1</vcpu>
  <clock offset='utc'/>
  <on_poweroff>destroy</on_poweroff>
  <on_reboot>restart</on_reboot>
  <on_crash>destroy</on_crash>
  <devices>
    <emulator>/usr/lib/libvirt/libvirt_lxc</emulator>
    <interface type='network'>
      <source network='default'/>
    </interface>
    <console type='pty' />
  </devices>
</domain>

のようなlibvirtの定義ファイルを用意してやります。libvirtグループのアカウントで下記を実行します。

$ virsh --connect lxc:/// define vm1.xml
$ virsh --connect lxc:/// start vm1

これで起動できる!と思ったら大間違い。下記のようなエラーを吐いてこけます。

2012-07-10 15:44:06.531+0000: 24033: error : lxcVmStart:1783 : internal error Unable to find 'memory' cgroups controller mount

このワークアラウンドは Debian Wiki に記述されており、/etc/default/grubに下記の設定を行い、update-grub2を実行しkernelを再起動してやればOKです。

GRUB_CMDLINE_LINUX="cgroup_enable=memory"

kernel 2.6.39-1でFixされている ようなのですが、実際には kernel 3.0.0-1でも同じ問題に遭遇します。

とりあえず、これで無事起動できるようになった筈です。実際に実行してみます。

$ virsh --connect lxc:/// start vm1
Domain vm1 started

$ virsh --connect lxc:/// list --all
Id    Name                           State
----------------------------------------------------
5511  vm1                            running

$ sudo virsh --connect lxc:/// console vm1
Connected to domain vm1
Escape character is ^]
#

無事起動できましたね。今回はshを起動しているだけなのでネットワークの設定は行う意味がありませんが、debootstrapで作成したDebianイメージはあらかじめブリッジの設定をしておかないと、

error: Failed to start domain vm1
error: Unable to add bridge virbr0 port veth0: No such device

のようなエラーを吐いてコンテナ自体を起動できないので注意。debootstrapで作成したDebianイメージもlibvirtで問題なく起動できるか否かは未確認。

追記

3.2.0をインストールしてみましたが、GRUBでのcgroup_enable=memoryのオプションはやはり必要でした。