TenForward

技術ブログ。はてなダイアリーから移転しました

libvirt 経由で lxc を触ろうと思いハマる

kvmXen などの仮想環境を触るのに 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