sì, è possibile eseguire un ambiente desktop X11 completo all'interno di un contenitore LXC.
In questo momento, lo faccio su Arch Linux. Non dirò che è "leggero" in quanto non sono arrivato al punto di provare a eliminare le cose dall'installazione standard del gestore di pacchetti, ma posso confermare che funziona molto bene.
Devi installare tutti i driver del kernel sull'HOST e nel contenitore. Cose come il driver grafico (io uso nvidia). Devi rendere i nodi del dispositivo in dev accessibili all'interno del contenitore configurando il tuo container.conf per consentirlo. Devi quindi assicurarti che quei nodi di dispositivo siano creati all'interno del contenitore (ad esempio mknod).
Quindi, per rispondere alla tua domanda:SÌ, funziona. Se posso aiutarti ulteriormente o fornire maggiori dettagli, fammelo sapere.
--- ulteriori informazioni fornite ---
Nel mio contenitore.../etc/inittab si avvia nel livello di esecuzione 5 e avvia "slim"Slim è configurato per utilizzare 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
Non sto usando un secondo display X sul mio vt attuale, ma uno completamente diverso (posso passare da uno all'altro usando CTRL+ALT+Fn).
Se non stai usando slim, puoi usare un costrutto come questo per avviare X su un altro vt:
/usr/bin/startx -- :10 vt10
Ciò avvierà X sul display :10 e lo metterà su vt10 (CTRL+ALT+F10). Non è necessario che questi corrispondano, ma penso che sia più ordinato se lo fanno.
Hai bisogno della configurazione del tuo contenitore per rendere disponibili i dispositivi pertinenti, in questo modo:
# 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
E devi creare i dispositivi nel tuo contenitore:
# 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
Ho anche configurato manualmente i dispositivi di input (poiché non abbiamo udev incontainer)
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
Quanto sopra va in un file /etc/X11/xorg.conf.d/10-input.conf
Non sono sicuro che tutto ciò possa essere d'aiuto, ma buona fortuna!
Si, puoi farlo. Puoi anche usare lxc.mount.entry
in modo da non dover eseguire lo script di inizializzazione all'interno del contenitore con tutti i mknod
commands.Quindi la configurazione del contenitore lxc dovrebbe contenere qualcosa del genere:
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
Per configurare i dispositivi di input per X, puoi usare evdev
, che è particolarmente utile se non puoi usare il xf86-input-keyboard
autista. Poiché il numero esatto di event*
voci nel file di configurazione (ad es. /usr/share/X11/xorg.conf.d/10-lxc-input.conf
) dipenderà da cosa c'è nel /dev/input/ del tuo contenitore, potresti usare uno script per generarne 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
Questo dovrebbe essere sufficiente per far funzionare X:
/usr/bin/startx -- :0 vt07
Puoi anche abilitare l'audio, passando /dev/snd o impostando pulseaudio tramite tcp o un socket.