LXCで学ぶコンテナ入門 -軽量仮想化環境を実現する技術

第27回LXCへのコミット[1]

前回までで、連載を始める前の目標を達成したので少しお休みを頂いていました。

1年も連載をしていると、記事を書いた当初と状況や機能が変わった部分が出てきています。あとで記事を読んだ際も、なるべく新しい情報が得られるように、気づいた範囲で今まで書いた記事への補足をしていますので、今後も必要に応じてこれまでの記事を参照いただければと思います。

また、LXCのバージョンが上がって変更されたり追加された機能については、今後紹介していきたいと思っていますので、引き続きこの連載をよろしくお願いいたします。

さて、今回と次回は技術的なお話や機能の紹介ではなく少し読み物的に、私のこれまでのLXCプロジェクトに対する関わりをつらつらと思いつくままに紹介してみようかと思います。また、この連載をやっていたからこそできた貢献もありますので、それも紹介したいと思います。

日本語マニュアル

私がLXCに対して一番たくさん送っているパッチは、連載のこれまででも紹介した通り、manページの日本語訳に関係するパッチです。

私は日本語訳を始めた当初は、LXCにマージしてもらおうと思って作業していたわけではありません。私は英語が苦手で、何度も同じマニュアルを読むたびに辞書を引く必要があり、マニュアルを読むの非常に時間がかかっていました。そこで何度も同じ英語を読む手間を省くために自分用に日本語に翻訳しようと思い立ったわけです。

それでも、バージョンアップ時の更新が楽なように、元々のソースと同様の形式でバージョン管理を行って、makeを実行すればman形式やhtml形式でファイル出力されるようにしていました。

0.9がリリースされるころには、翻訳のチェックもしていただいたりして、それなりに翻訳も人に見せられる程度の質にはなっていました。また、HTMLに変換して公開したので、⁠訳してみたから使ってね」程度の軽い気持ちでlxc-usersメーリングリストへ紹介の投稿を行いました。

すると、すぐにメンテナのSerge Hallyn氏からお礼と共に、マージに前向きなコメントをいただきました。この時点では、英語と日本語のmanページを共存させるようには作っていませんでしたし、それに必要な知識もなかったのですが、せっかくコメントをいただいたので、ゆっくり知識を習得しながらやってみようと思いました。

そこでLXCや他の日本語manページを持っているソフトのソースを見たりして、どのように日本語manページを生成したりインストールしたりしているのかを見ながら試してみると、思ったより早くあっさりできてしまいました。そこでgithubでPull Requestを送ったところすぐにマージされました。以下がそのコミットで、私にとって著名なOSSに初めてマージされたパッチですので、今考えても感慨深いものがあります。

このあとすぐに英語の更新に追いつき、英語のmanページが更新された際には、なるべくすぐに更新部分の翻訳をしてもれがないようにしています。

連載とマニュアルの充実

この連載では、LXC 1.0の持つ機能をまんべんなく紹介しようとしていました。しかし、ある程度LXCを使い続けていたとはいえ、私も使ったことのないコマンドやオプションが多数ありました。そこでマニュアルを見ながら機能を確認し、コマンドを実行して試した後に記事を書いていました。

LXCは比較的きちんとマニュアルが整備されていると思います。それでも持っている機能がマニュアルに記載されていなかったり、実際に動かした場合とマニュアルの説明が異なるところに気づくことが何度もありました。

このような部分を放置すると、後で修正される可能性は少ない気がしましたので、なるべく気づいた時に修正や追加を行うパッチを投げました。

当然、翻訳の不備でなくマニュアルの不備ですので、オリジナルの英語のmanページにも修正が必要でした。元々英語が苦手なので翻訳を始めたはずが、なぜか英語のマニュアルを修正することになって変な感じです(^_^;)。自分が送るパッチの英語にも全く自信はなかったのですが、なぜかほとんどのパッチは英語の修正がなされることなくそのままマージされています。

今回の記事を書くために、連載がきっかけで修正を行ったmanページ関係の修正を数えてみると9件ほどありました。マニュアルの整備にこの連載はかなり役に立ちました。

