Linux - LXC; wdrażanie obrazów przy użyciu najmniejszego możliwego X11

19

czy obecnie można skonfigurować kontenery LXC z funkcjami X11? Nie mogę się doczekać najlżejszego dostępnego kontenera X11 (pod względem pamięci), przyspieszenie sprzętowe jest plusem, ale nie jest konieczne.

Jeśli nie jest to obecnie możliwe lub łatwo dostępne, czy wiadomo, jaką funkcjonalność należy jeszcze zaimplementować, aby ją obsługiwać?

lurscher
źródło

Odpowiedzi:

15

tak, możliwe jest uruchomienie pełnego środowiska pulpitu X11 w kontenerze LXC.

W tej chwili robię to na Arch Linux. Nie powiem, że to „lekkie”, ponieważ nie posunąłem się nawet do próby usunięcia rzeczy ze standardowej instalacji menedżera pakietów, ale mogę potwierdzić, że działa bardzo dobrze.

Musisz zainstalować dowolne sterowniki jądra w HOST, a także w kontenerze. Takie rzeczy jak sterownik karty graficznej (używam nvidii). Musisz sprawić, aby węzły urządzeń w dev były dostępne w kontenerze, konfigurując plik container.conf, aby na to zezwolił. Następnie musisz się upewnić, że te węzły urządzeń są utworzone w kontenerze (tj. Mknod).

Tak więc, aby odpowiedzieć na pytanie: TAK, to działa. Jeśli mogę w czymś pomóc lub podać więcej szczegółów, proszę dać mi znać.

--- dodatkowe informacje dostarczone ---

W moim kontenerze / etc / inittab rozpoczyna się na poziomie uruchomienia 5 i uruchamia „slim” Slim jest skonfigurowany do używania 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

Nie używam drugiego wyświetlacza X na moim obecnym vt, ale zupełnie innego (mogę przełączać się między wieloma z nich za pomocą CTRL + ALT + Fn).

Jeśli nie używasz slim, możesz użyć takiej konstrukcji, aby uruchomić X na innym vt:

 /usr/bin/startx -- :10 vt10

To uruchomi X na wyświetlaczu: 10 i umieści go na vt10 (CTRL + ALT + F10). Te nie muszą się zgadzać, ale myślę, że lepiej, jeśli tak.

Potrzebujesz konfiguracji kontenera, aby udostępnić odpowiednie urządzenia, takie jak to:

 # 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

I musisz zrobić urządzenia w swoim kontenerze:

 # 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

Również ręcznie skonfigurowałem urządzenia wejściowe (ponieważ nie mamy udev w kontenerze)

 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

Powyższe dzieje się w pliku /etc/X11/xorg.conf.d/10-input.conf

Nie jestem pewien, czy coś z tego pomoże, ale powodzenia!

rozgwiazdy
źródło
Nie byłem w stanie uzyskać tej pracy z nouveau lub nouveau + vesa. Jakieś wskazówki? Czy muszę używać zastrzeżonego sterownika?
Robin Green
Używam zastrzeżonego sterownika. Nie próbowałem nic innego. Czy korzystasz z ArchLinux? Zainstalowałem xorg-xserver i nvidia na HOST, a także wewnątrz kontenera. Następnie mogę zainstalować, powiedzmy, xterm i twm wewnątrz kontenera, aby go przetestować. Mój codzienny pulpit jest skonfigurowany wokół OpenBox i znajduje się w kontenerze.
starfry
Jestem na Fedorze. Jak to testujesz? Próbowałem uruchomić serwer X wewnątrz kontenera na ekranie: 1, który zawiódł spektakularnie (host X zmarł).
Robin Green,
Robin, zaktualizowałem oryginalną odpowiedź z bardziej szczegółowymi informacjami dla Ciebie.
starfry
2

Tak, możesz to zrobić. Możesz także użyć lxc.mount.entrytej opcji, aby nie trzeba było uruchamiać skryptu inicjującego w kontenerze ze wszystkimi mknodpoleceniami. Więc konfiguracja kontenera lxc powinna zawierać coś takiego:

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

Aby skonfigurować urządzenia wejściowe dla X, możesz użyć evdev, co jest szczególnie przydatne, jeśli nie możesz użyć xf86-input-keyboardsterownika. Ponieważ dokładna liczba event*wpisów w pliku konfiguracyjnym (np. /usr/share/X11/xorg.conf.d/10-lxc-input.conf) Będzie zależała od zawartości Twojego kontenera / dev / input /, możesz użyć skryptu do wygenerowania jednego:

#!/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

To powinno wystarczyć, aby X działał:

/usr/bin/startx -- :0 vt07

Możesz także włączyć audio, przekazując / dev / snd lub konfigurując pulseaudio za pośrednictwem tcp lub gniazda.

Mykoła Dimura
źródło