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
)?
sudo systemctl start cgmanager && sudo cgm create all $USER && sudo cgm chown all $USER $(id -u) $(id -g) && sudo cgm movepid all $USER $PPID
. La dernière commande doit être exécutée dans le shell actuel afin de l'ajouter au nouveau groupe de contrôle pour$USER
.En fait, dans archlinux, cela ne fonctionnera pas avec, par exemple, un utilisateur non privilégié (recommandé lorsque vous utilisez des conteneurs lxc privés). c'est à dire que cet utilisateur n'a pas sudo :)
Au lieu de cela, définissez le groupe dans /etc/cgconfig.conf, activez cgconfig, cgrules (libcgroup dans AUR), ajoutez également des cgrules, fait .. priv. l'utilisateur aura également les mêmes droits.
Dans systemd 218 (je ne sais pas quand, mais il semble que l'on doive ajouter deux autres conditions car elles ne sont pas définies lors de la création de la manière cgconfig):
En supposant que l'espace de noms est compilé dans le noyau.
Ceci est un modèle, les processeurs peuvent être fonction du nombre de cœurs que vous avez, mem peut être défini sur une valeur réelle, etc., etc.
EDIT 2: Enfin, dans systemd, si vous souhaitez utiliser le démarrage automatique avec un tel utilisateur non privilégié, vous pouvez faire:
cp /usr/lib/systemd/system/lxc{,admin}\@.service, puis ajoutez User = lxcadmin
et l'activer pour le conteneur de lxcadmin appelé lolz systemctl activer lxcadmin @ lolz.
la source
root
administrateur créer etchown
vous dans tous lescgroup
contrôleurs. C'est parfaitement bien et sécurisé.movepid
peut être fait sansroot
droits et donc, le privé. l'utilisateur n'a besoin d'aucunsudo
droit. (Btw,libcgroup
n'est plus censé être utilisé. RHEL et d'autres l'ont déprécié.)J'ai donc rencontré le même problème en essayant de faire fonctionner les conteneurs sans privilèges LXC sur CentOS 7. Je ne voulais pas l'utiliser
cgmanager
parce que je n'aime pas introduire de services supplémentaires s'ils ne sont pas absolument nécessaires. Ce que j'ai fini par faire à la place, c'est patcher systemd en utilisant certains patchs du paquet ubuntu et un patch personnalisé pour étendre la liste des contrôleurs cgroup. J'ai les sources nécessaires pour créer un RPM sur mon compte GitHub à https://github.com/CtrlC-Root/rpmdist . J'ai également des versions corrigées de shadow-utils (pour les subuids et subgids) et pam (pour loginuid). Après avoir installé ces RPM et configuré un utilisateur pour exécuter des conteneurs sans privilèges (attribuer des sous-uid et des subgids, allouer des paires de veth dans lxc-usernet, créer .config / lxc / default.conf, etc.), je peux très bien exécuter des conteneurs sans privilèges LXC.EDIT: Une autre raison pour laquelle je ne voulais pas utiliser cgmanager est parce que je ne voulais pas que mes utilisateurs réguliers aient à utiliser sudo du tout. Les utilisateurs réguliers devraient pouvoir se connecter et tout devrait "fonctionner" dès la sortie de la boîte.
la source