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

第28回 LXCへのコミット[2]

この記事を読むのに必要な時間:およそ 3 分

今回も前回に引き続き,私がLXCプロジェクトに対して送ったパッチなどを紹介していきます。

overlayfsのworkdirオプション

第18回で紹介したように,Ubuntuでは以前からカーネルにoverlayfsのパッチが当たっており,overlayfsが使えるようになっていました。しかしこの時点では,3.18カーネルでマージされたoverlayfsと違い,workdirオプションが不要でした。

LXCでは,以前からストレージバックエンドとしてoverlayfsがサポートされていたこともあり,私はカーネルにマージされる前からoverlayfsを使っていました。3.10カーネルがリリースされる前に,そろそろoverlayfsがカーネルにマージされそうということで話題になっていたことも,興味をもった理由でした。

私は普段はPlamo Linuxで最新のカーネルをビルドして使っています。そこで新しいバージョンのLinuxカーネルがリリースされるたびに,対応するoverlayfsのパッチを当てて,手元の環境でoverlayfsが使えるようにしていました。

ちょうど3.15カーネルがリリースされたときに,overlayfsのパッチを当てて作ったカーネルでは,LXCでoverlayfsを使ったクローンが失敗するようになりました。調べてみると,overlayfsの仕様が変わりworkdirオプションが必要になったためでした。

他に同じ問題に遭遇している人がいないかを軽く調べてみましたが,見つけることはできませんでした。overlayfsがUbuntuとSuSE以外では使えませんでしたし,そのどちらもカーネルのバージョンが3.15よりも前だったため,おそらくLXCユーザが誰も気づかなかったからだと思います。そこで開発メーリングリストに報告し,パッチの作成にチャレンジしてみることにしました。

どのように実装するかについてはあまり良いアイデアが浮かびませんでした。そこで,一度workdirオプションなしでマウントしてみて,エラーだったらworkdirオプションを付けてリトライするという,あまりスマートでない方法で実装することになりました。

ここでストレージバックエンド周辺のコードを見ていたことが,あとで紹介するLVMストレージバックエンドの修正や,aufsの非特権コンテナのパッチ送付につながっています。このパッチを作成したおかげで,どのように修正すべきかのアイデアがイメージしやすかったです。

この直後にも他のパッチが原因で生じた,aufs/overlayfsを使ったクローンで起こる問題を解決するパッチを送付しています。

lxc-configの改良

lxc-configはLXCのシステム設定を表示するためのコマンドです。このコマンドを改良するためのパッチを送ったのは,この連載がきっかけです。

私はLXCのシステム設定を変更することはほとんどないので,連載で書くために初めてlxc-configを使いました。

それほど需要が大きなコマンドとも思えないので,第10回の記事中ではあっさりと紹介しています。しかし,第11回で紹介した通り,LXCのシステム設定を表示するコマンドなのにcgroup関係のシステム設定項目の表示ができません。

変だなと思ってコードを見てみましたが,やはりcgroup関係の設定を表示するコードは入ってませんでした。cgroupの設定だけ表示できないのは変ですし,lxc-configのコードを見る限りでは簡単に追加できそうでしたので,早速パッチを作って送付しました。

最初のパッチを送った後に,メンテナのSerge Hallyn氏からコメントをもらい後者のパッチを作成しました。作った時点では自信がなかったので,お伺いを立てるメールを出した所そのままマージされてしまいました。このため変なコミットログになっています(^_^;)。

この連載を書いていなければ送っていないパッチです。以下のように,バージョン1.1では以下のようにcgroup関係の設定が表示できるようになりました。

$ sudo lxc-config -l
lxc.default_config
lxc.lxcpath
lxc.bdev.lvm.vg
lxc.bdev.lvm.thin_pool
lxc.bdev.zfs.root
lxc.cgroup.use
lxc.cgroup.pattern

LVMストレージバックエンドのバグ修正

この修正もこの連載がきっかけでした。私が普段使っている手元の環境では,コンテナディレクトリである/var/lib/lxcはBtrfsになっていますので,この連載で紹介するまではLVMをストレージバックエンドとして使ったことはありませんでした。

そこで別の環境でLVMを使ったコンテナの操作をいろいろ試していました。すると第21回に書いたように,クローン先のコンテナを消去するとクローン元の論理ボリュームまで同時に削除されてしまい,クローン元コンテナを起動できない不具合を発見しました。あまり使っている人がいなかったのか,この問題はこの時まで見逃されてきていました。

これは大きな問題ですし,修正範囲が大きそうだなと思ってコードを追いながら少し考えました。すると,少し工夫すればすぐに修正できそうだったので,まずは修正の方針に関してメーリングリストでお伺いを立て,了解を得た所でパッチを作成した送付しました。

非常にシンプルな修正で済みました。

著者プロフィール

加藤泰文(かとうやすふみ)

2009年頃にLinuxカーネルのcgroup機能に興味を持って以来,Linuxのコンテナ関連の最新情報を追っかけたり,コンテナの勉強会を開いたりして勉強しています。英語力のない自分用にLXCのmanページを日本語訳していたところ,あっさり本家にマージされてしまい,それ以来日本語訳のパッチを送り続けています。

Plamo Linuxメンテナ。ファーストサーバ株式会社所属。

Twitter:@ten_forward
技術系のブログ:http://d.hatena.ne.jp/defiant/

コメント

コメントの記入