web-dev-qa-db-fra.com

Problème lors de la configuration d'un conteneur LXC d'espace utilisateur

Plusieurs soirs, j'essaie déjà de faire en sorte qu'une installation LXC fonctionne avec des conteneurs d'espace utilisateur. Puisqu'il s'agira d'un nouveau serveur, je ne me soucie pas (encore) de la distribution et de la publication. J'ai donc essayé Debian 7 + 8 et Ubuntu 14.04 et 15.04 en tant qu'hôte et Ubuntu 15.04 et Debian 8 en tant qu'invité. Tous ont leurs problèmes. Le résumé:

Debian 7.8 : lxc-create: Cette commande doit être exécutée en tant que root (les deux invités).

Debian 8.0 : lxc-create: opération non autorisée (les deux invités)

Ubuntu 14.04 avec Ubuntu 15.04 invité : lxc-start: l’appel de cgmanager_create_sync a échoué: demande non valide/le conteneur n’a pas pu démarrer.

Ubuntu 14.04 avec Debian 8 guest : lxc-create: ERREUR: impossible de trouver une image correspondante.

Ubuntu 15.04 : lxc-start: l'appel de cgmanager_move_pid_sync a échoué: demande non valide/le conteneur n'a pas pu démarrer. (les deux invités)

J'ai suivi le tutoriel https://help.ubuntu.com/lts/serverguide/lxc.html et https://linuxcontainers.org/lxc/getting-started/ et ils n'ont pas l'air si compliqué.

J'ai écrit un script pour rendre le test reproductible (à exécuter en tant que root sur un cd live fraîchement démarré). Quelqu'un peut-il me dire ce qui ne va pas?

#!/bin/sh


# need to be run as root

set -x

echo "==== SYSTEM INFO & INSTALL ===="

lsb_release -a

uname -a

apt-get update
apt-get install -y lxc
apt-get clean

lxc-checkconfig
ifconfig
brctl show

adduser testuser

cat /etc/subuid /etc/subgid

cat >/etc/lxc/lxc-usernet <<.e
# USERNAME TYPE BRIDGE COUNT
testuser veth lxcbr0 2
.e

Sudo -u testuser -i mkdir -p .config/lxc

Sudo -u testuser -i tee .config/lxc/default.conf <<.e
lxc.id_map = u 0 $(grep testuser /etc/subuid | cut -d: -f2) 65536
lxc.id_map = g 0 $(grep testuser /etc/subgid | cut -d: -f2) 65536

lxc.network.type = veth
lxc.network.link = lxcbr0
lxc.network.flags = up
lxc.network.hwaddr = 00:16:3e:xx:xx:xx
.e
cat /home/testuser/.config/lxc/default.conf

echo "==== TEST UBUNTU VIVID GUEST ===="

Sudo -u testuser -i lxc-create -t download -n vivid1 -- -d ubuntu -r utopic -a AMD64
#You just created an Ubuntu container (release=trusty, Arch=AMD64, variant=default)

#Sudo -u testuser -i lxc-start -n vivid1 -d
#read press_enter_key_when_quit

if [ $? -eq 0 ]; then
  rm /tmp/log
  Sudo -u testuser -i lxc-start -n vivid1 -l debug --logfile /tmp/log
  cat /tmp/log
fi

echo "==== TEST DEBIAN JESSIE GUEST ===="

Sudo -u testuser -i lxc-create -t download -n jessie1 -- -d debian -r jessie -a AMD64
#You just created an Ubuntu container (release=trusty, Arch=AMD64, variant=default)

#Sudo -u testuser -i lxc-start -n jessie1 -d
#read press_enter_key_when_quit

if [ $? -eq 0 ]; then
  rm /tmp/log
  Sudo -u testuser -i lxc-start -n jessie1 -l debug --logfile /tmp/log
  cat /tmp/log
fi

echo "==== END OF SCRIPT ===="

Sur Pastebin, j'ai posté la sortie de la console de toutes ces machines:

Mise à jour

J'ai essayé plus loin avec Ubuntu 15.04 en tant qu'hôte. J'ai trouvé le rapport de bogue https://bugs.launchpad.net/ubuntu/+source/systemd/+bug/1413927 Qui a un problème similaire mais non identique. Mais journalctl a révélé des problèmes avec cgmanager:

