Linux - LXC; развертывание изображений с крошечным X11


19

в настоящее время возможно ли настроить контейнеры LXC с возможностями X11? Я с нетерпением жду самого легкого из доступных контейнеров X11 (с точки зрения памяти), аппаратное ускорение плюс, но не обязательно.

Если в настоящее время это невозможно или не доступно, известно ли, какие функциональные возможности еще необходимо реализовать для его поддержки?

Ответы:


15

да, можно запустить полную среду рабочего стола X11 внутри контейнера LXC.

Прямо сейчас я делаю это на Arch Linux. Я не скажу, что он «легкий», так как я не зашёл так далеко, пытаясь убрать вещи из стандартной установки менеджера пакетов, но я могу подтвердить, что он работает очень хорошо.

Вы должны установить любые драйверы ядра как на хосте, так и в контейнере. Такие вещи, как графический драйвер (я использую nvidia). Вы должны сделать узлы устройства в dev доступными внутри контейнера, сконфигурировав свой container.conf, чтобы разрешить это. Затем вам нужно убедиться, что эти узлы устройства созданы внутри контейнера (т.е. mknod).

Итак, чтобы ответить на ваш вопрос: ДА, это работает. Если я могу помочь в дальнейшем или предоставить более подробную информацию, пожалуйста, дайте мне знать.

--- предоставляется дополнительная информация ---

В моем контейнере ... / etc / inittab запускается на уровне запуска 5 и запускает "slim". Slim настроен на использование 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

Я не использую второй дисплей X на моем текущем vt, но совершенно другой (я могу переключаться между многими из этого, используя CTRL + ALT + Fn).

Если вы не используете slim, вы можете использовать такую ​​конструкцию, чтобы запустить X на другом vt:

 /usr/bin/startx -- :10 vt10

На дисплее появится надпись «X»: 10 и поместите его на vt10 (CTRL + ALT + F10). Они не должны соответствовать, но я думаю, что лучше, если они делают.

Вам нужна конфигурация вашего контейнера, чтобы сделать доступными соответствующие устройства, например:

 # 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

И вам нужно сделать устройства в вашем контейнере:

 # 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

Я также вручную настроил устройства ввода (так как у нас нет udev в контейнере)

 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

Выше приведено в файле /etc/X11/xorg.conf.d/10-input.conf

Не уверен, что все это поможет, но удачи!


Я не смог заставить это работать с nouveau или с nouveau + vesa. Есть какие-нибудь подсказки? Должен ли я использовать проприетарный драйвер?
Робин Грин

Я использую проприетарный драйвер. Я не пробовал ничего другого. Вы на ArchLinux? Я установил xorg-xserver и nvidia на хосте, а также внутри контейнера. Затем я могу установить, скажем, xterm и twm внутри контейнера, чтобы проверить его. Мой повседневный рабочий стол настроен вокруг OpenBox и находится внутри контейнера.
Starfry

Я на Fedora. Как вы это тестируете? Я попытался запустить X-сервер внутри контейнера на экране: 1, который потерпел неудачу (хост X умер).
Робин Грин

Робин, я обновил исходный ответ более подробно для тебя.
Starfry

2

Да, вы можете сделать это. Вы также можете использовать его lxc.mount.entryтак, чтобы вам не нужно было запускать скрипт инициализации внутри контейнера со всеми mknodкомандами. Таким образом, конфигурация контейнера lxc должна содержать что-то вроде этого:

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

Для настройки устройств ввода для X вы можете использовать evdev, что особенно полезно, если вы не можете использовать xf86-input-keyboardдрайвер. Поскольку точное количество event*записей в файле конфигурации (например /usr/share/X11/xorg.conf.d/10-lxc-input.conf) будет зависеть от того, что находится в вашем контейнере / dev / input /, вы можете использовать скрипт для его генерации:

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

Этого должно быть достаточно для работы X:

/usr/bin/startx -- :0 vt07

Вы также можете включить звук, передавая / dev / snd или настраивая pulseaudio через tcp или через сокет.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.