TenForward

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

Linux 3.12 と lxc

以下は 3.13, 3.12.9以降で動くようになっています!! (最後に追記してます)

Linux 3.12 がリリースされていますね.今回で xfs への User Namespace の実装が完了して,xfs を有効にしたまま User Namespace が使えるようになっていますので,とりあえずコンテナ関係の機能のカーネルへのここしばらくの実装の大きなトピックが完了というところでしょうか.

が,

という修正が影響して lxc-attach が動かなくなっています.

つまり lxc-attach は fork して,子供が setns して目的の Namespace に attach した後 clone(CLONE_PARENT) するわけですな.「なんで fork した後また clone するん?」ってのは,今のプロセスの PID Namespace を移動することができず,その子供が新しい PID Namespace に入るからですね.CLONE_PARENT しないと親→子→孫という構成になります.これじゃあ親が孫をモニタリングする時にやりづらい,ってことで 0.9 の後にガラッと lxc-attach のコードが書き換えられたんだと思います (その前は親子孫構成でした).

しかし,先の修正で CLONE_NEWUSER or CLONE_NEWPID かつ CLONE_PARENT は許可されなくなっているので,まさしくこの lxc-attach の場合に合致するわけですね.カーネル側からすると,こういう使い方は想定外だったようです (たぶん).結局この条件から CLONE_PARENT は外れるようですので (本当か?),今後の修正でちゃんと動くようになるみたいですね.

とりあえず 3.12 で lxc-attach すると

# uname -r
3.12.0-plamo64-karma
# lxc-attach -n plamo01 -- /bin/uname -a
lxc-attach: failed to clone(0x8000): Invalid argument
lxc-attach: Invalid argument - failed to create subprocess

こんなことになりますので,「lxc-attach って便利〜♪」と言って喜んでた方は,慌てて 3.12 にしないようにしましょう

もちろん 3.11 だと以下のように動いています.

# uname -r
3.11.6-plamo64-karma
# lxc-attach -n plamo01 -- /bin/uname -r
3.11.6-plamo64-karma

また動くようになったらここで紹介しますよ.

(英語力とカーネルの理解が足りてないので間違いの指摘歓迎です ^^; > なら書くな ;-p)