Plamo Linuxテンプレート

日本語マニュアルのあとにマージしてもらったパッチはPlamo Linuxコンテナを作るテンプレートです。

今となっては日本国内においてもメジャーとは言えないPlamo Linuxです。しかし、私とこの連載のもう一人の著者である田向さんでテンプレートをメンテしていましたので、それをマージしてもらうために一度パッチを送ってみようという話になり、送ってみたらあっさりマージされました。

今では、私がPlamo用のパッケージを作る際は、このテンプレートを使って作ったクリーンなPlamo Linuxコンテナでパッケージのビルドを行っており非常に便利です。世界中で何人使ってるのかわからないテンプレートですが、マージしてもらえて便利に使えるってすばらしいですね(^_^;)。

その後田向さんが、Plamoの持つシンプルなパッケージ管理の仕組みを生かして、どのようなディストリビューションを使ったホストであっても、Plamoコンテナが作れるように改良してくださっています。

この改良のおかげで、linuxcontainers.orgのUbuntuホスト上で定期的にダウンロード用のPlamoコンテナのイメージが作られています。linuxcontainers.orgでUbuntuコンテナイメージの次に定期的に作成されるようになったのは、なんとPlamoコンテナのイメージなのです。

初めてのバグフィックス

私が初めてマニュアルとテンプレート以外のコードに対するパッチを送ったのはlxc-createコマンドに対するパッチでした。私自身はこんなパッチを送ったことはすっかり忘れていました。今回の記事を書くためにgit logを実行して調べて思い出したパッチです。

LXC 1.0リリース前は思ってもみない単純なところにバグが潜んでいました。

非特権コンテナの動作に関わるパッチ

一般ユーザ権限で起動する非特権コンテナは、カーネルに実装された時期がもっとも最近であるユーザ名前空間を使っています。

新しい機能であり、機能自体がユーザやグループの権限というセキュリティに関わる部分ですので、セキュリティホールを修正するためだったり、改良などのために比較的頻繁にカーネルのコードが変化しています。

このようにカーネル側でコードが頻繁に変化するため、カーネルのバージョンアップを行った途端に、非特権コンテナが動かなくなるということが何度かありました。しかもメジャーバージョンアップでなくマイナーバージョンアップなのに動かなくなることがありました。

ユーザ名前空間に関係する脆弱性の修正を含むバージョンとして3.14.8と3.15.1カーネルがリリースされた際が最初のケースだったと思います。バニラカーネルがリリースされてから、各ディストリビューションのカーネルが更新されるまでに少しタイムラグがありました。普段からPlamoで最新のカーネルをビルドして使っている私がまっ先に問題を発見して、メンテナのSerge Hallyn氏に色々質問しながらパッチを作成しました。

最終的には、修正が必要な範囲が最初に考えていたよりも広範囲だったので、私が最初に投げたパッチ以上の修正が必要で、田向さんがパッチを作成され、修正が完了しました。

この修正は、問題の重要度、解決までの時間、修正の範囲が他に私が関係したパッチに比べて大きいので、私の中でもプロジェクトに貢献できた度合いが大きかったように感じています。

最近も、4.0.1カーネルまで動いていた非特権コンテナが、4.0.2にバージョンアップした途端にカーネルパニックを起こしてしまうという問題がありました。この問題は、カーネルの開発でmasterブランチにマージされたパッチを4.0系列に反映させるときに、必要なパッチをいくつか抜かしてしまうというミスがあったことが原因でした。その後、抜けたパッチがマージされた時点で自動的に解決しました。

最近のカーネルの更新でも、かなりユーザ名前空間に関係する変更が入っていますので、最新の環境で使っている場合に非特権コンテナが動かなくなった場合はカーネルの更新を調べてみると良いかも知れません。

まとめ

今回はLXC 1.0リリース前から、私がLXCプロジェクトに送ったパッチをいくつか、いきさつを含めて紹介しました。

次回も今回の続編で、私が関わったLXCに対する修正や改良を紹介したいと思います。

おすすめ記事

記事・ニュース一覧