Ich benutze nichtprivilegierte lxcContainer in Arch Linux. Hier sind die grundlegenden Systeminfos:
[chb@conventiont ~]$ uname -a
Linux conventiont 3.17.4-Chb #1 SMP PREEMPT Fri Nov 28 12:39:54 UTC 2014 x86_64 GNU/Linux
Es ist ein angepasster / kompilierter Kernel mit user namespace enabled:
[chb@conventiont ~]$ lxc-checkconfig
--- Namespaces ---
Namespaces: enabled
Utsname namespace: enabled
Ipc namespace: enabled
Pid namespace: enabled
User namespace: enabled
Network namespace: enabled
Multiple /dev/pts instances: enabled
--- Control groups ---
Cgroup: enabled
Cgroup clone_children flag: enabled
Cgroup device: enabled
Cgroup sched: enabled
Cgroup cpu account: enabled
Cgroup memory controller: enabled
Cgroup cpuset: enabled
--- Misc ---
Veth pair device: enabled
Macvlan: enabled
Vlan: enabled
File capabilities: enabled
Note : Before booting a new kernel, you can check its configuration
usage : CONFIG=/path/to/config /usr/bin/lxc-checkconfig
[chb@conventiont ~]$ systemctl --version
systemd 217
+PAM -AUDIT -SELINUX -IMA -APPARMOR +SMACK -SYSVINIT +UTMP +LIBCRYPTSETUP +GCRYPT +GNUTLS +ACL +XZ +LZ4 +SECCOMP +BLKID -ELFUTILS +KMOD +IDN
Leider systemdspielt das lxcmomentan nicht gut mit . Insbesondere das Einrichten cgroupsfür einen Nicht-Root-Benutzer scheint nicht gut zu funktionieren, oder ich bin einfach zu ungewohnt, wie dies zu tun ist. lxcstartet einen Container nur im nichtprivilegierten Modus, wenn er die erforderlichen Gruppen erstellen kann /sys/fs/cgroup/XXX/*. Dies ist jedoch nicht möglich, lxcda systemddie rootcgroup-Hierarchie darin eingebunden ist /sys/fs/cgroup/*. Eine Problemumgehung scheint darin zu bestehen, Folgendes zu tun:
for d in /sys/fs/cgroup/*; do
f=$(basename $d)
echo "looking at $f"
if [ "$f" = "cpuset" ]; then
echo 1 | sudo tee -a $d/cgroup.clone_children;
elif [ "$f" = "memory" ]; then
echo 1 | sudo tee -a $d/memory.use_hierarchy;
fi
sudo mkdir -p $d/$USER
sudo chown -R $USER $d/$USER
echo $$ > $d/$USER/tasks
done
Dieser Code erstellt die entsprechenden cgroupVerzeichnisse in der cgroupHierarchie für einen nicht privilegierten Benutzer. Es passiert jedoch etwas, was ich nicht verstehe. Vor dem Ausführen des oben genannten werde ich Folgendes sehen:
[chb@conventiont ~]$ cat /proc/self/cgroup
8:blkio:/
7:net_cls:/
6:freezer:/
5:devices:/
4:memory:/
3:cpu,cpuacct:/
2:cpuset:/
1:name=systemd:/user.slice/user-1000.slice/session-c1.scope
Nachdem ich den oben genannten Code ausgeführt habe, sehe ich in der Shell, in der ich ihn ausgeführt habe:
[chb@conventiont ~]$ cat /proc/self/cgroup
8:blkio:/chb
7:net_cls:/chb
6:freezer:/chb
5:devices:/chb
4:memory:/chb
3:cpu,cpuacct:/chb
2:cpuset:/chb
1:name=systemd:/chb
Aber in jeder anderen Hülle sehe ich noch:
[chb@conventiont ~]$ cat /proc/self/cgroup
8:blkio:/
7:net_cls:/
6:freezer:/
5:devices:/
4:memory:/
3:cpu,cpuacct:/
2:cpuset:/
1:name=systemd:/user.slice/user-1000.slice/session-c1.scope
Daher kann ich meinen nichtprivilegierten lxcContainer in der Shell starten , in der ich den oben genannten Code ausgeführt habe, aber in keiner anderen.
Kann jemand dieses Verhalten erklären?
Hat jemand eine bessere Möglichkeit gefunden, die
cgroupsmit einer aktuellen Version vonsystemd(>= 217) benötigten einzurichten ?