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

第17回 LXCの構築・活用 [4] ― 一般ユーザによるLXCコンテナの利用

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

前回は一般ユーザでコンテナを起動する際に利用するカーネルのユーザ名前空間について紹介しました。

今回はそのユーザ名前空間を使って実現している,一般ユーザによるLXCコンテナの作成や起動の方法について説明します。一般ユーザによるコンテナの利用については第14回にPlamo Linuxでの例を簡単に紹介しています。今回はUbuntu 14.04 LTSを使って改めて整理して説明すると同時に,他のディストリビューションの場合の説明も行います。

一般ユーザでコンテナを利用できるディストリビューション

第16回でユーザ名前空間で複数のIDのマッピングを行うためにshadowに導入された「サブID」を紹介しました。

一般ユーザでLXCコンテナを利用する場合は,ユーザに対して「サブID」を設定し,サブIDを使ってユーザ名前空間用のマッピングを設定できる環境が必要です。

Ubuntu 14.04 LTS以降は当然この対応が済んだshadowを使っていますし,第14回で紹介したようにPlamo Linuxの現在のバージョンである5.3でもサブIDの設定が可能になっています。

筆者は,以上の2つのディストリビューションをコンテナホストとした場合で,一般ユーザでコンテナの利用ができることを確認しています。他に,確認はしていませんが,shadowのバージョンを見る限りではArchとDebianのjessie以上で動きそうです。

一般ユーザでコンテナを利用する場合のOSでの準備

一般ユーザでLXCコンテナを利用する場合は,先に説明したようにサブIDの設定が必要です。

Ubuntu 14.04 LTS以上ではユーザを追加するたびにサブIDが自動的に設定されますのでこの作業を行う必要はありません。

$ cat /etc/subuid /etc/subgid
ubuntu:100000:65536
ubuntu:100000:65536

この例はubuntuというユーザをインストール時に追加したときに設定され たサブIDです。100000から65536個のIDがubuntuで使えるように設定されています。

これとは別の範囲をサブIDとして設定したい場合や,サブIDが使える他のディストリビューションで設定する場合は第16回で説明したようにusermodコマンドを使います。

$ sudo usermod -v 200000-265535 -w 200000-265535 user

-vはUIDのサブIDを,-wはGIDのサブIDの範囲を設定します。

UbuntuのLXCパッケージ使用時の各種パス

一般ユーザでLXCを使ってコンテナを利用する際の設定ファイルなどの場所について第8回で示したのと同様の表を使って紹介しましょう。

ファイル/ディレクトリ root権限の時 一般ユーザの時
システム設定ファイル /etc/lxc/lxc.conf ~/.config/lxc/lxc.conf
コンテナのデフォルト設定ファイル /etc/lxc/default.conf ~/.config/lxc/default.conf
テンプレートファイルの置き場所 /usr/share/lxc/config (root権限の場合と同じ)
コンテナ作成時のキャッシュの置き場所 /var/cache/lxc ~/.cache/lxc
コンテナの保存場所 /var/lib/lxc ~/.local/share/lxc
ログファイルの出力場所 /var/log/lxc ~/.local/share/lxc/(コンテナ名)
一般ユーザが使うネットワークインターフェースの設定ファイル (なし) /etc/lxc/lxc-usernet

root権限の場合のパスは各ディストリビューションのコンパイル時のオプションに依存します。一方で一般ユーザの場合は,システム設定ファイルでデフォルト値を変更しない限りは,どのディストリビューションでも図のようになるはずです。

テンプレートファイルに関しては,root権限用,一般ユーザ用という区別はなく同じテンプレートを使用しますので,一般ユーザ用のテンプレート置き場は存在しません。

一般ユーザでコンテナを利用する場合のLXCの設定

ネットワークインターフェースの設定

第16回で説明したように,一般ユーザでコンテナを扱うためにユーザ名前空間を作成すると,名前空間内でネットワークインターフェースを作成するといった特権が必要な操作は名前空間内のrootユーザで行えます。

現時点では一般ユーザ権限で起動したコンテナと外部の通信をする際は第6回で説明したvethインターフェースを使う必要があります。

コンテナがこのvethインターフェースを使って外部と通信するためには,vethインターフェースを作成した際にできるペアのインターフェースの片側をホストの名前空間に割り当てますので,その際ににはホストOS上での特権が必要となります。

一般ユーザでこの特権が必要な操作をするために,LXCではlxc-user-nicというプログラムを使用します。

$ ls -l /usr/lib/x86_64-linux-gnu/lxc/lxc-user-nic
-rwsr-xr-x 1 root root 34888 Sep 30 17:13 /usr/lib/x86_64-linux-gnu/lxc/lxc-user-nic

このlxc-user-nicはUbuntuでは/usr/lib/x86_64-linux-gnu/lxc/にインストールされています(amd64版)⁠以上のようにsetuidすることにより一般ユーザでも特権が必要なホストOS上でvethインターフェースを扱う操作ができるようになっています

このプログラムは,あらかじめホストOSの管理者が設定しておく/etc/lxc/lxc-usernetというファイルを参照して,ユーザが作成できるインターフェースの数と,作成したインターフェースをホスト上のどのブリッジに接続するかを決めます。

lxc-usernetファイルは以下のような書式で1行に1ユーザの設定を記述します。

(ユーザ名) (インターフェースのタイプ) (接続するブリッジ) (作成できるインターフェースの数)

たとえば,ubuntuユーザがvethインターフェースを10個まで作成でき,作成したインターフェースはlxcbr0に接続する場合は以下のようになります。

ubuntu veth lxcbr0 10

現時点ではインターフェースのタイプはveth以外は指定できません。

著者プロフィール

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

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

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

Twitter:@ten_forward
技術系のブログ:http://tenforward.hatenablog.com/

コメント

コメントの記入