前回は /proc/$PID/cgroup ファイルが Namespace を反映した形で記載されているのを見ました。
とりあえずここまで。これだけだとすでにマウントされている cgroupfs はそのままの元のディレクトリ階層で見えるので、/proc/$PID/cgroup だけ見え方が変わっても意味がないような気がしますが、改めて cgroupfs のマウントを試すとエラーになりますし、どうするものなのかちょっとまだ見えてないので、またわかれば続編を書く予定です。
と書きましたが、試したところちゃんと cgroupfs も Namespace ごとに見えるようになったので紹介しておきます。前回何をボケて失敗していたのかわかりませんが、以下のように普通に簡単な処理をやっただけです。
- まずは "test01" cgroup を作成します (memory だけ)
# mkdir -p /sys/fs/cgroup/memory/test01/
- 現在のシェルを "test01" の tasks に登録します
# echo $$ > /sys/fs/cgroup/memory/test01/tasks
- namespace内の cgroupfs をホストから見て別のところにマウントするために、LXC コンテナ用のツリーを借ります
# cd /var/lib/lxc/test01/rootfs/
- unshare で chroot を実行します
# unshare -C chroot $PWD
- namespace 内で proc をマウントし、/sys/fs/cgroup を tmpfs でマウントします。これは特に不要な気がしますが
# mount -n -t proc proc /proc
# mount -n -t tmpfs none /sys/fs/cgroup/ - memory サブシステムを /sys/fs/cgroup/memory にマウントします
# mkdir /sys/fs/cgroup/memory
# mount -n -t cgroup -o memory memory /sys/fs/cgroup/memory/
マウントできたので、確認してみます。
# ls /sys/fs/cgroup/memory/ cgroup.clone_children memory.memsw.failcnt cgroup.event_control memory.memsw.limit_in_bytes cgroup.procs memory.memsw.max_usage_in_bytes memory.failcnt memory.memsw.usage_in_bytes memory.force_empty memory.move_charge_at_immigrate memory.kmem.failcnt memory.numa_stat memory.kmem.limit_in_bytes memory.oom_control memory.kmem.max_usage_in_bytes memory.pressure_level memory.kmem.slabinfo memory.soft_limit_in_bytes memory.kmem.tcp.failcnt memory.stat memory.kmem.tcp.limit_in_bytes memory.swappiness memory.kmem.tcp.max_usage_in_bytes memory.usage_in_bytes memory.kmem.tcp.usage_in_bytes memory.use_hierarchy memory.kmem.usage_in_bytes notify_on_release memory.limit_in_bytes tasks memory.max_usage_in_bytes
普通にマウントできていて、"test01" cgroup は存在しませんね。つまりここが cgroupfs のルートなわけです。
では、ここに "test02" cgroup を作ってみましょう。
root@enterprise:~# mkdir /sys/fs/cgroup/memory/test02 root@enterprise:~# ls -d /sys/fs/cgroup/memory/test02 /sys/fs/cgroup/memory/test02/ root@enterprise:~# ls /sys/fs/cgroup/memory/test02 cgroup.clone_children memory.memsw.failcnt cgroup.event_control memory.memsw.limit_in_bytes cgroup.procs memory.memsw.max_usage_in_bytes :(略)
/sys/fs/cgroup/memory 直下に test02 というディレクトリができて、中も普通にファイルができています。
"test02" にプロセスを登録して /proc/$PID/cgroup を確認してみましょう。
# echo $$ > /sys/fs/cgroup/memory/test02/tasks # echo $$ 8574 # cat /proc/self/cgroup 14:debug:/ 13:pids:/ 12:hugetlb:/ 11:net_prio:/ 10:perf_event:/ 9:net_cls:/ 8:freezer:/ 7:devices:/ 6:memory:/test02 5:blkio:/ 4:cpuacct:/ 3:cpu:/ 2:cpuset:/ 1:name=systemd:/
ちゃんと Namespace 内の cgroup ツリーになってますね。
ここで、元のホスト上の Namespace から "test01" と "test02" を確認してみましょう。
$ ls -d /sys/fs/cgroup/memory/test01 /sys/fs/cgroup/memory/test01/ $ ls -d /sys/fs/cgroup/memory/test01/test02 /sys/fs/cgroup/memory/test01/test02/
作成した cgroup namespace の外では "test01" の下に "test02" がありますね。tasks ファイルも確認してみると、
$ cat /sys/fs/cgroup/memory/test01/test02/tasks 8574
シェルの PID が登録されていますね。