May 20 16:06:10 xubuntu cgmanager[4736]: cgmanager:do_create_main: pid 17417 (uid 1000 gid 1000) may not create under /run/cgmanager/fs/blkio/user.slice/user-999.slice/session-c1.scope
May 20 16:06:10 xubuntu cgmanager[4736]: cgmanager:do_create_main: pid 17417 (uid 1000 gid 1000) may not create under /run/cgmanager/fs/cpu/user.slice/user-999.slice/session-c1.scope
May 20 16:06:10 xubuntu cgmanager[4736]: cgmanager:do_create_main: pid 17417 (uid 1000 gid 1000) may not create under /run/cgmanager/fs/cpuset/user.slice/user-999.slice/session-c1.scope
May 20 16:06:10 xubuntu cgmanager[4736]: cgmanager:do_create_main: pid 17417 (uid 1000 gid 1000) may not create under /run/cgmanager/fs/devices/user.slice/user-999.slice/session-c1.scope
May 20 16:06:10 xubuntu cgmanager[4736]: cgmanager:do_create_main: pid 17417 (uid 1000 gid 1000) may not create under /run/cgmanager/fs/freezer/user.slice/user-999.slice/session-c1.scope
May 20 16:06:10 xubuntu cgmanager[4736]: cgmanager:do_create_main: pid 17417 (uid 1000 gid 1000) may not create under /run/cgmanager/fs/hugetlb/user.slice/user-999.slice/session-c1.scope
May 20 16:06:10 xubuntu cgmanager[4736]: cgmanager:do_create_main: pid 17417 (uid 1000 gid 1000) may not create under /run/cgmanager/fs/memory/user.slice/user-999.slice/session-c1.scope
May 20 16:06:10 xubuntu cgmanager[4736]: cgmanager:do_create_main: pid 17417 (uid 1000 gid 1000) may not create under /run/cgmanager/fs/net_cls/user.slice/user-999.slice/session-c1.scope
May 20 16:06:10 xubuntu cgmanager[4736]: cgmanager:do_create_main: pid 17417 (uid 1000 gid 1000) may not create under /run/cgmanager/fs/perf_event/user.slice/user-999.slice/session-c1.scope
May 20 16:06:10 xubuntu cgmanager[4736]: cgmanager:do_create_main: pid 17417 (uid 1000 gid 1000) may not create under /run/cgmanager/fs/none,name=systemd/user.slice/user-999.slice/session-c1.scope
May 20 16:06:10 xubuntu cgmanager[4736]: cgmanager: Invalid path /run/cgmanager/fs/blkio/user.slice/user-999.slice/session-c1.scope/lxc/jessie1
May 20 16:06:10 xubuntu cgmanager[4736]: cgmanager:per_ctrl_move_pid_main: Invalid path /run/cgmanager/fs/blkio/user.slice/user-999.slice/session-c1.scope/lxc/jessie1
May 20 16:06:10 xubuntu cgmanager[4736]: cgmanager: Invalid path /run/cgmanager/fs/cpu/user.slice/user-999.slice/session-c1.scope/lxc/jessie1
May 20 16:06:10 xubuntu cgmanager[4736]: cgmanager:per_ctrl_move_pid_main: Invalid path /run/cgmanager/fs/cpu/user.slice/user-999.slice/session-c1.scope/lxc/jessie1
May 20 16:06:10 xubuntu cgmanager[4736]: cgmanager: Invalid path /run/cgmanager/fs/cpuset/user.slice/user-999.slice/session-c1.scope/lxc/jessie1
May 20 16:06:10 xubuntu cgmanager[4736]: cgmanager:per_ctrl_move_pid_main: Invalid path /run/cgmanager/fs/cpuset/user.slice/user-999.slice/session-c1.scope/lxc/jessie1
May 20 16:06:10 xubuntu cgmanager[4736]: cgmanager: Invalid path /run/cgmanager/fs/devices/user.slice/user-999.slice/session-c1.scope/lxc/jessie1
May 20 16:06:10 xubuntu cgmanager[4736]: cgmanager:per_ctrl_move_pid_main: Invalid path /run/cgmanager/fs/devices/user.slice/user-999.slice/session-c1.scope/lxc/jessie1
May 20 16:06:10 xubuntu cgmanager[4736]: cgmanager: Invalid path /run/cgmanager/fs/freezer/user.slice/user-999.slice/session-c1.scope/lxc/jessie1
May 20 16:06:10 xubuntu cgmanager[4736]: cgmanager:per_ctrl_move_pid_main: Invalid path /run/cgmanager/fs/freezer/user.slice/user-999.slice/session-c1.scope/lxc/jessie1
May 20 16:06:10 xubuntu cgmanager[4736]: cgmanager: Invalid path /run/cgmanager/fs/hugetlb/user.slice/user-999.slice/session-c1.scope/lxc/jessie1
May 20 16:06:10 xubuntu cgmanager[4736]: cgmanager:per_ctrl_move_pid_main: Invalid path /run/cgmanager/fs/hugetlb/user.slice/user-999.slice/session-c1.scope/lxc/jessie1
May 20 16:06:10 xubuntu cgmanager[4736]: cgmanager: Invalid path /run/cgmanager/fs/memory/user.slice/user-999.slice/session-c1.scope/lxc/jessie1
May 20 16:06:10 xubuntu cgmanager[4736]: cgmanager:per_ctrl_move_pid_main: Invalid path /run/cgmanager/fs/memory/user.slice/user-999.slice/session-c1.scope/lxc/jessie1
May 20 16:06:10 xubuntu cgmanager[4736]: cgmanager: Invalid path /run/cgmanager/fs/net_cls/user.slice/user-999.slice/session-c1.scope/lxc/jessie1
May 20 16:06:10 xubuntu cgmanager[4736]: cgmanager:per_ctrl_move_pid_main: Invalid path /run/cgmanager/fs/net_cls/user.slice/user-999.slice/session-c1.scope/lxc/jessie1
May 20 16:06:10 xubuntu cgmanager[4736]: cgmanager: Invalid path /run/cgmanager/fs/perf_event/user.slice/user-999.slice/session-c1.scope/lxc/jessie1
May 20 16:06:10 xubuntu cgmanager[4736]: cgmanager:per_ctrl_move_pid_main: Invalid path /run/cgmanager/fs/perf_event/user.slice/user-999.slice/session-c1.scope/lxc/jessie1
May 20 16:06:10 xubuntu cgmanager[4736]: cgmanager: Invalid path /run/cgmanager/fs/none,name=systemd/user.slice/user-999.slice/session-c1.scope/lxc/jessie1
May 20 16:06:10 xubuntu cgmanager[4736]: cgmanager:per_ctrl_move_pid_main: Invalid path /run/cgmanager/fs/none,name=systemd/user.slice/user-999.slice/session-c1.scope/lxc/jessie1

