le conteneur userns ne démarre pas, comment en trouver la raison?

8

Lors de la création d'un conteneur LXC userns (non privilégié) sur Ubuntu 14.04 avec la ligne de commande suivante:

lxc-create -n test1 -t download -- -d $(lsb_release -si|tr 'A-Z' 'a-z') -r $(lsb_release -sc) -a $(dpkg --print-architecture)

et (sans toucher au fichier de configuration créé) puis en essayant de le démarrer avec:

lxc-start -n test1 -l DEBUG

il échoue. Le fichier journal me montre:

lxc-start 1420149317.700 INFO     lxc_start_ui - using rcfile /home/user/.local/share/lxc/test1/config
lxc-start 1420149317.700 INFO     lxc_utils - XDG_RUNTIME_DIR isn't set in the environment.
lxc-start 1420149317.701 INFO     lxc_confile - read uid map: type u nsid 0 hostid 100000 range 65536
lxc-start 1420149317.701 INFO     lxc_confile - read uid map: type g nsid 0 hostid 100000 range 65536
lxc-start 1420149317.701 WARN     lxc_log - lxc_log_init called with log already initialized
lxc-start 1420149317.701 INFO     lxc_lsm - LSM security driver AppArmor
lxc-start 1420149317.701 INFO     lxc_utils - XDG_RUNTIME_DIR isn't set in the environment.
lxc-start 1420149317.702 DEBUG    lxc_conf - allocated pty '/dev/pts/2' (5/6)
lxc-start 1420149317.702 DEBUG    lxc_conf - allocated pty '/dev/pts/7' (7/8)
lxc-start 1420149317.702 DEBUG    lxc_conf - allocated pty '/dev/pts/8' (9/10)
lxc-start 1420149317.702 DEBUG    lxc_conf - allocated pty '/dev/pts/10' (11/12)
lxc-start 1420149317.702 INFO     lxc_conf - tty's configured
lxc-start 1420149317.702 DEBUG    lxc_start - sigchild handler set
lxc-start 1420149317.702 DEBUG    lxc_console - opening /dev/tty for console peer
lxc-start 1420149317.702 DEBUG    lxc_console - using '/dev/tty' as console
lxc-start 1420149317.702 DEBUG    lxc_console - 14946 got SIGWINCH fd 17
lxc-start 1420149317.702 DEBUG    lxc_console - set winsz dstfd:14 cols:118 rows:61
lxc-start 1420149317.905 INFO     lxc_start - 'test1' is initialized
lxc-start 1420149317.906 DEBUG    lxc_start - Not dropping cap_sys_boot or watching utmp
lxc-start 1420149317.906 INFO     lxc_start - Cloning a new user namespace
lxc-start 1420149317.906 INFO     lxc_cgroup - cgroup driver cgmanager initing for test1
lxc-start 1420149317.907 ERROR    lxc_cgmanager - call to cgmanager_create_sync failed: invalid request
lxc-start 1420149317.907 ERROR    lxc_cgmanager - Failed to create hugetlb:test1
lxc-start 1420149317.907 ERROR    lxc_cgmanager - Error creating cgroup hugetlb:test1
lxc-start 1420149317.907 INFO     lxc_cgmanager - cgroup removal attempt: hugetlb:test1 did not exist
lxc-start 1420149317.908 INFO     lxc_cgmanager - cgroup removal attempt: perf_event:test1 did not exist
lxc-start 1420149317.908 INFO     lxc_cgmanager - cgroup removal attempt: blkio:test1 did not exist
lxc-start 1420149317.908 INFO     lxc_cgmanager - cgroup removal attempt: freezer:test1 did not exist
lxc-start 1420149317.909 INFO     lxc_cgmanager - cgroup removal attempt: devices:test1 did not exist
lxc-start 1420149317.909 INFO     lxc_cgmanager - cgroup removal attempt: memory:test1 did not exist
lxc-start 1420149317.909 INFO     lxc_cgmanager - cgroup removal attempt: cpuacct:test1 did not exist
lxc-start 1420149317.909 INFO     lxc_cgmanager - cgroup removal attempt: cpu:test1 did not exist
lxc-start 1420149317.910 INFO     lxc_cgmanager - cgroup removal attempt: cpuset:test1 did not exist
lxc-start 1420149317.910 INFO     lxc_cgmanager - cgroup removal attempt: name=systemd:test1 did not exist
lxc-start 1420149317.910 ERROR    lxc_start - failed creating cgroups
lxc-start 1420149317.910 INFO     lxc_utils - XDG_RUNTIME_DIR isn't set in the environment.
lxc-start 1420149317.910 ERROR    lxc_start - failed to spawn 'test1'
lxc-start 1420149317.910 INFO     lxc_utils - XDG_RUNTIME_DIR isn't set in the environment.
lxc-start 1420149317.910 INFO     lxc_utils - XDG_RUNTIME_DIR isn't set in the environment.
lxc-start 1420149317.910 ERROR    lxc_start_ui - The container failed to start.
lxc-start 1420149317.910 ERROR    lxc_start_ui - Additional information can be obtained by setting the --logfile and --logpriority options.

