docker: ¿como ejecutar x desktop en un contenedor?

10

Estoy tratando de configurar mi máquina Linux para ejecutar múltiples sistemas operativos invitados, uno de los cuales es una VM de Windows y otro un contenedor de Linux. El objetivo aquí es evitar que estropee el sistema host, al mismo tiempo que soy libre de operar el sistema operativo base y jugar con el hardware del host. Eventualmente, además de ejecutar mi escritorio en el contenedor, espero ejecutar simulaciones aceleradas por gráficos, etc. Dado que Docker tiene una versión tan buena de los contenedores incorporados, me pareció una buena idea usarlo. Quizás libvirt sería igual de bueno con LXC, pero el modo privilegiado de Docker hace que sea más fácil no tener que configurar dispositivos en el contenedor.

He investigado un poco y ya tengo algunas respuestas, pero tengo problemas para reunirlo todo.

Antecedentes en LXC

Ejecutar X desde LXC me ayudó a ver cómo puedo configurar un contenedor con (es decir):

lxc.cgroup.devices.allow = c 226:0 rwm

y usando

mknod -m 666 dri/card0 c 226 0

dentro del contenedor para conectarse al dispositivo host.

Estibador

Desde cuda: al usar la GPU desde un contenedor docker , vi que puedo obtener la misma configuración para trabajar en Docker con el back-end LXC.

Me pareció que si un contenedor acoplable se ejecuta en modo privilegiado, entonces puede acceder a la GPU normalmente sin esta configuración adicional. Entonces, encendí un sistema base, instalé controladores gráficos, xorg-server, xorg-xinit y un administrador de ventanas para probarlo.

Primer intento

# startx
Cannot run from a console (or some message like that)

Bien, pensé que estaba en tty2.

# tty
/dev/console

Eso no es lo que esperaba.

# chvt 2
# tty
/dev/tty2

Bueno, parece que eso funcionó. Intentemos de # startxnuevo. Comenzó el administrador de ventanas, con el cursor en el centro. Sin respuesta del mouse. No hay respuesta del teclado. Intentemos cambiar el tty con Ctrl-Alt+F3. Ninguna respuesta. Bueno, parece que tendré que reiniciar en frío.

Segundo intento

# tty
/dev/console
# chvt 2
# tty
/dev/console

¿Qué? No puedo cambiarlo ahora?

Continuado

Después de intentarlo otra vez, conseguí cambiar tty, y startx congeló la computadora nuevamente.

¿Ahora que?

Entonces, ahora estoy en un punto muerto. Realmente quiero poder usar un contenedor (Docker prefiere, LXC con libvirt también es aceptable) para ejecutarlo como mi sistema operativo diario mientras mantengo un sistema operativo host magro.

¿Es mejor usar Docker con modo privilegiado aquí, o usar el backend LXC explícito y probar las opciones enumeradas anteriormente?

Ya estoy planeando usar libvirt (posiblemente bajo vagrant-libvirt) para administrar mi VM de Windows, ¿sería lo mismo para mí usar libvirt o vagrant-LXC en este caso?

Editar: al leer LXC frente a Docker , tengo la sensación de que, dado que los contenedores Docker y Docker están destinados a entornos de una sola aplicación, tal vez sería mejor usar LXC en lugar de Docker para ejecutarlo como mi sistema operativo diario. Pensamientos?

Editar: descubrí que, como Docker, hay un comando lxc-device que me permite omitir los pasos cgroups y mknod. Mientras que antes era capaz de hacer que x comenzara y congelara mi sistema, ahora solo se produce un error. Quizás pueda resolver esto eventualmente, ya que nadie parece estar ahí afuera.

Actualización: tengo el mouse funcionando. En el invitado, instalé xf86-input-mouse y xf86-input-keyboard. En el host, ejecuté lo siguiente:

# lxc-device -n g1 add /dev/input/mice
# lxc-device -n g1 add /dev/dri/card0
# lxc-device -n g1 add /dev/dri/controlD64
# lxc-device -n g1 add /dev/dri/renderD128
# lxc-device -n g1 add /dev/fb0
# lxc-device -n g1 add /dev/tty2

¡Trabajos!

Paul
fuente
Estoy bastante convencido de que LXC es lo que necesito usar, y no Docker. Desafortunadamente, es un momento bastante difícil para encontrar documentación actualizada sobre la vinculación de un tty específico a un contenedor para poder ejecutar X. Tanto mi host como mi invitado usan systemd, mientras que toda la documentación relacionada está relacionada con / etc / inittab. ¿Alguien sabe cómo trabajar correctamente con los contenedores LXC para que "posean" una propiedad en el host?
Paul
Cuando di LXC su propio terminal, espera y tarjetas de vídeo asignar a ella, he intentado startxcon exec twm, pero todo estaba congelado desde mi perspectiva. No hay respuesta al teclado o al mouse.
Paul
unix.stackexchange.com/questions/18003/linux-lxc-deploying-images-with-tiniest-possible-x11 parece tener una respuesta relevante. Creo que necesito reenviar la cadena / dev / input. Lo intentaré
Paul
Parece que unix.stackexchange.com/questions/18003/… tenía la respuesta, de acuerdo con irclog.perlgeek.de/crimsonfu/2015-03-23#i_10327389
Philip Durbin
Bueno, pensé que tenía el teclado resuelto. Pero ahora no funciona de nuevo.
Paul

Respuestas:

1

Esta pregunta tenía la respuesta que necesitaba. Por supuesto, usé en lxc-devicelugar de definiciones de cgroup en el archivo de configuración. Sin embargo, en mi caso, solo he conseguido que el teclado funcione en X si lo inicio en un tty diferente.

Paul
fuente