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

第31回 LXC 1.1[2]

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

LXC 1.1をのんびり紹介しているうちに,Ubuntu 16.04 LTSに向けて,次のバージョンのリリースが間近になってしまいました。うかうかしているとLXC 1.1の紹介が終わらないうちに,LXC 1.1がEOLになってしまいそうなので,慌てて今回の記事を書きました。

LXC 1.1の次は1.2かと思っていたら,linuxcontainers.org関連のプロダクトであるLXC,LXD,LXCFSすべてをバージョン2.0で揃えてリリースするようです。もうひとつ,cgmanagerというプロダクトがありましたが,こちらはLXCFSの進化に伴い不要となりましたので,今後は開発が終息していくようです。

1.1から2.0はそれほど大きな変更はなく,ライブラリについてもABIレベルでの互換性が維持されるようです。もちろん第29回と今回,LXC 1.1の新機能として紹介した機能はそのまま2.0でも使えるはずです。

今回はLXC 1.1の新機能や変更点のうち,設定ファイルに関係する部分を紹介します。

ディレクトリのinclude

LXCの設定ファイルでは,第11回で紹介したように,lxc.includeを用いて,他の設定ファイルをincludeできました。

LXC 1.1では,ファイルに加えて,lxc.includeにディレクトリを指定できるようになりました。

たとえば,LXCがインストールするcommon.confでは,デフォルトで以下のような設定が書かれています。

lxc.include = /usr/share/lxc/config/common.conf.d/

ここに設定したい内容を書いたファイルを置けば,デフォルトの設定ファイルを変更せずに全コンテナで有効にしたい設定ができます。

UbuntuにLXC 1.1をインストールすると,依存関係でLXCFSがインストールされます。その際,LXCコンテナがLXCFSを使うよう,フックを設定するためにファイルが置かれます。

コンテナがinitとして実行するプログラム

コンテナを起動する際に使うlxc-startコマンドで,コンテナ名だけを指定してコンテナを起動すると,システムコンテナが起動しました。これはlxc-startは,デフォルトでコンテナ内の/sbin/initをコマンドとして実行するためでした。

一方lxc-startコマンドを実行する際に,コマンドを指定してアプリケーションコンテナを起動できました。

$ sudo lxc-start -n ct01 -F -- /bin/bash
  :(略)
root@ct01:/#

LXC 1.1からは,lxc-startが実行するコマンドが設定で指定できるようになりました。上記の例と同じ指定を設定ファイルで行う場合は,コンテナの設定ファイルで以下のように設定します。

lxc.init_cmd = /bin/bash

lxc-startを実行すると,以下のように指定通りにbashが実行できていますね。

$ sudo grep lxc.init_cmd /var/lib/lxc/ct01/config
lxc.init_cmd = /bin/bash
$ sudo lxc-start -n ct01 -F
  :(略)
root@ct01:/# 

柔軟なlxc.cap.keepの設定

第12回で紹介したlxc.cap.keepは,コンテナで保持したいケーパビリティを指定するための設定項目でした。ここで指定したケーパビリティ以外はすべて削除されます。

この設定にnoneというキーワードを指定できるようになりました。

LXCは設定ファイルを順に読んでいきますので,lxc.cap.keepnoneを設定すると,それまでに許可されているケーパビリティを一旦すべて削除できます。その後に許可したいケーパビリティをlxc.cap.keepに指定すれば,コンテナに許可されているケーパビリティを一旦すべて削除したあとで,許可したいケーパビリティを設定できます。

lxc.includeなどを使って,全コンテナで共通の設定がなされている場合に,特定のコンテナだけではケーパビリティの設定を変えたい場合に便利ですね。

lxc.cap.keep = none      # この設定以前に許可されていたケーパビリティをすべて削除
lxc.cap.keep = net_admin # 許可したいケーパビリティを指定

以上の設定でCAP_NET_ADMINのみが許可されたコンテナになります。lxc.cap.keepの最後にnoneが設定されると,すべてのケーパビリティが削除された状態になります。

これまでは紹介していませんでしたが,LXCではケーパビリティ,cgroup,マウント,UID/GIDのマッピングといった複数の値を設定できる項目で空の値を設定すると,その時点でなされている設定値をクリアできます。

lxc.cap.drop = mac_admin mac_override sys_time sys_module
lxc.cap.drop =

ケーパビリティを削除する場合のlxc.cap.dropでは,以上のように設定すると,1行目で設定されている削除したい4つのケーパビリティが,2行目ですべてクリアされます。lxc.cap.dropでは,この空の値を設定する方法ですべてのケーパビリティを許可できました。

この設定をクリアする方法はlxc.cap.keepでも使えます。しかし,lxc.cap.keepの設定をクリアすると,すべてのケーパビリティが許可されてしまいます。つまり,LXC 1.0では,すべてのケーパビリティを削除するという設定を書くのは大変でした。

lxc.cap.keepnoneが指定できるようになり,一旦すべてのケーパビリティを削除してから,許可したいケーパビリティを簡単に設定できるようになりました。

著者プロフィール

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

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

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

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

コメント

コメントの記入