Maintenant, je vois deux erreurs ici, cette dernière étant probablement le résultat de la première, qui est:

lxc_start - échec de la création de groupes de contrôle

Cependant, je vois /sys/fs/cgroupmonté:

$ mount|grep cgr
none on /sys/fs/cgroup type tmpfs (rw)

et cgmanagerest installé:

$ dpkg -l|awk '$1 ~ /^ii$/ && /cgmanager/ {print $2 " " $3 " " $4}'
cgmanager 0.24-0ubuntu7 amd64
libcgmanager0:amd64 0.24-0ubuntu7 amd64

Remarque: Mon hôte est toujours par défaut upstart.

En cas de doute, le support du noyau cgroups:

$ grep CGROUP /boot/config-$(uname -r)
CONFIG_CGROUPS=y
# CONFIG_CGROUP_DEBUG is not set
CONFIG_CGROUP_FREEZER=y
CONFIG_CGROUP_DEVICE=y
CONFIG_CGROUP_CPUACCT=y
CONFIG_CGROUP_HUGETLB=y
CONFIG_CGROUP_PERF=y
CONFIG_CGROUP_SCHED=y
CONFIG_BLK_CGROUP=y
# CONFIG_DEBUG_BLK_CGROUP is not set
CONFIG_NET_CLS_CGROUP=m
CONFIG_NETPRIO_CGROUP=m

Remarque: Mon hôte est toujours par défaut upstart.

0xC0000022L
la source

Réponses:

7

Il s'avère, surprise surprise, ceci est une chose spécifique à Ubuntu.


La cause

Le problème: bien que le noyau ait cgroupsactivé (vérifiez avec grep CGROUP /boot/config-$(uname -r)) et cgmanagerfonctionne, il n'y a pas de groupe de contrôle spécifique à mon utilisateur. Vous pouvez vérifier cela avec:

$ cat / proc / self / cgroup
11: hugetlb: /
10: perf_event: /
9: blkio: /
8: congélateur: /
7: appareils: /
6: mémoire: /
5: cpuacct: /
4: cpu: /
3: nom = systemd: /
2: cpuset: /

si votre UID est indiqué dans chacune des lignes pertinentes, ce n'est pas grave, mais si aucun groupe de contrôle n'a été défini, il n'y aura qu'une barre oblique après le deuxième signe deux-points sur chaque ligne.

Mon problème était spécifique au démarrage d'un conteneur non privilégié. Je pourrais très bien démarrer des conteneurs privilégiés.

Il s'est avéré que mon problème était étroitement lié à ce fil sur la lxc-usersliste de diffusion .

Remède

Sur Ubuntu 14.04 upstartest la valeur par défaut, par opposition à systemd. Par conséquent, certains composants qui seraient installés sur une systemddistribution basée sur ne sont pas installés par défaut.

Il y avait en plus deux packages cgmanagerque j'ai dû installer pour dépasser l'erreur indiquée dans ma question: cgroup-binet libpam-systemd. Franchement, je ne suis pas sûr à 100% que le premier soit strictement nécessaire, vous pouvez donc essayer de le laisser de côté et de commenter ici.

Après l'installation des packages et un redémarrage, vous devriez alors voir votre UID ( id -u, ici 1000) dans la sortie:

$ cat / proc / self / cgroup
11: hugetlb: /user/1000.user/1.session
10: perf_event: /user/1000.user/1.session
9: blkio: /user/1000.user/1.session
8: congélateur: /user/1000.user/1.session
7: périphériques: /user/1000.user/1.session
6: mémoire: /user/1000.user/1.session
5: cpuacct: /user/1000.user/1.session
4: cpu: /user/1000.user/1.session
3: nom = systemd: /user/1000.user/1.session
2: cpuset: /user/1000.user/1.session

Après cela, l'erreur lors de la tentative de démarrage du conteneur invité devient (supprimée par souci de concision):

