Uso lxccontenitori non privilegiati Arch Linux. Ecco le informazioni di base sul sistema:
[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
È un kernel personalizzato / compilato con 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
Purtroppo, al momento systemdnon gioca bene lxc. Soprattutto l'impostazione cgroupsper un utente non root sembra non funzionare bene o non ho familiarità con il modo di farlo. lxcavvierà un contenitore in modalità senza privilegi solo quando può creare i cgroup necessari /sys/fs/cgroup/XXX/*. Questo tuttavia non è possibile lxcperché systemdmonta la rootgerarchia di cgroup in /sys/fs/cgroup/*. Una soluzione alternativa sembra essere la seguente:
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
Questo codice crea le cgroupdirectory corrispondenti nella cgroupgerarchia per un utente non privilegiato. Tuttavia, succede qualcosa che non capisco. Prima di eseguire quanto sopra vedrò questo:
[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
Dopo aver eseguito il codice di cui sopra che vedo nella shell, l'ho eseguito in:
[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
Ma in qualsiasi altra shell vedo ancora:
[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
Quindi, posso avviare il mio lxccontenitore senza privilegi nella shell che ho eseguito il codice sopra menzionato ma non in nessun altro.
Qualcuno può spiegare questo comportamento?
Qualcuno ha trovato un modo migliore per impostare il necessario
cgroupscon una versione corrente disystemd(>= 217)?