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

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

Для этого варианта использования, что обычно делают программы (например, GNU ls или GNU grep с --color=auto) должен использовать цвета, если их вывод идет в терминал и никакие цвета иначе. Терминалы, которые не поддерживают последовательности изменения цвета ANSI, достаточно редки, что приемлемо заставить их пользователей переопределить выбор по умолчанию. В любом случае удостоверьтесь, что Ваше приложение имеет опцию вызвать цвета на или прочь.

В сценарии оболочки использовать [ -t 1 ] протестировать, если стандартный вывод является терминалом.

# option processing has set $color to yes, no or auto
if [ $color = auto ]; then
  if [ -t 1 ]; then color=yes; else color=no; fi
fi

Из программы с помощью API C звонить isatty(1).

# option processing has set use_color to 0 for no, 1 for yes or 2 for auto
if (use_color == 2) use_color = isatty(1);
19
01.02.2017, 16:52
2 ответа

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

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

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

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

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

В моем контейнере.../etc/inittab запускается на уровне выполнения 5 и запускается, "худой" 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, но совершенно другой (я могу переключиться между многими thise, использующими CTRL+ALT+Fn).

Если Вы не используете тонкий, можно использовать конструкцию как это для запуска 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

Не уверенный, если какое-либо из этого поможет, но удачи!

15
27.01.2020, 19:45
  • 1
    я не смог получить эту работу с nouveau, или с nouveau + vesa. Какие-либо подсказки? Я должен использовать собственный драйвер? –  Robin Green 05.02.2012, 00:42
  • 2
    я использую собственный драйвер. Я не попробовал ничто больше. Вы находитесь на ArchLinux? Я установил xorg-xserver и Nvidia на ХОСТЕ и также в контейнере. Я могу затем установить, скажем, xterm и twm в контейнере для тестирования его. Мой повседневный рабочий стол настроен вокруг OpenBox и находится в контейнере. –  starfry 07.02.2012, 16:39
  • 3
    я нахожусь на Fedora. Как Вы тестируете его? То, что я попробовал, выполняло X-сервер в контейнере на экране:1, который перестал работать эффектно (хост X умер). –  Robin Green 07.02.2012, 17:15
  • 4
    Robin, я обновил исходный ответ с большим количеством детали для Вас. –  starfry 08.02.2012, 11:31

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

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 Водитель. Поскольку точное количество записей событий * в файле конфигурации (например, /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 или установив up pulseaudio через TCP или сокет.

2
27.01.2020, 19:45

Теги

Похожие вопросы