lxc-start 1420160065.383 INFO lxc_cgroup - pilote cgmanager cgroup initiant pour test1
lxc-start 1420160065.419 ERREUR lxc_start - échec de création du réseau configuré
lxc-start 1420160065.446 ERREUR lxc_start - échec de génération de «test1»
lxc-start 1420160065.451 ERREUR lxc_start_ui - Le conteneur n'a pas pu démarrer.

Donc toujours pas de succès, mais nous sommes un pas de plus.

Les reliés au- dessus des lxc-userspoints de fil pour /etc/systemd/logind.confne pas mentionner trois contrôleurs: net_cls, net_prioet debug. Pour moi, seul le dernier manquait. Après la modification, vous devrez vous reconnecter, car les modifications prennent effet lors de la création de votre session de connexion.

Ce billet de blog par l'un des auteurs de LXC donne la prochaine étape:

Votre utilisateur, alors qu'il peut créer de nouveaux espaces de noms utilisateur dans lesquels il sera uid 0 et aura certains des privilèges de root sur les ressources liées à cet espace de noms, ne recevra évidemment aucun privilège supplémentaire sur l'hôte.

L'une de ces choses consiste à créer de nouveaux périphériques réseau sur l'hôte ou à modifier la configuration du pont. Pour contourner cela, nous avons écrit un outil appelé «lxc-user-nic» qui est la seule partie binaire SETUID de LXC 1.0 et qui effectue une tâche simple. Il analyse un fichier de configuration et, en fonction de son contenu, crée des périphériques réseau pour l'utilisateur et les relie. Pour éviter les abus, vous pouvez limiter le nombre d'appareils qu'un utilisateur peut demander et à quel pont ils peuvent être ajoutés.

Un exemple est mon propre fichier / etc / lxc / lxc-usernet:

stgraber veth lxcbr0 10

Cela déclare que l'utilisateur «stgraber» est autorisé à créer jusqu'à 10 périphériques de type veth et à les ajouter au pont appelé lxcbr0.

Entre ce qui est offert par l'espace de noms utilisateur dans le noyau et cet outil setuid, nous avons tout ce qu'il faut pour exécuter la plupart des distributions sans privilèges.

Si votre utilisateur a des sudodroits et que vous utilisez Bash, utilisez ceci:

echo "$(whoami) veth lxcbr0 10"|sudo tee -a /etc/lxc/lxc-usernet

et assurez-vous que le type ( veth) correspond à celui de la configuration du conteneur et que le bridge ( lxcbr0) est configuré et en place.

Et maintenant, nous obtenons un autre ensemble d'erreurs:

lxc-start 1420192192.775 INFO lxc_start - Clonage d'un nouvel espace de noms utilisateur
lxc-start 1420192192.775 INFO lxc_cgroup - pilote cgmanager du groupe c initiant pour test1
lxc-start 1420192192.923 AVIS lxc_start - passage à gid / uid 0 dans le nouvel espace de noms utilisateur
lxc-start 1420192192.923 ERREUR lxc_start - Autorisation refusée - impossible d'accéder à / home / user. Veuillez lui accorder l'accès «x» ou ajouter une ACL pour la racine du conteneur.
lxc-start 1420192192.923 ERREUR lxc_sync - numéro de séquence non valide 1. attendu 2
lxc-start 1420192192.954 ERREUR lxc_start - échec de génération de 'test1'
lxc-start 1420192192.959 ERREUR lxc_start_ui - Le conteneur n'a pas pu démarrer.

Brillant, cela peut être réparé. Un autre lxc-usersfil des mêmes protagonistes que dans le premier fil ouvre la voie.

Pour l'instant, un test rapide sudo chmod -R o+X $HOMEdevra être fait, mais les listes de contrôle d'accès sont également une option viable ici. YMMV.

0xC0000022L
la source
Je suis toujours bloqué par le fait que si je veux exécuter le conteneur userns LXC en tant qu'autre utilisateur, il échoue. La création fonctionne (avec un seul avertissement:) WARN: could not reopen tty: Permission denied. Mais le démarrage sudo -H -i -u database lxc-start -n mysql -déchoue comme dans votre question. Mêmes erreurs. Cependant, votre correctif ne fonctionne pas avec sudo. Si je le fais, sudo -H -i -u database cat /proc/self/cgroupj'obtiens exactement la même sortie que si je l'exécute en tant qu'utilisateur appelant. Alors évidemment, lorsque vous essayez de démarrer le conteneur en utilisant sudo, il tentera en tant qu'autre utilisateur d'écrire dans mon cgroup qui échoue ... :-( Avez-vous un aperçu?
Huygens