* https://www.stgraber.org/2014/01/17/lxc-1-0-unprivileged-containers/
上記の非特権コンテナの要件に
* Kernel: 3.13 + a couple of staging patches (which Ubuntu has in its kernel)
* User namespaces enabled in the kernel
* A very recent version of shadow that supports subuid/subgid
* Per-user cgroups on all controllers (which I turned on a couple of weeks ago)
* LXC 1.0 beta2 or higher (released two days ago)
* A version of PAM with a loginuid patch that’s yet to be in any released version
とある.
* まず lxc/src/lxc/cgroup.c で
static bool find_cgroup_hierarchies(struct cgroup_meta_data *meta_data,
bool all_kernel_subsystems, bool all_named_subsystems,
const char **subsystem_whitelist)
{
FILE *proc_self_cgroup;
char *line = NULL;
size_t sz = 0;
int r;
bool bret = false;
size_t hierarchy_capacity = 0;
proc_self_cgroup = fopen_cloexec("/proc/self/cgroup", "r");
/* if for some reason (because of setns() and pid namespace for example)
,
* /proc/self is not valid, we try /proc/1/cgroup... */
if (!proc_self_cgroup)
proc_self_cgroup = fopen_cloexec("/proc/1/cgroup", "r");
if (!proc_self_cgroup)
return false;
while (getline(&line, &sz, proc_self_cgroup) != -1) {
/* file format: hierarchy:subsystems:group,
* we only extract hierarchy and subsystems
* here */
こんなコードがあり,/proc/self/cgroup から「現在の cgroup」を取得するようになってる
* Ubuntu 14.04 だと一般ユーザでログインするとkarma@lxctest02:~$ id
uid=1000(karma) gid=1000(karma) groups=1000(karma),27(sudo)
karma@lxctest02:~$ cat /proc/self/cgroup
11:name=systemd:/user/1000.user/5.session
10:hugetlb:/user/1000.user/5.session
9:perf_event:/user/1000.user/5.session
8:blkio:/user/1000.user/5.session
7:freezer:/user/1000.user/5.session
6:devices:/user/1000.user/5.session
5:memory:/user/1000.user/5.session
4:cpuacct:/user/1000.user/5.session
3:cpu:/user/1000.user/5.session
2:cpuset:/user/1000.user/5.session
* ここは書き込み権がある karma@lxctest02:~$ LANG=C ls -ld /sys/fs/cgroup/cpu/user/1000.user/5.session
drwxr-xr-x 2 karma karma 0 Jan 20 10:37 /sys/fs/cgroup/cpu/user/1000.user/5.session
* ちなみに普通に echo $$ > tasks みたいに cgroup に登録する.以下のコード #!/bin/bash
for c in /sys/fs/cgroup/*
do
sudo mkdir $c/karma
sudo chown -R karma: $c/karma
if [ `basename $c` = "cpuset" ]; then
echo 0 > $c/karma/cpuset.cpus
echo 0 > $c/karma/cpuset.mems
fi
echo $PID > $c/karma/tasks
done
を実行すると,当然 karma@lxctest02:~$ cat /proc/self/cgroup
11:name=systemd:/karma
10:hugetlb:/karma
9:perf_event:/karma
8:blkio:/karma
7:freezer:/karma
6:devices:/karma
5:memory:/karma
4:cpuacct:/karma
3:cpu:/karma
2:cpuset:/karma
* /sys/fs/cgroup/user/1000.user/5.session みたいなのは誰が作ってるのか? どうも systemd のデーモンのどれかっぽい.(pam_loginuid 使って?) int cg_path_get_session(const char *path, char **session) {
const char *e, *n;
char *s;
assert(path);
assert(session);
e = path_startswith(path, "/user/");
if (!e)
return -ENOENT;
/* Skip the user name */
e = skip_label(e);
if (!e)
return -ENOENT;
n = strchrnul(e, '/');
if (n - e < 8)
return -ENOENT;
if (memcmp(n - 8, ".session", 8) != 0)
return -ENOENT;
s = strndup(e, n - e - 8);
if (!s)
return -ENOMEM;
*session = s;
return 0;
}
systemd/src/shared/cgroup-util.c