Uso lxc
contenitori 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 systemd
non gioca bene lxc
. Soprattutto l'impostazione cgroups
per un utente non root sembra non funzionare bene o non ho familiarità con il modo di farlo. lxc
avvierà un contenitore in modalità senza privilegi solo quando può creare i cgroup necessari /sys/fs/cgroup/XXX/*
. Questo tuttavia non è possibile lxc
perché systemd
monta la root
gerarchia 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 cgroup
directory corrispondenti nella cgroup
gerarchia 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 lxc
contenitore 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
cgroups
con una versione corrente disystemd
(>= 217
)?