el contenedor del usuario no se inicia, ¿cómo localizar el motivo?

8

Al crear un contenedor LXC de usuario (sin privilegios) en Ubuntu 14.04 con la siguiente línea de comando:

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

y (sin tocar el archivo de configuración creado) y luego intentar iniciarlo con:

lxc-start -n test1 -l DEBUG

falla. El archivo de registro me muestra:

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.

Ahora veo dos errores aquí, el último probablemente sea el resultado del primero, que es:

lxc_start: error al crear cgroups

Sin embargo, veo /sys/fs/cgroupmontado:

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

y cgmanagerestá instalado:

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

Nota: Mi host sigue siendo el predeterminado upstart.

En caso de duda, el soporte del kernel 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

Nota: Mi host sigue siendo el predeterminado upstart.

0xC0000022L
fuente

Respuestas:

7

Resulta que sorpresa sorpresa, esto es algo específico de Ubuntu.


La causa

El problema: aunque el kernel se ha cgroupshabilitado (verifique con grep CGROUP /boot/config-$(uname -r)) y se cgmanagerestá ejecutando, no hay un cgroup específico para mi usuario. Puede verificar eso con:

$ cat / proc / self / cgroup
11: hugetlb: /
10: perf_event: /
9: blkio: /
8: congelador: /
7: dispositivos: /
6: memoria: /
5: cpuacct: /
4: CPU: /
3: nombre = systemd: /
2: cpuset: /

si su UID se proporciona en cada una de las líneas relevantes, está bien, pero si no se han definido cgroups, solo habrá una barra diagonal después del segundo colon en cada línea.

Mi problema era específico para iniciar un contenedor sin privilegios. Podría comenzar contenedores privilegiados muy bien.

Resultó que mi problema estaba estrechamente relacionado con este hilo en la lxc-userslista de correo .

Remedio

En Ubuntu 14.04 upstartes el valor predeterminado, a diferencia de systemd. Por lo tanto, ciertos componentes que se instalarían en una systemddistribución basada en no se instalan de forma predeterminada.

Hubo dos paquetes además de los cgmanagercuales tuve que instalar para superar el error que se muestra en mi pregunta: cgroup-biny libpam-systemd. Francamente, no estoy 100% seguro de que lo primero sea estrictamente necesario, por lo que podría intentar dejarlo y comentar aquí.

Después de la instalación de los paquetes y un reinicio, debería ver su UID ( id -uaquí 1000) en la salida:

$ 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: congelador: /user/1000.user/1.session
7: dispositivos: /user/1000.user/1.session
6: memoria: /user/1000.user/1.session
5: cpuacct: /user/1000.user/1.session
4: cpu: /user/1000.user/1.session
3: nombre = systemd: /user/1000.user/1.session
2: cpuset: /user/1000.user/1.session

Después de eso, el error al intentar iniciar el contenedor de invitado se convierte (recortado por brevedad)

lxc-start 1420160065.383 INFO lxc_cgroup - cgroup driver cgmanager initing for test1
lxc-start 1420160065.419 ERROR lxc_start: no se pudo crear la red configurada
lxc-start 1420160065.446 ERROR lxc_start - no se pudo generar 'test1'
lxc-start 1420160065.451 ERROR lxc_start_ui - El contenedor no pudo iniciarse.

Así que todavía no hay éxito, pero estamos un paso más cerca.

Los anteriormente unido lxc-userspuntos de rosca para /etc/systemd/logind.confno mencionar tres controladores: net_cls, net_prioy debug. Para mí solo faltaba el último. Sin embargo, después del cambio, deberá volver a iniciar sesión, ya que los cambios surten efecto al crear su sesión de inicio de sesión.

Esta publicación de blog de uno de los autores de LXC da el siguiente paso:

Su usuario, aunque puede crear nuevos espacios de nombres de usuario en los que será uid 0 y tendrá algunos de los privilegios de root contra los recursos vinculados a ese espacio de nombres, obviamente no se le otorgará ningún privilegio adicional en el host.

Una de esas cosas es crear nuevos dispositivos de red en el host o cambiar la configuración del puente. Para solucionarlo, escribimos una herramienta llamada "lxc-user-nic", que es la única parte binaria SETUID de LXC 1.0 y que realiza una tarea simple. Analiza un archivo de configuración y, en función de su contenido, creará dispositivos de red para el usuario y los unirá. Para evitar abusos, puede restringir la cantidad de dispositivos que un usuario puede solicitar y a qué puente se pueden agregar.

Un ejemplo es mi propio archivo / etc / lxc / lxc-usernet:

stgraber veth lxcbr0 10

Esto declara que el usuario "stgraber" tiene permitido crear y agregar hasta 10 dispositivos tipo veth al puente llamado lxcbr0.

Entre lo que ofrece el espacio de nombres de usuario en el kernel y esa herramienta setuid, tenemos todo lo que se necesita para ejecutar la mayoría de las distribuciones sin privilegios.

Si su usuario tiene sudoderechos y usted está usando Bash, use esto:

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

y asegúrese de que el tipo ( veth) coincida con el de la configuración del contenedor y que el bridge ( lxcbr0) esté configurado y activo.

Y ahora tenemos otro conjunto de errores:

lxc-start 1420192192.775 INFO lxc_start - Clonando un nuevo espacio de nombres de usuario
lxc-start 1420192192.775 INFO lxc_cgroup - cgroup driver cgmanager initing for test1
lxc-start 1420192192.923 AVISO lxc_start - cambio a gid / uid 0 en el nuevo espacio de nombres de usuario
lxc-start 1420192192.923 ERROR lxc_start - Permiso denegado - no se pudo acceder a / home / user. Concédele acceso 'x' o agrega una ACL para la raíz del contenedor.
lxc-start 1420192192.923 ERROR lxc_sync: número de secuencia no válido 1. esperado 2
lxc-start 1420192192.954 ERROR lxc_start - no se pudo generar 'test1'
lxc-start 1420192192.959 ERROR lxc_start_ui - El contenedor no pudo iniciarse.

Brillante, eso se puede arreglar. Otro lxc-usershilo de los mismos protagonistas que en el primer hilo allana el camino.

Por ahora sudo chmod -R o+X $HOME, tendrá que hacer una prueba rápida , pero las ACL también son una opción viable aquí. YMMV.

0xC0000022L
fuente
Todavía estoy atrapado por el hecho de que si quiero ejecutar userns LXC container como otro usuario, falla. La creación funciona (con una advertencia:) WARN: could not reopen tty: Permission denied. Pero el inicio sudo -H -i -u database lxc-start -n mysql -dfalla como en su pregunta. Los mismos errores Sin embargo, su solución no funciona sudo. Si lo hago sudo -H -i -u database cat /proc/self/cgroup, obtengo exactamente el mismo resultado que si lo ejecuto como mi usuario llamante. Entonces, obviamente, cuando intente iniciar el contenedor con sudo, intentará como el otro usuario escribir en mi cgroup que falla ... :-( ¿Alguna idea?
Huygens