Linux - LXC; Bereitstellen von Images mit möglichst wenig X11

19

Ist es derzeit möglich, LXC-Container mit X11-Funktionen einzurichten? Ich freue mich auf den leichtesten verfügbaren X11-Container (speicherseitig), Hardwarebeschleunigung ein Plus, aber nicht unbedingt erforderlich.

Wenn es derzeit nicht möglich oder sofort verfügbar ist, ist bekannt, welche Funktionalität noch implementiert werden muss, um dies zu unterstützen?

lurscher
quelle

Antworten:

15

Ja, es ist möglich, eine vollständige X11-Desktop-Umgebung 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, Sachen aus der Standardpaket-Manager-Installation herauszunehmen, aber ich kann bestätigen, dass es sehr gut funktioniert.

Sie müssen alle Kerneltreiber 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 im Container zugänglich machen, indem Sie die container.conf so konfigurieren, dass sie es zulässt. Sie müssen dann sicherstellen, dass diese Geräteknoten im Container erstellt werden (dh mknod).

Um Ihre Frage zu beantworten: JA, es funktioniert. Wenn ich Ihnen weiterhelfen oder weitere Informationen geben kann, lassen Sie es mich bitte wissen.

--- zusätzliche Informationen bereitgestellt ---

In meinem Container ... / etc / inittab startet in Run Level 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 kein zweites X-Display auf meinem aktuellen Vt, sondern ein völlig anderes (ich kann mit STRG + ALT + Fn zwischen vielen wechseln).

Wenn Sie nicht slim 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 zusammenpassen, aber ich denke, es ist ordentlicher, wenn sie es tun.

Sie benötigen Ihre Containerkonfiguration, um die entsprechenden Geräte 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 machen:

 # 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 Eingabegeräte auch manuell konfiguriert (da wir kein udev im Container 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

Nicht sicher, ob irgendetwas davon hilft, aber viel Glück!

starfry
quelle
Mit Nouveau oder Nouveau + Vesa konnte ich das nicht zum Laufen bringen. Irgendwelche Hinweise? Muss ich den proprietären Treiber verwenden?
Robin Green
Ich verwende den proprietären Treiber. Ich habe nichts anderes ausprobiert. Sind Sie bei ArchLinux? Ich habe xorg-xserver und nvidia auf dem Host und auch im Container installiert. Ich kann dann zum Beispiel xterm und twm im Container installieren, um es zu testen. Mein alltäglicher Desktop ist um OpenBox konfiguriert und befindet sich in einem Container.
Starfry
Ich bin auf Fedora. Wie testest du es? Ich habe versucht, einen X-Server im Container auf dem Bildschirm auszuführen: 1, was spektakulär fehlgeschlagen ist (der Host X ist gestorben).
Robin Green
Robin, ich habe die ursprüngliche Antwort mit mehr Details für dich aktualisiert.
Starfry
2

Ja, das kannst du. Sie können auch verwenden, lxc.mount.entrydamit Sie das Initialisierungsskript nicht mit allen mknodBefehlen im Container ausführen müssen. Die Konfiguration von lxc container sollte also ungefähr so ​​aussehen:

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 verwenden evdev, was besonders nützlich ist, wenn Sie den xf86-input-keyboardTreiber nicht verwenden können . Da die genaue Anzahl der event*Einträge in der Konfigurationsdatei (z. B. /usr/share/X11/xorg.conf.d/10-lxc-input.conf) davon abhängt, was sich in Ihrem Container / dev / input / befindet, können Sie 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, entweder Passing / Dev / Snd, oder Pulseaudio über TCP oder einen Socket einrichten.

Mykola Dimura
quelle