Ja, es ist möglich, eine vollständige X11-Desktopumgebung in einem LXC-Container auszuführen.
Im Moment mache ich das auf Arch Linux. Ich werde nicht sagen, dass es "leicht" ist, da ich nicht so weit gegangen bin, Dinge aus der Standardinstallation des Paketmanagers zu entfernen, aber ich kann bestätigen, dass es sehr gut funktioniert.
Sie müssen alle Kernel-Treiber sowohl auf dem HOST als auch im Container installieren. Solche Dinge wie der Grafiktreiber (ich benutze nvidia). Sie müssen die Geräteknoten in dev innerhalb des Containers zugänglich machen, indem Sie Ihre container.conf so konfigurieren, dass sie dies zulässt. Sie müssen dann sicherstellen, dass diese Geräteknoten innerhalb des Containers erstellt werden (d. h. mknod).
Also, um deine Frage zu beantworten:JA, es funktioniert. Wenn ich weiter helfen oder weitere Details bereitstellen kann, lassen Sie es mich bitte wissen.
--- Zusätzliche Informationen bereitgestellt ---
In meinem Container.../etc/inittab startet in Runlevel 5 und startet "slim"Slim ist für die Verwendung von vt09 konfiguriert:
# 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
Ich verwende auf meinem aktuellen vt kein zweites X-Display, sondern ein ganz anderes (zwischen vielen davon kann ich mit STRG+ALT+Fn wechseln).
Wenn Sie slim nicht verwenden, können Sie ein Konstrukt wie dieses verwenden, um X auf einem anderen vt zu starten:
/usr/bin/startx -- :10 vt10
Das startet X auf dem Display :10 und setzt es auf vt10 (STRG+ALT+F10). Diese müssen nicht übereinstimmen, aber ich denke, es ist besser, wenn sie es tun.
Sie benötigen Ihre Containerkonfiguration, um die relevanten Geräte wie folgt verfügbar zu machen:
# 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
Und Sie müssen die Geräte in Ihrem Container erstellen:
# 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
Ich habe auch manuell Eingabegeräte konfiguriert (da wir kein udev incontainer haben)
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
Das obige geht in eine Datei /etc/X11/xorg.conf.d/10-input.conf
Ich bin mir nicht sicher, ob irgendetwas davon hilft, aber viel Glück!
Ja, das können Sie tun. Sie können auch lxc.mount.entry
verwenden damit Sie das Initialisierungsskript nicht innerhalb des Containers mit allen mknod
ausführen müssen Befehle. Die Konfiguration des lxc-Containers sollte also etwa Folgendes enthalten:
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
Um Eingabegeräte für X zu konfigurieren, können Sie evdev
verwenden , was besonders nützlich ist, wenn Sie xf86-input-keyboard
nicht verwenden können Treiber. Da die genaue Zahl von event*
Einträge in der Konfigurationsdatei (z.B. /usr/share/X11/xorg.conf.d/10-lxc-input.conf
) hängt davon ab, was sich in /dev/input/ Ihres Containers befindet, Sie könnten ein Skript verwenden, um eines zu generieren:
#!/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
Dies sollte ausreichen, damit X funktioniert:
/usr/bin/startx -- :0 vt07
Sie können auch Audio aktivieren, indem Sie entweder /dev/snd übergeben oder pulseaudio über TCP oder einen Socket einrichten.