Multiseat. One GPU
Возможно ли в современном дистрибутиве настроить мультисит на одной видеокарте?
Все ресурсы перерыл: нашёл руководства 15-тилетней давности, мультисит с отдельной видеокартой на каждый seat и какие-то хаки/поделки с хардкодной реализацией.
Из свежего нашлось, что сделали протокол drm lease и даже вроде в wayland поддержку сделали, но вот организовать multiseat с его помощью, вроде, нельзя (только если самому код допиливать).
Фиг. Мультисит требует два xorg сервера. Сервер хочет быть drm мастером. А drm не позволяет два мастера на одном устройстве. И сделать два drm устройства из одного адаптера текущие drm-kms драйверы тоже не могут.
Накостылять можно: сделать один пустой xserver на оба (или несколько) экранов, без дополнительной настройки устройств. Внутри сервера запустить Xephyr для каждого сита, внутри него уже настроить устройства ввода (он поддерживает захват устройств внутрь окна).
Аппаратного ускорения не будет, но, возможно, получится прикрутить https://virtualgl.org/
А drm не позволяет два мастера на одном устройстве
Если я правильно понимаю, drm leases как раз позволяет выделять часть ресурсов для создания ещё одного drm мастера.
В weston-е можно запустить сколько хочешь X-серверов Xwayland (типа так).
Но думаю лучше в weston-е запустить вложенные weston-ы, а в них уже X-серверы, можно будет разделить права доступа к вяленым сокетам.
В weston-е (drm-backend) можно сделать сколько хочешь независимых пар клаво-мышей (типа так).
НО ЛЯ, как привязать клаву и мышь к окну/weston-у/Xwayland-у ?!
Ну еще вопрос как weston-е открыть окно в определенной позиции и без декора?
Думаю если эти два вопроса решить, то можно будет сделать отличный multiseat (не то что на одном gpu, но даже на одном экране).
И да weston/Xwayland не медленнее чем Xorg и вложенные weston-ы тоже практически не снижают производительность. Единственное weston жрет лишие 50-100MB.
P.S. Xephyr тормозня и поддержку привязки клаво-мышей из него вырезали, а без этого multiseat не сделаешь.
P.P.S. Делал упор на X-сервер, но в weston-е можно и вложенные вяленые wm запускать.
arson ★★★★★ ( 24.04.22 20:58:14 MSK )
Последнее исправление: arson 24.04.22 21:01:20 MSK (всего исправлений: 1)
Спасибо. Про Xephyr я знаю, забыл написать (без ускорения не интересно).
VirtualGL выглядит интересно. Но как-то уж слишком костыльно выглядит если всё это на одной машине поднимать.
а drm lease выглядит как серебрянная пуля для multiseat: чисто, просто, без ненужных прослоек
Multiseat на компьютере с ОС Debian
В данной статье описан один из способов настройки Multiseat(двух независимых рабочих мест) на одном компьютере, работающим под управлением Операционной Системы Debian, данное решение позволяет на базе одного компьютера создать два полноценных рабочих места, данное решение реализовано и успешно функционирует уже несколько месяцев.
Описанное ниже было проведено на компьютере с ОС Debian 8.6 x64, с другими системами работоспособность данного решения не гарантируется, дисплейный менеджер LightDM, окружение рабочего стола XFCE.
Материнская плата Gigabyte GA-P41T-D3P rev 1.5, две видеокарты GeForce GT 430 и GeForce 8500 GT, материнская плата может быть абсолютно любой, главное чтобы была возможность одновременной установки двух видеокарт, видеокарты могут быть также любыми, главное условие, чтобы они могли работать с одной версией драйвера, при использовании двух мощных видеокарт не забываем про мощность блока питания.
Обратите внимание, на то, что в компьютере должно быть установлено 2 видеокарты, на одной двухголовой видеокарте multiseat сделать не получиться, интегрированную в материнскую плату видеокарту в большинстве случаев использовать так же не получится, так как она отключается при подключении к компьютеру другой видеокарты.
Для начала Вам нужно установить в компьютер две видеокарты, и к каждой видеокарте подключить по монитору, если у вас в материнской плате несколько разъёмов PCI-E x16 то тут проблем не будет, если у вас в материнской плате только один разъём PCI-E x16 но есть разъёмы PCI-E x1 то подключить её к материнской плате можно через устройство называемое рейзер pci-e 1x-16x, которое можно найти например на алиэкспрессе.
В качестве первой клавиатуры и мыши можно использовать как устройства с портами USB так и с портами PS/2, в качестве второй клавитуры и мыши необходимо использовать устройства с портами USB, не пытайтесь использовать переходники USB > 2 PS/2, с ними желаемый эффект получить не выйдет.
В качестве дисплейного менеджера должен использоваться LightDM, в Debian он используется по-умолчанию.
Если используются видеокарты nvidia то нужно установить проприетарный драйвер, как это делать описывать в этой статье, я думаю, будет лишним.
Далее нужно настроить X на одновременную работу двух мониторов, сделать это можно любым способом, или создав его вручную, или воспользовавшись любой утилитой, если используются видеокарты nvidia то сделать это можно запустив от рута nvidia-settings, для включения второго монитора входим X Server Display Configuration, выбираем второй монитор, в поле Configuration выбираем New X screen, разрешение и частоту лучше выставить в соответствующих полях вручную, в конце настройки не забываем нажать save to X configuration file.
Перезагружаемся, должны работать оба монитора, если так и есть-продолжаем. Делаем резервную копию файла /etc/X11/xorg.conf, после этого открываем его. У меня он был в таком виде:
Section "ServerLayout" Identifier "Layout0" Screen 0 "Screen0" 0 0 Screen 1 "Screen1" RightOf "Screen0" InputDevice "Keyboard0" "CoreKeyboard" InputDevice "Mouse0" "CorePointer" Option "Xinerama" "0" EndSection Section "Files" EndSection Section "InputDevice" Identifier "Mouse0" Driver "mouse" Option "Protocol" "auto" Option "Device" "/dev/psaux" Option "Emulate3Buttons" "no" Option "ZAxisMapping" "4 5" EndSection Section "InputDevice" Identifier "Keyboard0" Driver "kbd" EndSection Section "Monitor" Identifier "Monitor0" VendorName "Unknown" ModelName "LG Electronics W2253" HorizSync 30.0 - 83.0 VertRefresh 56.0 - 75.0 Option "DPMS" EndSection Section "Monitor" Identifier "Monitor1" VendorName "Unknown" ModelName "LG Electronics LG IPS FULLHD" HorizSync 30.0 - 83.0 VertRefresh 56.0 - 75.0 EndSection Section "Device" Identifier "Device0" Driver "nvidia" VendorName "NVIDIA Corporation" BoardName "GeForce GT 430" BusID "PCI:1:0:0" EndSection Section "Device" Identifier "Device1" Driver "nvidia" VendorName "NVIDIA Corporation" BoardName "GeForce 8500 GT" BusID "PCI:4:0:0" EndSection Section "Screen" Identifier "Screen0" Device "Device0" Monitor "Monitor0" DefaultDepth 24 Option "Stereo" "0" Option "metamodes" "DVI-I-1: 1920x1080_60 +0+0" Option "SLI" "Off" Option "MultiGPU" "Off" Option "BaseMosaic" "off" SubSection "Display" Depth 24 EndSubSection EndSection Section "Screen" Identifier "Screen1" Device "Device1" Monitor "Monitor1" DefaultDepth 24 Option "Stereo" "0" Option "metamodes" "DVI-I-1: 1920x1080_60 +0+0" Option "SLI" "Off" Option "MultiGPU" "Off" Option "BaseMosaic" "off" SubSection "Display" Depth 24 EndSubSection EndSection
Убедитесь что у вас по две секции Monitor, Device и Screen, если так то их мы больше не трогаем. Секцию ServerLayout мы удаляем и вместо неё добавляем:
Section "ServerLayout" Identifier "Layout0" Screen 0 "Screen0" 0 0 InputDevice "Keyboard0" "CoreKeyboard" InputDevice "Mouse0" "CorePointer" Option "Xinerama" "0" EndSection Section "ServerLayout" Identifier "Layout1" Screen 1 "Screen1" 0 0 InputDevice "Keyboard1" "CoreKeyboard" InputDevice "Mouse1" "CorePointer" Option "Xinerama" "0" EndSection
Удаляем секции InputDevice (их было две), вместо них добавляем 4 секции:
Section "InputDevice" Identifier "Mouse0" Driver "mouse" Option "Protocol" "ImPS/2" Option "Device" "/dev/input/mouse0" Option "Protocol" "ExplorerPS/2" EndSection Section "InputDevice" Identifier "Mouse1" Driver "mouse" Option "Protocol" "ImPS/2" Option "Device" "/dev/input/mouse1" EndSection Section "InputDevice" Identifier "Keyboard0" Driver "evdev" Option "Device" "/dev/input/by-path/platform-i8042-serio-0-event-kbd" Option "XkbRules" "xorg" Option "XkbModel" "evdev" Option "XkbLayout" "us" Option "GrabDevice" "yes" EndSection Section "InputDevice" Identifier "Keyboard1" Driver "evdev" Option "Device" "/dev/input/by-id/usb-SIGMACH1P_USB_Keykoard-event-kbd" Option "XkbRules" "xorg" Option "XkbModel" "evdev" Option "XkbLayout" "us" Option "GrabDevice" "yes" EndSection
В строке Option «Device» каждой секции InputDevice указываем свои устройства, для этого ищем в
свои мыши и клавиатуры, мыши вероятнее всего будут /dev/input/mouse0 и /dev/input/mouse1, клавиатуры у всех индивидуально.
После этого в начало файла добавляем секцию
Section "ServerFlags" Option "DefaultServerLayout" "Layout0" Option "AllowMouseOpenFail" "true" Option "AutoAddDevices" "false" Option "AutoEnableDevices" "false" Option "AllowEmptyInput" "true" Option "DontZap" "false" Option "AutoAddGPU" "false" Option "DontVTSwitch" "false" EndSection
Делаем резервную копию файла /etc/lightdm/lightdm.conf, открываем его, после строки:
minimum-display-number=0 [SeatDefaults] xserver-command=/usr/bin/X user-session=xfce greeter-session=lightdm-gtk-greeter exit-on-failure=true [Seat:0] xserver-command=/usr/bin/X :0 -sharevts autologin-guest=false xserver-layout=Layout0 [Seat:1] xserver-command=/usr/bin/X :1 -sharevts autologin-guest=false xserver-layout=Layout1
Перезагружаемся, пробуем войти в систему, не забывайте что входить необходимо под разными пользователями.
Теперь разберёмся со звуком. Для того чтобы с обоих рабочих мест можно было слушать звук делаем следующее:
Открываем файл /etc/pulse/default.pa, в начало файла добавляем строку:
load-module module-native-protocol-unix auth-anonymous=1 socket=/tmp/my-pulse-socket-name
Открываем файл /etc/pulse/client.conf, в начало файла вставляем строку
default-server = unix:/tmp/my-pulse-socket-name
Создаём файл /root/pulse.sh с следующими строками:
pulseaudio -k sleep 1 pulseaudio -D sleep 1 pulseaudio -D —system
Ставим на него права 700. В конец файла /etc/crontab добавляем строку:
@reboot root cd /root && ./pulse.sh
После этой строки обязательно сделайте одну пустую строку. Для управления звуком используем pavucontrol, если его нет то устанавливаем.
Если у Вас две звуковых карты то через pavucontrol можно для каждого приложения выбрать через какое устройство воспроизводить звук, для этого в вкладке «Проигрывание» напротив соответствующего приложения в выпадающем списке выбираем нужную звуковую карту, можно использовать на оба рабочих места одну звуковую карту, в таком случае звук с обоих рабочих мест будет выводиться через одну акустическую систему.
» На всякий случай прикладываю архив с файлами из работающей системы multiseat.zip
Как на linux настроить multiseat с одной видеокартой и аппаратным ускорением?
Прочитал статью Multiseat на компьютере с ОС Debian. Но там нужно две дискретных видеокарты.
Есть вариант, когда одна карта может быть интегрированной, а другая дискретной, как описано здесь.
Но у них есть два недостатка:
Они старые — 2008-2012 годов.
Без аппаратного ускорения. Как говорится в этой статье, решения на базе Xnest, Xephyr, XGL и т.п. — без аппаратного ускорения и в игрушки так не поиграешь. С аппаратным ускорением — это XORG. Но тогда нужно вроде как две видеокарты.
В итоге самое «свежее» решение для одной видеокарты аж от 2012 года с использованием xephyr и XDMCP. С тех пор 6 лет прошло. Удивлён, что поиск не выдаёт современных вариантов. Как настроить multiseat с одной видеокартой и аппаратным ускорением (xorg)?
Возможные решения:
В Section «Device» конфига xorg нужно прописать не только видеокарту, но и два активных выхода одной и той же видеокарты. Как пишется в этой статье, это можно сделать, прописав в Section «Device» ниже BusID дополнительную опцию Screen:
Section "Device" Identifier "NVIDIA Corporation NV40 [GeForce 6800] 0" Driver "nvidia" BusID "PCI:3:0:0" Option "RenderAccel" "true" Option "AllowGLXWithComposite" "true" Screen 0 EndSection Section "Device" Identifier "NVIDIA Corporation NV40 [GeForce 6800] 1" Driver "nvidia" BusID "PCI:3:0:0" Option "RenderAccel" "true" Option "AllowGLXWithComposite" "true" Screen 1 EndSection
Alex F нашёл как последний способ был реализован здесь (в 2014 году).
Когда протестирую, отпишусь.