読者です 読者をやめる 読者になる 読者になる

TenForward

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

LXC での非特権コンテナとダウンロードテンプレート

lxc Container

(2014-02-19 一部更新しています)

予定ではもう lxc-1.0 の RC の段階だったはずですが,直前で大きな変更が多数マージされている関係で,まだまだ beta 扱いということで,相変わらず更新が激しく,いつになったら RC になるのか,と思う今日このごろの LXC です.(2014-01-28 追記: 書いた直後に beta3 になっていたので,RC はまだ先ですね :-)

ダウンロードテンプレート

さて,その最近マージされた大きな変更の一つが,ダウンロード用テンプレートです.従来,LXC では lxc-create から呼び出す各ディストリビューション毎のテンプレートが存在し,これを使って lxc-create を実行した時に,パッケージを落としてきたり,必要な設定をしたりしてコンテナの rootfs イメージ (ディレクトリツリー) を作成していました.

しかし,この rootfs を作成する際に特権が必要な処理があり,これを解決するには,あらかじめ作っておいた rootfs イメージを展開するしかない,という結論に達したようです.これは,毎日 linuxcontainers.org 上のホストでビルドされる各ディストリビューションの rootfs のイメージをダウンロードしてきて,それを展開して使おうというもので,OpenVZ/Virtuozzo をお使いの経験のある方は理解しやすい仕組みではないでしょうか.この辺りのサーバ側の仕組みは [lxc-devel] Last minute template addition - universal image based template や以降のスレッドで解説されています (このメールからは仕様は多少変わっていますが).

現時点で準備されているディストリビューション

となっています.:-)

非特権コンテナ

非特権コンテナについては,カーネル/VM Advent Calendar 2013のために書いたエントリで説明しましたが,Ubuntu 14.04 の開発版の上では,これ以上に簡単に一般ユーザ権限でコンテナの起動が可能になっています.この方法は LXC コミッターの Stéphane Graber さんのブログの以下のエントリに書かれています.

要件についても上記エントリに書かれていますが,以下のようなものです.

  • Linux Kernel 3.13 (3.10 以降で動きそうな気がします)
    • User Namespace 機能が有効になっていること
  • 色々パッチの当たっている shadow パッケージ
    • 現時点の最新は 4.1.5.1 ですが,これにパッチを当てる必要があります.当然,Ubuntu のパッケージではパッチは適用済みで以下のコマンドは準備されています.パッチの内容のうち,非特権コンテナに関係するものは (これ以外にもあるかも? ^^;)
      • User Namespace 用に各ユーザのサブID(uid/gid)を設定することのできる usermod コマンド (/etc/subuid, /etc/subgid というファイルを生成します.これは手で作ってもいいんですが :-)
      • User Namespace 用のマッピングを生成する newuidmap,newgidmap コマンド./proc/[PID]/uid_map,gid_map ファイルを生成します.この辺りの話はこことか,こことか,こことかを参照してください.
  • ユーザ毎の cgroup が存在していること.コンテナを起動するには cgroup が必要ですが,ユーザ権限で書き込み可能なグループが存在している必要があります.
    • これは現時点では systemd を使っているようです.あまり systemd は知りませんが,ログインしているユーザのセッション毎に cgroupfs にユーザが書き込めるグループが作成されますね? > systemd (systemd-logind の機能?) そのユーザの起動したシェルも,その cgroup の tasks に入ってますので,何もしなくてもユーザ権限で書き込める cgroup が用意されていることになります.それをそのまま使ってます.(多分.間違いの指摘歓迎!)
      • UpstartUbuntu なのに systemd を入れて使ってるというのが何かちょっと美しくなく,とりあえず感満載なのですが,これはおそらくそのうち cgmanager の完成度が上がればそちらを使うことで不要になるのかと想像しています.
  • "A version of PAM with a loginuid patch that’s yet to be in any released version" と書かれてますが,普通に最新の PAM だと loginuid モジュール入ってますね.それだけじゃダメなのかな? これは私も知りません.
  • LXC 1.0beta2 以降

とにかく Ubuntu 14.04 の開発版で LXC の最近のものを使えば,前述のブログエントリの通り,あまり手間をかけることなくコンテナの起動が可能です.

(続く)