Linux - LXC; desplegar imágenes con el menor X11 posible

19

¿Actualmente es posible configurar contenedores LXC con capacidades X11? Estoy esperando el contenedor X11 más liviano disponible (en cuanto a memoria), la aceleración de hardware es una ventaja, pero no es esencial.

Si actualmente no es posible, o no está fácilmente disponible, ¿se sabe qué funcionalidad debe implementarse aún para admitirla?

acechador
fuente

Respuestas:

15

Sí, es posible ejecutar un entorno de escritorio X11 completo dentro de un contenedor LXC.

En este momento, hago esto en Arch Linux. No diré que es "ligero" ya que no he ido tan lejos como para tratar de eliminar cosas de la instalación estándar del administrador de paquetes, pero puedo confirmar que funciona muy bien.

Debe instalar cualquier controlador de kernel en el HOST, así como en el contenedor. Tales cosas como el controlador de gráficos (uso nvidia). Debe hacer que los nodos del dispositivo en dev estén accesibles dentro del contenedor configurando su container.conf para permitirlo. Luego debe asegurarse de que esos nodos de dispositivo se creen dentro del contenedor (es decir, mknod).

Entonces, para responder a su pregunta: SÍ funciona. Si puedo ayudar más o proporcionar más detalles, hágamelo saber.

--- información adicional proporcionada ---

En mi contenedor ... / etc / inittab comienza en el nivel de ejecución 5 y lanza "Slim" Slim está configurado para usar vt09:

 # Path, X server and arguments (if needed)
 # Note: -xauth $authfile is automatically appended
 default_path        /bin:/usr/bin:/usr/local/bin
 default_xserver     /usr/bin/X
 xserver_arguments   -nolisten tcp vt09

No estoy usando una segunda pantalla X en mi vt actual, sino una completamente diferente (puedo cambiar entre muchas de estas usando CTRL + ALT + Fn).

Si no está usando slim, puede usar una construcción como esta para iniciar X en otro vt:

 /usr/bin/startx -- :10 vt10

Eso iniciará X en la pantalla: 10 y lo pondrá en vt10 (CTRL + ALT + F10). No es necesario que coincidan, pero creo que es más ordenado si lo hacen.

Necesita la configuración de su contenedor para que los dispositivos relevantes estén disponibles, como este:

 # XOrg Desktop
 lxc.cgroup.devices.allow = c 4:10 rwm    # /dev/tty10 X Desktop
 lxc.cgroup.devices.allow = c 195:* rwm  # /dev/nvidia Graphics card
 lxc.cgroup.devices.allow = c 13:* rwm   # /dev/input/* input devices

Y necesita hacer los dispositivos en su contenedor:

 # display vt device
 mknod -m 666 /dev/tty10 c 4 10

 # NVIDIA graphics card devices
 mknod -m 666 /dev/nvidia0 c 195 0
 mknod -m 666 /dev/nvidiactl c 195 255

 # input devices
 mkdir  /dev/input           # input devices
 chmod 755 /dev/input
 mknod -m 666 /dev/input/mice c 13 63 # mice

También configuré manualmente los dispositivos de entrada (ya que no tenemos udev en el contenedor)

 Section "ServerFlags"
         Option "AutoAddDevices" "False"
 EndSection

 Section "ServerLayout"
     Identifier     "Desktop"
     InputDevice    "Mouse0" "CorePointer"
     InputDevice    "Keyboard0" "CoreKeyboard"
 EndSection

 Section "InputDevice"
     Identifier "Keyboard0"
     Driver "kbd"
     Option "XkbLayout" "gb"
 EndSection

 Section "InputDevice"
     Identifier "Mouse0"
     Driver "mouse"
     Option "Protocol" "auto"
     Option "Device" "/dev/input/mice"
     Option "ZAxisMapping" "4 5 6 7"
 EndSection

Lo anterior va en un archivo /etc/X11/xorg.conf.d/10-input.conf

