
私の理解では、階層 13 は「name=systemd」を指しており、次のようにして、docker 開発環境内でやや単純な lxc-execute を実行しようとしています。
docker run -i -t --cap-add=SYS_PTRACE --cap-add=SYS_ADMIN lxc-build:phantomjs-test
設定ファイル
lxc.arch = x86_64
lxc.rootfs.path = /home/tester
lxc.uts.name = phantom_container
lxc.idmap = u 0 1000 65536
lxc.idmap = g 0 1000 65536
lxc.pty.max = 1
lxc.tty.max = 1
lxc.execute.cmd = phantomjs
lxc 実行
/home/tester # XDG_RUNTIME_DIR='' lxc-execute --name bork -f /home/tester/default.conf -l TRACE -o okay.log
痕跡
/home/tester # cat okay.log
INFO lxc_confile - confile.c:set_config_idmaps:1575 - Read uid map: type u nsid 0 hostid 1000 range 65536
INFO lxc_confile - confile.c:set_config_idmaps:1575 - Read uid map: type g nsid 0 hostid 1000 range 65536
TRACE lxc_commands - commands.c:lxc_cmd_init:1323 - Creating abstract unix socket "/usr/local/var/lib/lxc/bork/command"
TRACE lxc_start - start.c:lxc_init_handler:563 - Unix domain socket 4 for command server is ready
TRACE lxc_start - start.c:lxc_init:578 - initialized LSM
TRACE lxc_start - start.c:lxc_init:584 - read seccomp policy
TRACE lxc_start - start.c:lxc_serve_state_clients:350 - Set container state to STARTING
TRACE lxc_start - start.c:lxc_serve_state_clients:353 - No state clients registered
TRACE lxc_start - start.c:lxc_init:591 - set container state to "STARTING"
TRACE lxc_start - start.c:lxc_init:619 - set environment variables
TRACE lxc_start - start.c:lxc_init:625 - ran pre-start hooks
DEBUG lxc_start - start.c:setup_signal_fd:278 - Set SIGCHLD handler with file descriptor: 5.
TRACE lxc_start - start.c:lxc_init:636 - set up signal fd
DEBUG console - console.c:lxc_console_peer_default:513 - using "/dev/tty" as peer tty device
DEBUG console - console.c:lxc_console_signal_init:178 - Created signal fd 9
DEBUG console - console.c:lxc_console_winsz:86 - Set window size to 204 columns and 59 rows
TRACE lxc_start - start.c:lxc_init:643 - created console
TRACE lxc_conf - conf.c:lxc_ttys_shift_ids:2870 - chowned console "/dev/pts/1"
TRACE lxc_start - start.c:lxc_init:649 - shifted tty ids
INFO lxc_start - start.c:lxc_init:651 - container "bork" is initialized
DEBUG storage - storage/storage.c:storage_query:252 - Detected rootfs type "dir"
INFO lxc_cgroup - cgroups/cgroup.c:cgroup_init:67 - cgroup driver cgroupfs initing for bork
# I've been really focused on this error
ERROR lxc_cgfs - cgroups/cgfs.c:lxc_cgroupfs_create:901 - Could not find writable mount point for cgroup hierarchy 13 while trying to create cgroup.
ERROR lxc_start - start.c:lxc_spawn:1245 - Failed creating cgroups.
DEBUG lxc_network - network.c:lxc_delete_network:3123 - Deleted network devices
TRACE lxc_start - start.c:lxc_serve_state_clients:350 - Set container state to ABORTING
TRACE lxc_start - start.c:lxc_serve_state_clients:353 - No state clients registered
ERROR lxc_start - start.c:__lxc_start:1503 - Failed to spawn container "bork".
TRACE lxc_start - start.c:lxc_serve_state_clients:350 - Set container state to STOPPING
TRACE lxc_start - start.c:lxc_serve_state_clients:353 - No state clients registered
TRACE lxc_start - start.c:lxc_serve_state_clients:350 - Set container state to STOPPED
TRACE lxc_start - start.c:lxc_serve_state_clients:353 - No state clients registered
1 つの実行可能ファイルをコンテナ化しようとしていますが、コンテナ内のコンテナ全体が少しわかりにくいように思われるため、cgroup のみを使用する必要があるのではないかと考え始めています。
tester@04de411cd0fe:~$ cat /proc/1/cgroup
13:name=systemd:/docker-ce/docker/04de411cd0fe22b59d5508bbfc137631d1867b9a56104d9db80ca66b061f4b1f
12:pids:/docker-ce/docker/04de411cd0fe22b59d5508bbfc137631d1867b9a56104d9db80ca66b061f4b1f
11:hugetlb:/docker-ce/docker/04de411cd0fe22b59d5508bbfc137631d1867b9a56104d9db80ca66b061f4b1f
10:net_prio:/docker-ce/docker/04de411cd0fe22b59d5508bbfc137631d1867b9a56104d9db80ca66b061f4b1f
9:perf_event:/docker-ce/docker/04de411cd0fe22b59d5508bbfc137631d1867b9a56104d9db80ca66b061f4b1f
8:net_cls:/docker-ce/docker/04de411cd0fe22b59d5508bbfc137631d1867b9a56104d9db80ca66b061f4b1f
7:freezer:/docker-ce/docker/04de411cd0fe22b59d5508bbfc137631d1867b9a56104d9db80ca66b061f4b1f
6:devices:/docker-ce/docker/04de411cd0fe22b59d5508bbfc137631d1867b9a56104d9db80ca66b061f4b1f
5:memory:/docker-ce/docker/04de411cd0fe22b59d5508bbfc137631d1867b9a56104d9db80ca66b061f4b1f
4:blkio:/docker-ce/docker/04de411cd0fe22b59d5508bbfc137631d1867b9a56104d9db80ca66b061f4b1f
3:cpuacct:/docker-ce/docker/04de411cd0fe22b59d5508bbfc137631d1867b9a56104d9db80ca66b061f4b1f
2:cpu:/docker-ce/docker/04de411cd0fe22b59d5508bbfc137631d1867b9a56104d9db80ca66b061f4b1f
1:cpuset:/docker-ce/docker/04de411cd0fe22b59d5508bbfc137631d1867b9a56104d9db80ca66b061f4b1f
どのような場合に systemd を書き込み可能としてマウントする必要がありますか? lxc/systemd が systemd のマウントを要求するのはなぜですか?
tester@04de411cd0fe:~$ mount | grep cgroup
tmpfs on /sys/fs/cgroup type tmpfs (ro,nosuid,nodev,noexec,relatime,mode=755)
cpuset on /sys/fs/cgroup/cpuset type cgroup (ro,nosuid,nodev,noexec,relatime,cpuset)
cpu on /sys/fs/cgroup/cpu type cgroup (ro,nosuid,nodev,noexec,relatime,cpu)
cpuacct on /sys/fs/cgroup/cpuacct type cgroup (ro,nosuid,nodev,noexec,relatime,cpuacct)
blkio on /sys/fs/cgroup/blkio type cgroup (ro,nosuid,nodev,noexec,relatime,blkio)
memory on /sys/fs/cgroup/memory type cgroup (ro,nosuid,nodev,noexec,relatime,memory)
devices on /sys/fs/cgroup/devices type cgroup (ro,nosuid,nodev,noexec,relatime,devices)
freezer on /sys/fs/cgroup/freezer type cgroup (ro,nosuid,nodev,noexec,relatime,freezer)
net_cls on /sys/fs/cgroup/net_cls type cgroup (ro,nosuid,nodev,noexec,relatime,net_cls)
perf_event on /sys/fs/cgroup/perf_event type cgroup (ro,nosuid,nodev,noexec,relatime,perf_event)
net_prio on /sys/fs/cgroup/net_prio type cgroup (ro,nosuid,nodev,noexec,relatime,net_prio)
hugetlb on /sys/fs/cgroup/hugetlb type cgroup (ro,nosuid,nodev,noexec,relatime,hugetlb)
pids on /sys/fs/cgroup/pids type cgroup (ro,nosuid,nodev,noexec,relatime,pids)
cgroup on /sys/fs/cgroup type tmpfs (rw,relatime,mode=755)
cgroup on /sys/fs/cgroup type tmpfs (rw,relatime,mode=755)
/home/tester # cat /proc/cgroups
#subsys_name hierarchy num_cgroups enabled
cpuset 1 22 1
cpu 2 22 1
cpuacct 3 22 1
blkio 4 22 1
memory 5 23 1
devices 6 22 1
freezer 7 22 1
net_cls 8 22 1
perf_event 9 22 1
net_prio 10 22 1
hugetlb 11 22 1
pids 12 22 1
ubuntu 17.04、16.04、alpine:latest の docker イメージを使用してみましたが、すべて同じ結果になりました。lxc 2.07、2.08、2.1.1 を使用してみましたが、ほとんど同じ結果になりました。
学習の過程で、私は同様のエラーを解決することができました:
- cgroup を作成しようとしたときに、cgroup 階層 4 の書き込み可能なマウント ポイントが見つかりませんでした。
- cgroup を作成しようとしたときに、cgroup 階層 5 の書き込み可能なマウント ポイントが見つかりませんでした。
- cgroup を作成しようとしたときに、cgroup 階層 6 の書き込み可能なマウント ポイントが見つかりませんでした。
- cgroup を作成しようとしたときに、cgroup 階層 7 の書き込み可能なマウント ポイントが見つかりませんでした。
- cgroup を作成しようとしたときに、cgroup 階層 8 の書き込み可能なマウント ポイントが見つかりませんでした。
- cgroup を作成しようとしたときに、cgroup 階層 9 の書き込み可能なマウント ポイントが見つかりませんでした。
- cgroup を作成しようとしたときに、cgroup 階層 10 の書き込み可能なマウント ポイントが見つかりませんでした。
- cgroup を作成しようとしたときに、cgroup 階層 11 の書き込み可能なマウント ポイントが見つかりませんでした。
- cgroup を作成しようとしたときに、cgroup 階層 12 の書き込み可能なマウント ポイントが見つかりませんでした。
2 つの異なる方法を使用して、最初の 12 については標準の cgroup 階層のマウントの問題を解決したと思いますが、何らかの理由で 13 は機能しません。
- マウント -t cgroup cpuset -o cpuset /sys/fs/cgroup/cpuset/
- cd project && mkdir -p sys/fs/cgroup/{net_prio,pids,hugetlb,freezer,cpuset,cpu,devices,perf_event,memory,cpuacct,net_cls,blkio} # その後、rootfs または mount.entry タイプの config を使用します
その他の関連情報:
cat /etc/*-release
3.6.2
NAME="Alpine Linux"
ID=alpine
VERSION_ID=3.6.2
PRETTY_NAME="Alpine Linux v3.6"
HOME_URL="http://alpinelinux.org"
BUG_REPORT_URL="http://bugs.alpinelinux.org"
ユーネーム -a
Linux 8fd6247b5665 4.9.60-linuxkit-aufs #1 SMP Mon Nov 6 16:00:12 UTC 2017 x86_64 Linux
lxc-execute --version
2.1.0-devel
docker バージョン
Version 17.11.0-ce-mac40 (20561)
Channel: edge
d8fd0f1f4a
これらのプルリクエストはどの程度関連しているでしょうか:
関連する考えや質問としては、コンテナ内でコンテナを使用するのではなく、完全な VM を使用する必要がある (使いやすさの問題は解決されない) というものがあります。
- 再コンパイルしてみてはいかがでしょうか? systemd?
- カーネルのブートパラメータに何か関係があるのでしょうか?
- おそらく、cgroupv1 と cgroupv2 の間違ったバージョンを使用しているのでしょうか?
- cgroup 階層のマウントを無効にすることは可能ですか?
- これは、docker が /sbin/init を実行し、初期の cgroup 名前空間を開始する方法に関係していますか?
ご協力いただければ幸いです。
関連している可能性のあるもの:
- /sys/fs/cgroup/systemd/ と /sys/fs/cgroup/xxx/ の違いは何ですか
- https://stackoverflow.com/questions/29378051/inconsistent-runtime-kernel-parameters-in-docker-container-and-on-host
- 参考:
- 参考:
- https://github.com/moby/moby/issues/10176
そこでさらに調査を進め、次のような初期の cgroup cgfs に関する情報も見つけましたname=systemd
。
/home/tester # cat /usr/share/doc/lxcfs/README.Debian
...
/home/tester # cat /usr/share/pam-configs/cgfs
Name: Create cgroups for user login sessions
Default: yes
Priority: 0
Session-Type: Additional
Session:
optional pam_cgfs.so -c freezer,memory,name=systemd
/home/tester # cat /etc/pam.d/common-session
session [default=1] pam_permit.so
session requisite pam_deny.so
session required pam_permit.so
session optional pam_umask.so
session required pam_unix.so
session optional pam_systemd.so
session optional pam_cgfs.so -c freezer,memory,name=systemd