J'utilise des lxc
conteneurs non privilégiés dans Arch Linux
. Voici les informations de base du système:
[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
C'est un noyau personnalisé / compilé avec 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
Malheureusement, systemd
ne joue pas bien avec lxc
actuellement. En particulier, la configuration cgroups
pour un utilisateur non root ne fonctionne pas bien ou je ne sais pas trop comment faire. lxc
démarre un conteneur en mode non privilégié uniquement lorsqu'il peut créer les groupes de contrôle nécessaires dans /sys/fs/cgroup/XXX/*
. Cela n'est cependant pas possible lxc
car il systemd
monte la root
hiérarchie de groupe de contrôle dans /sys/fs/cgroup/*
. Une solution de contournement semble être la suivante:
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
Ce code crée les cgroup
répertoires correspondants dans la cgroup
hiérarchie pour un utilisateur non privilégié. Cependant, quelque chose que je ne comprends pas se produit. Avant d'exécuter ce qui précède, je verrai ceci:
[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
Après avoir exécuté le code susmentionné que je vois dans le shell, je l'ai exécuté:
[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
Mais dans tout autre shell, je vois toujours:
[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
Par conséquent, je peux démarrer mon lxc
conteneur non privilégié dans le shell que j'ai exécuté le code mentionné ci-dessus mais pas dans aucun autre.
Quelqu'un peut-il expliquer ce comportement?
Quelqu'un a-t-il trouvé un meilleur moyen de configurer le nécessaire
cgroups
avec une version actuelle desystemd
(>= 217
)?