No estoy seguro si algo de eso ayudará, ¡pero buena suerte!

starfry
fuente
No pude hacer que esto funcionara con nouveau, o con nouveau + vesa. ¿Alguna pista? ¿Tengo que usar el controlador propietario?
Robin Green
Estoy usando el controlador propietario. No he intentado nada más. ¿Estás en ArchLinux? Instalé xorg-xserver y nvidia en el HOST y también dentro del contenedor. Luego puedo instalar, digamos, xterm y twm dentro del contenedor para probarlo. Mi escritorio diario está configurado alrededor de OpenBox y reside dentro de un contenedor.
starfry
Estoy en Fedora ¿Cómo lo estás probando? Lo que intenté fue ejecutar un servidor X dentro del contenedor en la pantalla: 1, que falló espectacularmente (el host X murió).
Robin Green
Robin, he actualizado la respuesta original con más detalles para ti.
starfry
2

Si tu puedes hacerlo. También puede usarlo lxc.mount.entrypara no tener que ejecutar el script de inicialización dentro del contenedor con todos los mknodcomandos. Entonces, la configuración del contenedor lxc debería contener algo como esto:

lxc.cgroup.devices.allow = c 4:7 rwm
lxc.mount.entry = /dev/tty7 dev/tty7 none bind,optional,create=file
lxc.cgroup.devices.allow = c 4:8 rwm
lxc.mount.entry = /dev/tty8 dev/tty8 none bind,optional,create=file
lxc.cgroup.devices.allow = c 10:63 rwm
lxc.mount.entry = /dev/vga_arbiter dev/vga_arbiter none bind,optional,create=file
lxc.cgroup.devices.allow = c 13:* rwm
lxc.mount.entry = /dev/input dev/input none bind,optional,create=dir
lxc.cgroup.devices.allow = c 29:0 rwm
lxc.mount.entry = /dev/fb0 dev/fb0 none bind,optional,create=file
# /dev/dri/card0 AMD Graphics card
lxc.cgroup.devices.allow = c 226:0 rwm 
lxc.cgroup.devices.allow = c 226:64 rwm
lxc.cgroup.devices.allow = c 226:128 rwm
lxc.mount.entry = /dev/dri dev/dri none bind,optional,create=dir
#lxc.cgroup.devices.allow = c 195:* rwm  # /dev/nvidia Graphics card
#lxc.mount.entry = /dev/nvidia0 dev/nvidia0 none bind,optional,create=file
#lxc.mount.entry = /dev/nvidiactl dev/nvidiactl none bind,optional,create=file
#lxc.cgroup.devices.allow = c 116:* rwm
#lxc.mount.entry = /dev/snd dev/snd none bind,optional,create=dir

Para configurar dispositivos de entrada para X, puede usar evdev, lo que es especialmente útil si no puede usar el xf86-input-keyboardcontrolador. Dado que el número exacto de event*entradas en el archivo de configuración (p /usr/share/X11/xorg.conf.d/10-lxc-input.conf. Ej. ) Dependerá de lo que haya en su contenedor / dev / input /, puede usar un script para generar uno:

#!/bin/bash
cat >/usr/share/X11/xorg.conf.d/10-lxc-input.conf << _EOF_
Section "ServerFlags"
     Option "AutoAddDevices" "False"
EndSection
_EOF_

cd /dev/input
for input in event*
do
cat >> /usr/share/X11/xorg.conf.d/10-lxc-input.conf <<_EOF_
Section "InputDevice"
    Identifier "$input"
    Option "Device" "/dev/input/$input"
    Option "AutoServerLayout" "true"
    Driver "evdev"
EndSection
_EOF_
done

Esto debería ser suficiente para que X funcione:

/usr/bin/startx -- :0 vt07

También puede habilitar el audio, ya sea pasando / dev / snd, o configurando pulseaudio a través de tcp o un socket.

Mykola Dimura
fuente