Mise à jour 2

J'ai essayé plus: j'ai installé Ubuntu fidèle et vif sur deux machines virtuelles et installé toutes les mises à jour sur eux. Ensuite, j'ai testé les deux versions, une fois avec le paquetage original lxc et une fois avec celles du paquet quotidien LPA. Le résultat est toujours la même erreur que celle indiquée ci-dessus.

7
Daniel Alder

Eureka! Pas encore fini, mais j'ai réussi une première fois à démarrer un conteneur. Quelques erreurs se sont produites et j'ai constaté qu'il y a beaucoup de gens qui ont des problèmes similaires. Voici un petit guide de résolution de problèmes:

Distribution/Dépôts

En raison des retours les plus positifs, j'ai décidé de commencer avec un système désamorcé Ubuntu 14.04. Cela signifie que le système d'origine n'est pas plus grand que quelques 100M et ne contient pas beaucoup de paquets. J'ai utilisé les mises à jour et les sources de paquet de sécurité et le ppa quotidien lxc. Voici mon /etc/apt/sources.list:

deb http://de.archive.ubuntu.com/ubuntu trusty main
deb http://de.archive.ubuntu.com/ubuntu trusty-updates main
deb http://security.ubuntu.com/ubuntu trusty-security main

deb http://ppa.launchpad.net/ubuntu-lxc/daily/ubuntu trusty main 

Installation

