Squeeze→WheezyにアップグレードしたらLXCコンテナが軒並み動かなくなった
※この記事書き溜めて1カ月ぐらい経つような気がするので未完成だけどとりあえず公開しておく。
LXCのメーリングリストでwheezyにアップグレードしたらLXCがヤバいって噂は聞いてたけど、案の定LXCのホスト側をwheezyにアップグレードしたらLXCコンテナが軒並み動かなくなってしまった。
原因は
- 自分の設定
- kernel
- LXCのパッケージ
にある(はず)。
とりあえず起きた問題と解決法を覚書しておく。
lxc-shutdownでinit以外のプロセスも終了しない (未解決)
とりあえずコンテナにログインして直接sudo haltで終了させて対処した。
が、それでも後述するようにinitプロセスのみが残るという問題がある。
以前は私はlxc-toolsというLXCツール群に含まれていたlxc-haltというコマンドでコンテナを終了させていた。
このツールは要は「sshログイン + sudo halt」を自動的にやってくれるツールです。*1
ただ、lxcパッケージがアップグレードしたらlxc-haltというコマンドが提供されるようになってしまいconflictするようになって面倒くさかったのでアンインストールしてしまいました。
なおconflictの問題はlxc-toolsでは結構前に対応されていて、最新版では直っています。
でもまたパッケージ作ってインストールする程の必要性があるかは個人的には微妙。
問題: コンテナでsudo haltするとなぜかinitプロセスのみが残ってコンテナが終了しない
しょうがないのでとりあえずホスト側でlxc-psでinitプロセスのみになったことを確認してからlxc-stopで無理矢理止めていた。
しかしその後
- lxcパッケージをsqueezeのリポジトリで提供されていた0.7.2-1から現時点でsidの最新のもの*2にアップグレード
- apt-pinningでlxcのみアップグレードするよう設定すること。でないと適当にsidのapt-line追加しただけだと全てのパッケージが丸ごとsidに変わってしまう
- kernelを安定版のうち最新のものにアップグレード
したら直った。
...とはいうものの、lxc-checkconfigしたら「User namespace: missing」になっているのがすごく気になる。
どこで設定するんですかこれ...
問題: コンテナからWANへつながらない
デフォルトゲートウェイが自動では設定されなくなった?のが原因。
以前は自動でデフォルトゲートウェイが用意されてたけど、/etc/network/interfacesを置いていたせいもあるかもしれない。
どうやらコンテナ内には/etc/network/interfacesを置く必要はないらしい。
/etc/network/interfacesでデフォルトゲートウェイを追加するようにした。
といってもgateway x.x.x.xだと前述の問題が起きるので、こうしてみた。
変わったこと
- mountの出力
- ネットワーク周り
が変わってる。
念のためまだwheezyにアップグレードしてないLXCホスト側の出力と比べてみた。
(TODO: 力尽きました。)
システムコンテナはあまり(Red Hatの)開発陣も力を入れていないらしい?
先の記事で紹介したようにLXCは2種類の使い方ができます。
(1) 特定のアプリケーションをコンテナ内で実行する。(アプリケーションコンテナ)
(2) 独立した OS 環境一式をコンテナ内で実行する。(システムコンテナ)Red Hatの開発チームでは、現在は、(1)の使い方にフォーカスして開発を進めています。システムコンテナとして求められるセキュリティ要件を満たすには、現状のLXCでは機能が不足しているのが主な理由です。長期的には、システムコンテナにも対応していくと思いますが、現状では、OS環境一式を仮想化したい場合は、普通にKVMを使うことをお勧めします。
RHEL6.2のlibvirtからLinuxコンテナを利用 - めもめも