一般ユーザでのコンテナの起動
一般ユーザでコンテナを起動するには,
Ubuntu 14. 04 LTS の場合
Ubuntu 14.lxc-create
でコンテナが作成できれば,lxc-start
でコンテナを起動できます。
あとでcgroupの制限が有効になっているのかを確認するために,ct01
の設定ファイルにcgroupの設定を足しておきます。以下のような2行を追加しました。
$ grep cgroup .local/share/lxc/ct01/config lxc.cgroup.cpu.shares = 1000 lxc.cgroup.memory.limit_in_bytes = 512m
それでは起動しましょう。
$ lxc-ls -f NAME STATE IPV4 IPV6 AUTOSTART ------------------------------------ ct01 STOPPED - - NO $ lxc-start -n ct01 -d $ lxc-ls -f NAME STATE IPV4 IPV6 AUTOSTART ------------------------------------------ ct01 RUNNING 10.0.3.218 - NO
無事実行できましたね。このようにUbuntuだと簡単に一般ユーザ権限でコンテナが実行できます。
この起動したコンテナできちんとcgroupを使ったリソース制限が効いているか確認するために,
CGManagerは新しいマウント名前空間を作成してその中でcgroupfsをマウントしますので,
$ sudo ./nsenter -t `pgrep cgmanager` --mount -- \ > ls -F /run/cgmanager/fs/cpu/user/1000.user/3.session cgroup.clone_children cpu.cfs_period_us cpu.stat tasks cgroup.event_control cpu.cfs_quota_us ct01/ cgroup.procs cpu.shares notify_on_release
ご覧のようにcgmanagerが作成したマウント名前空間内の/run/
以下にct01
というディレクトリがあります。1000.
や3.
はログインユーザやログインセッションによって変化します。
Ubuntu 14.systemd-logind
によりユーザのログインセッション用のcgroupが/sys/
以下に作成されます。CGManagerはそのグループをそのまま使っているようです。
$ ls -ld /sys/fs/cgroup/systemd/user/1000.user/3.session/ (ホストOSの名前空間で実行) drwxr-xr-x 3 ubuntu ubuntu 0 Jan 6 17:01 /sys/fs/cgroup/systemd/user/1000.user/3.session/
では,ct01
用のcgroupで反映されているか確認してみましょう。
$ sudo ./nsenter -t `pgrep cgmanager` --mount -- \ > cat /run/cgmanager/fs/cpu/user/1000.user/3.session/ct01/cpu.shares 1000 $ sudo ./nsenter -t `pgrep cgmanager` --mount -- \ > cat /run/cgmanager/fs/memory/user/1000.user/3.session/ct01/memory.limit_in_bytes 536870912
確かに先に設定した通りの値になっています。
以上のように一般ユーザで作成したコンテナがきちんと起動し,
作成されたコンテナは先に述べたようにアクセスできるユーザやパスワードの設定がされていませんので,lxc-attach
コマンドを使って設定したり,
一般ユーザで操作可能なcgroup
Plamo Linuxや,
$ cat /etc/rc.d/init.d/cgroups-mount-user
#!/bin/sh
# mount cgroup filesystems per subsystem for user name space
USERNS="taro hanako"
start() {
echo 1 > /sys/fs/cgroup/memory/memory.use_hierarchy
for c in /sys/fs/cgroup/* ; do
echo 1 > $c/cgroup.clone_children
for u in $USERNS ; do
mkdir -p $c/$u
chown -R $u $c/$u
if [ ${c##*/} == cpuset ] ; then
echo 0 > $c/$u/cpuset.cpus
echo 0 > $c/$u/cpuset.mems
fi
done
done
}
stop() {
:
}
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
stop
start
;;
*)
echo $"Usage: $0 {start|stop|restart}"
exit 1
;;
esac
このスクリプトは
- memoryサブシステムで階層構造が使えるように設定する
- cpusetサブシステムで親のcgroupの設定を子に引き継ぐように設定する
- ユーザ名のcgroupを作成し,
chownする - cpusetサブシステムが使えるようにcpuset.
cpusとcpuset. memsに初期値を入れる
という操作を指定したユーザごとに実行しています。
ユーザ用のcgroupが準備できたら,lxc-start
を実行するシェルで以下のように実行し,tasks
に登録します。
$ for d in /sys/fs/cgroup/*/${USER} > do > echo $$ > $d/tasks > done
これで準備ができたのでコンテナを開始します。
$ lxc-ls -f NAME STATE IPV4 IPV6 GROUPS AUTOSTART ------------------------------------------------ ct01 STOPPED - - - NO $ lxc-start -n ubuntu01 $ lxc-ls -f NAME STATE IPV4 IPV6 GROUPS AUTOSTART -------------------------------------------------------- ct01 RUNNING 10.0.100.188 - - NO
まとめ
今回は一般ユーザでコンテナを作成し,
Ubuntuだと各ユーザのサブIDを設定し,
一般ユーザによるコンテナの話題は今回で終わりです。次回からは,