Dans de nombreux tutoriels, forums et rapports de bogues, j'ai trouvé des listes de paquets à installer. Je ne sais pas encore lequel de ces éléments est important, mais voici la liste de ce que j'ai finalement installé (à partir d'un système debootstrapped 14.04):

apt-get install bridge-utils cgmanager cloud-image-utils debootstrap distro-info \
  distro-info-data euca2ools Fuse libaio1 libapparmor1 libcap2 liblxc1 \
  libpam-systemd librados2 libseccomp2 libselinux1 libselinux1 lxc python3-lxc \
  python-distro-info

Encore une fois: cette liste est probablement plus longue que nécessaire. Voici ce qui est vraiment important:

  • libpam-systemd: cette bibliothèque est importante pour les autorisations appropriées du groupe de contrôle. Je n'ai vu aucun message d'erreur, mais sans lui, le fichier /proc/self/cgroup ressemblait à 8:blkio:/ etc. au lieu de 8:hugetlb:/user/1000.user/1.session.
  • Fuse: J'ai lu que c'était important pour lxcfs (je dirais que c'est un bogue que le paquetage lxcfs n'en dépend pas)
  • lxc: le paquet le plus important et suffisant si vous utilisez uniquement des conteneurs non privilégiés
  • cgmanager: Je suis encore en train d’apprendre sur sa fonction. Btw: le PPA de lxc fournit actuellement les paquets cgmanager-utils (0.27) et cgmanager (0.30). cgmanager est en conflit avec cgmanager-utils (<< 0.30-1), ce qui signifie que les deux paquets du même référentiel ne sont pas compatibles (éventuellement une erreur ). J'ai choisi cgmanager.

Configuration

J'ai essayé beaucoup d'indices de partout, donc je ne sais pas encore ce qui est important. Mais en gros, je viens de lancer le script à partir de la question. En gros, il s'agit de ces fichiers:

  • / etc/subuid
  • / etc/subgid
  • / etc/lxc/lxc-usernet
  • ~/.config/lxc/default.conf

La seule chose supplémentaire que j'ai faite est la suivante, car j'ai trouvé la ligne dans de nombreux threads:

chmod +x /home/testuser/.local/share

Se connecter en tant qu'utilisateur

Maintenant, la chose la plus importante que je ne comprends toujours pas mais qui a ruiné toutes mes expériences sur la base de scripts: Ne vous connectez pas en utilisant su ou Sudo!

Je démontre:

root@1404-lxc-test:~# tail -1 /proc/self/cgroup
2:blkio:/user/0.user/1.session
# this is expected. I am root.

root@1404-lxc-test:~# Sudo -u testuser -i tail -1 /proc/self/cgroup
2:blkio:/user/0.user/1.session
# here I used Sudo to switch user

root@1404-lxc-test:~# su - testuser
testuser@1404-lxc-test:~$ tail -1 /proc/self/cgroup
2:blkio:/user/0.user/1.session
# at least here I expected the correct settings

testuser@1404-lxc-test:~$ exit
root@1404-lxc-test:~# exit

$ ssh testuser@1404-lxc-test
testuser@1404-lxc-test's password: 
Welcome to Ubuntu 14.04.2 LTS (GNU/Linux 3.13.0-53-generic x86_64)

testuser@1404-lxc-test:~$ tail -1 /proc/self/cgroup
2:blkio:/user/1000.user/2.session
# now it's correct

Je ne connais toujours pas la raison, mais il doit être connecté à libpam-systemd. Evidemment, su et Sudo contournent PAM

Et enfin, n'oubliez pas d'utiliser les commandes lxc-xxx lorsque vous êtes connecté en tant qu'utilisateur. Ils échoueront si vous le faites en tant que root (car les conteneurs d’espace utilisateur sont stockés dans .local/share/lxc/ au lieu de /var/lib/lxc/.

Dépannage

Ces commandes m'ont été très utiles:

  • journalctl (sur les versions récentes): Cela a révélé des problèmes avec cgmanager
  • /proc/self/cgroup
  • lxc-start en utilisant les options -l debug --logfile logfilename.txt

Faites-moi savoir quoi d'autre est important. Je pense que la communauté en a besoin.

Crédits

Merci aux tutoriels suivants:

Et à ces rapports de bugs et fils de forum:

Avertissement

J'ai écrit ce texte après le premier test réussi. Mais j'ai fait tellement de choses que certaines de ces étapes ne sont probablement pas nécessaires. Je revérifierai tout sur un nouveau système bientôt.

Mise à jour

Tout ce qui précède a été réalisé avec Ubuntu 14.04 LTS. Maintenant, je viens de tester Ubuntu avec astuce. Jusqu'ici je peux dire:

  • Tout ce dont vous avez besoin d'installer sur un système de base debootstrapped: apt-get install lxc bridge-utils
  • Aucun miroir extérieur n'est requis. Utilisez le lxc fourni par Ubuntu
  • Je n'ai pas touché plus que les fichiers suivants sur mon nouveau système: /etc/subuid, /etc/subgid, /etc/lxc/lxc-usernet, de plus, j'ai créé un utilisateur et rempli sa maison.
  • Conclusion: beaucoup plus facile, beaucoup plus stable. Pour moi, c'est la première version qui fonctionne vraiment.

(Wily est maintenant en version bêta et sera publié le 22 octobre 2015)

7
Daniel Alder