前回は、
今回は、
pam_cgfs
コンテナのネストを試す前に、
Ubuntuではこれまで、
pam_/etc/
以下にある、common-session
やcommon-session-noninteractive
で、
session optional pam_cgfs.so -c freezer,memory,name=systemd
オプションでユーザ向けのcgroupを作成するcgroupfsツリーを指定しています。16.
これでログイン時にpam_
非特権コンテナのネスト
LXCは一般ユーザによる特権を持たないコンテナでもネストをサポートしています。前回に試した特権コンテナと同じように、
一般ユーザでコンテナを作成し、
ここでは、ubuntu
ユーザを利用しています。
非特権コンテナをネストさせる場合のIDマッピング
非特権コンテナ内で非特権コンテナを動かす際には注意が必要です。非特権コンテナの場合、
Ubuntuではユーザを追加すると、/etc/
、/etc/
に65536個のサブIDの定義を追加します。例えば次のようになっています。
ubuntu@host:~$ grep ubuntu /etc/sub{u,g}id /etc/subuid:ubuntu:165536:65536 /etc/subgid:ubuntu:165536:65536
これは通常システムを起動すると65536個のIDを使うためです。ホストOS上で上のような設定で非特権コンテナを起動すると、

コンテナをネストさせて、

ネストした非特権コンテナの作成と起動
それでは早速コンテナを作成し、
ubuntu@host:~$ grep ubuntu /etc/sub{u,g}id
/etc/subuid:ubuntu:165536:131072
/etc/subgid:ubuntu:165536:131072
(ホストOS上でサブIDを165536から131072個割り当てる許可)
準備ができたらコンテナを作成します。ユーザ権限で起動した親コンテナですのでuser-parent
と名づけました。
ubuntu@host:~$ lxc-create -t download -n user-parent -- -d ubuntu -r xenial -a amd64 (親コンテナ作成) :(設定ファイルの編集) ubuntu@host:~$ tail -n3 .local/share/lxc/user-parent/config lxc.include = /usr/share/lxc/config/nesting.conf (ネストのための設定ファイルのinclude) lxc.id_map = u 0 165536 131072 lxc.id_map = g 0 165536 131072 (ホストのID 165536から131072個使用する設定)
作成できたら、nesting.
のinclude設定と、
それでは、
ubuntu@host:~$ lxc-start -n user-parent
ubuntu@host:~$ lxc-attach -n user-parent
root@user-parent:~# apt-get install lxc (親コンテナにLXCインストール)
LXCのインストール後に、
ubuntu@user-parent:~$ cat /etc/sub{u,g}id
ubuntu:65536:65536
ubuntu:65536:65536
(親コンテナ上でサブIDを65536から65536個割り当てる許可)
設定ができたら、
ここでuser-parent
コンテナ上で、ubuntu
ユーザ)/sys/
以下に存在するサブシステム用のディレクトリmemory
やfreezer
配下のツリーにユーザ権限のcgroupが作成されているかチェックしてください。
親コンテナにopenssh-server
をインストールしてubuntu
ユーザでsshログインするか、lxc-console
コマンドで親コンテナのコンソールにアクセスしubuntu
ユーザでログインすると、lxc-attach
コマンドでコンテナに入り、su
コマンドでubuntu
ユーザにスイッチした場合はcgroupが作られずにコンテナの起動に失敗しました。
$ ls -l /sys/fs/cgroup/freezer/user/ubuntu/ total 0 drwxr-xr-x 2 ubuntu ubuntu 0 Oct 4 10:51 0 (←ubuntuユーザ権限で書き込めるcgroupが存在している) :(略)
cgroupが存在していることが確認できたらコンテナを作成します。user-child
と名づけました。
ubuntu@user-parent:~$ lxc-create -t download -n user-child -- -d ubuntu -r xenial -a amd64 (親コンテナ上で非特権コンテナ"user-child"を作成) ubuntu@user-parent:~$ grep id_map .local/share/lxc/user-child/config lxc.id_map = u 0 65536 65536 lxc.id_map = g 0 65536 65536 (親コンテナのID 65536から65536個のIDを割り当てる設定)
上のように、
ubuntu@user-parent:~$ lxc-start -n user-child ubuntu@user-parent:~$ lxc-ls -f NAME STATE AUTOSTART GROUPS IPV4 IPV6 user-child RUNNING 0 - 10.0.4.62 -
無事起動しました。
ネストした非特権コンテナのcgroup
前回、
ホスト上からfreezerサブシステムの様子を見てみます。
ubuntu@host:~$ tree -d /sys/fs/cgroup/freezer/ /sys/fs/cgroup/freezer/ └── user ├── root │ └── 0 └── ubuntu └── 0 └── lxc └── user-parent (親コンテナ) └── user ├── root │ └── 0 └── ubuntu └── 0 └── lxc └── user-child (子コンテナ) 14 directories
ここで、
はpam_
がユーザ用に作成したcgroupです。
親コンテナからfreezerサブシステム以下を見ると、user-parent
より下のツリーが見えていることがわかります。非特権コンテナの場合でも、
ubuntu@user-parent:~$ tree -d /sys/fs/cgroup/freezer/ /sys/fs/cgroup/freezer/ └── user ├── root │ └── 0 └── ubuntu └── 0 └── lxc └── user-child 7 directories
user-child
コンテナ内から見ると、
root@user-child:~# tree /sys/fs/cgroup/freezer/ /sys/fs/cgroup/freezer/ ├── cgroup.clone_children ├── cgroup.procs ├── freezer.parent_freezing ├── freezer.self_freezing ├── freezer.state ├── notify_on_release └── tasks 0 directories, 7 files
まとめ
以上のように、
今回紹介したネストでは、
なぜなら、
今回紹介したような、
その他に、
さて、