libvirt 経由で lxc を触ろうと思いハマる
kvm や Xen などの仮想環境を触るのに libvirt という API/ライブラリ/デーモン/コマンド群があり,RedHat, Debian 系でもよく使われます.
これを Plamo 4.73 でも使おうと思ってハマりました.libvirt は 0.8.2 を使っています.
- libvirtd には dnsmasq が必要なので,あらかじめインストールします.
- 今回とは関係ないですが,0.8.2 より新しいのを使おうとすると,iptables のたぶんパッチを当てないとダメなオプションを要求されて,libvirtd 起動時にちゃんとネットワークの設定が行われません.
libvirt 自体の make は簡単です.これを http://www.libvirt.org/drvlxc.html にあるように使おうと思ったのですが,
# virsh --connect lxc:/// define hoge.xml
とやると
this function is not supported by the connection driver: System lacks NETNS support
と怒られます.カーネルのオプションでは確かに有効にして再構築していますし,lxc 自体は動いているので問題はないはず,と思いつつも debian からカーネルの config を持ってきて Plamo で再構築したりしましたが,問題は起こります.デバッガまで持ち出して調べていましたが,lxc のソースを見て気づきました.
kernel の NET_NS (Network Namespace) が有効かどうかをチェックする関数が src/lxc/lxc_driver.c 内にあります.lxcCheckNetNsSupport という関数ですが,非常に簡単な関数です.これだけ見ても実際に何をやっているかは分かりませんが,大体見当がつきます.
static int lxcCheckNetNsSupport(void) { const char *argv[] = {"ip", "link", "set", "lo", "netns", "-1", NULL}; int ip_rc; if (virRun(argv, &ip_rc) < 0 || !(WIFEXITED(ip_rc) && (WEXITSTATUS(ip_rc) != 255))) return 0; if (lxcContainerAvailable(LXC_CONTAINER_FEATURE_NET) < 0) return 0; return 1; }
そうです!! iproute2 に含まれる ip コマンドを実行して NET_NS が有効か確かめているのです!! Plamo 4.73 に含まれる ip コマンドで
# ip link set lo netns -1
などと実行すると,"netns" なんて知らんという感じに怒られます.iproute2 のサイト から最新版 (2.6.35) を取得してインストールしてみると,無事 define コマンドは動きました.
define したことに満足して,まだ start してません!! :-p