- X11/DualSeat
- Введение
- Бонусы
- Пример рабочей конфигурации
- Конфигурация 1 (новая)
- Конфигурация 2 (старая)
- Тонкости запуска X-серверов
- а) последовательный запуск X-серверов
- a1) запуск 1-го сервера через DM, второго с консоли
- a2) запуск серверов через DM последовательно
- b) параллельный запуск X-серверов с преинициализацией
- Другие грабли c X
- Совместный доступ к периферии
- Печать
- Разделение звука между рабочими местами
- xorg.conf
- Полезные ссылки
X11/DualSeat
Настройка мультистанции DualSeat на паре видеокарт.
Введение
В этой статье рассказывается как настроить DualSeat на паре видеокарт NVIDIA (встроенная+внешняя для платы со встроенным видео, либо 2 внешние для платы с 2-мя PCI-E/16). Для каждого рабочего места запускается свой X-сервер. Такая конфигурация позволяет достаточно легко настроить независимые рабочие места с 3D ускорением, при этом нет необходимости в запуске вложенных X-серверов.
Если у вас встроенная видеокарта безальтернативно отключается при наличии внешней, или есть только внешняя двухголовая видеокарта, то вам сюда: /AltLinux/Dokumentacija/Multistation.
По сообщению Vitaly Ostanin , у него в свое время на достаточно похожей конфигурации второй X server намертво вешал систему.
Возможно, эту проблему можно обойти с помощью описанного ниже способа последовательного старта X-серверов. Но в любом случае не советую покупать оборудование исключительно в расчете на этот Dual Seat, оно может просто не заработать 🙁
Бонусы
1) Два полностью независимых рабочих места со своим пользователем, монитором, звуком, мышью и клавиатурой.
2) 3D ускорение на каждом рабочем месте.
Пример рабочей конфигурации
Конфигурация 1 (новая)
материнка Asus M3N78 со встроенной nvidia 8200 внешняя nvidia 8400GS 2 монитора 2 мыши Logitech (usb+usb) ps/2 клавиатура usb клавиатура A4tech-KIP800
Софт: ALT Linux 4.1/branch (архитектура x86_64), nvidia 177.80
Конфигурация 2 (старая)
В свое время также организовал Dual Seat на следующем железе:
материнка Gigabyte GA-M55plus-S3G со встроенной nvidia 6150LE (Спасибо Саше (led@) за совет) внешняя nvidia 8400GS 2 монитора 2 мыши Logitech (ps/2+usb) ps/2 клавиатура usb клавиатура A4tech-KIP800
Софт: nvidia 100.14.19, ALT Linux 4.0/Бранч (архитектура x86_64)+Сизиф 200801xx. (взяты xorg-x11-server-1.4.0.90-alt8, xorg-x11-drv-evdev-1.2.0-alt3 и зависимости. в бранче 4.0 xorg-x11-drv-evdev сломан для клавиатур, да и xorg-x11-server лучше брать 1.4.0. для нового xorg пришлось еще обновить все пакеты шрифтов (важно)).
Тонкости запуска X-серверов
В указанной конфигурации нельзя инициализировать 2 X-сервера одновременно (повиснет). IsolateDevice с PCIe не работает 🙁 Возможно, в новых ядрах помог бы vga arbitration (когда настраивал DualSeat, его еще не было).
После того, как X-сервер первый раз запустился (и выполнил какую-то инициализацию железа, -probeonly недостаточно), уже можно оба X-сервера останавливать и запускать одновременно. При чем дополнительно пришлось (в новой конфигурации) указать
Option "ProbeAllGpus" "False"
чтобы система не зависала, в старой конфигурации можно было не указывать.
а) последовательный запуск X-серверов
a1) запуск 1-го сервера через DM, второго с консоли
Конфигурация WDM для запуска только seat0:
cat /etc/X11/wdm/Xservers :0 local /usr/bin/Xorg :0 -layout seat0
Приходится при загрузке запускать 1 сервер, а потом с консоли запускать второй. При этом либо в seat0 нужно убрать
Option «ProbeAllGpus» «False»
чтобы первый X-сервер выполнил инициализацию, либо использовать принудительную инициализацию (см. x-multiseat-preinit).
первый X-сервер надо пускать без -sharevts. Иначе gpm получит доступ к видеопамяти и станет ее портить. (Артефакты на экране при движении мышью). Второй X-сервер можно пускать командой
$ cat ~/bin/X2 startx -- :1 -layout seat1 -novtswitch -sharevts vt8 -nolisten tcp
a2) запуск серверов через DM последовательно
Сложность задачи в том, что нужно заставить DM запускать X-сервера последовательно, один за другим. Иначе, например, wdm c конфигурацией cat /etc/X11/wdm/Xservers
# DualSeat: -novtswitch -sharevts is nesessary when we launch X from X # -nolisten tcp here is not related to DualSeat; just for security # note: wdm will launch servers in reverse order. :1 local /usr/bin/X :1 -novtswitch -sharevts -layout seat1 -nolisten tcp :0 local /usr/bin/X :0 -layout seat0 -nolisten tcp
пытается запустить 2 X-сервера одновременно, что намертво вешает систему, если не выполнялась преинициализация либо не использовался патченный wdm (см. ниже).
В DM, которым я пользовался (wdm), опции для последовательного запуска X-серверов не нашел. Читатели могут попытаться разобраться со своим DM самостоятельно. Что касается wdm, то я сначала пошел путем b), но потом, столкнувшись с некоторой нестабильностью, все же пропатчил wdm, чтобы он запускал X сервера последовательно.
--- wdm-1.28/src/wdm/dm.c 2009-02-05 22:51:40 +0200 +++ wdm-1.28/src/wdm/dm.c 2009-02-05 23:02:11 +0200 @@ -685,6 +685,8 @@ WDMDebug("pid: %d\n", pid); d->pid = pid; d->status = running; + /* TODO: check a predeclared X resource here */ + if (1) WaitForServer (d); break; > >
Более сложный патч с поддержкой X ресурса DisplayManager*wdmSequentialXServerLaunch. При использовании второго патча в wdm-config нужно добавить строчку
DisplayManager*wdmSequentialXServerLaunch: true
b) параллельный запуск X-серверов с преинициализацией
Принудительная предварительная инициализация видеокарт + последующий параллельный запуск X-серверов.
Идея следующая: Перед запуском сервиса dm запускается X-сервер, который делает первичную инициализацию, используя конфигурацию с доступом ко всем видеокартам. Например, используя «ServerLayout» «dualhead».
Соответствующий скрипт оформлен в пакет X-multiseat-preinit (git).
Конфигурация WDM в расчете на X-multiseat-preinit:
cat /etc/X11/wdm/Xservers :0 local /usr/bin/X :0 -layout seat0 :1 local /usr/bin/X :1 -novtswitch -sharevts -layout seat1
Другие грабли c X
Option "AutoAddDevices" "false"
Добавить обязательно, иначе hal попытается автоматически отдать все свободные мыши и клавиатуры серверу, который успел запуститься раньше.
Совместный доступ к периферии
Печать
Добавил всех пользователей в группу lp.
Разделение звука между рабочими местами
При желании достаточно всего одной многоканальной звуковой карты, на alsa wiki рассказывается, как, например, из одной 4-х канальной звуковой карты сделать 2 виртуальные 2-х канальные.
Однако из-за избытка железа в DualSeat оказалось 3 звуковых карты:
1) встроенная в материнскую плату => наушники 1 2) встроенная в USB клавиатуру => наушники 2 3) внешняя PCI => выход на колонки.
для переключения вывода звука между колонками и наушниками используется asoundconf-gtk (git).
xorg.conf
Section "ServerFlags" # Option "AllowMouseOpenFail" "true" # Option "AllowEmptyInput" "true" Option "DefaultServerLayout" "dualhead" Option "AutoAddDevices" "false" EndSection Section "ServerLayout" Identifier "dualhead" InputDevice "Keyboards" "CoreKeyboard" InputDevice "mice" "CorePointer" Screen 0 "Screen0" 0 0 Screen 1 "Screen1" RightOf "Screen0" EndSection Section "ServerLayout" Identifier "xinerama" InputDevice "Keyboards" "CoreKeyboard" InputDevice "mice" "CorePointer" Screen 0 "Screen0" 0 0 Screen 1 "Screen1" RightOf "Screen0" Option "Xinerama" "on" EndSection Section "ServerLayout" Identifier "seat0" InputDevice "Keyboard0e" "CoreKeyboard" InputDevice "usbmouse0" "CorePointer" Screen 0 "Screen0" 0 0 # the same as IsolateDevice, but use bus id from "device" section # note: only make things worse # Option "SingleCard" "true" EndSection Section "ServerLayout" Identifier "seat1" # this usb keyboard has separate core and multimedia parts InputDevice "Keyboard1e.0" "CoreKeyboard" InputDevice "Keyboard1e.1" "SendCoreEvents" InputDevice "Keyboard1e.2" "SendCoreEvents" InputDevice "usbmouse1" "CorePointer" Screen 0 "Screen1" 0 0 # Option "SingleCard" "true" EndSection Section "Module" Load "freetype" Load "glx" Load "dri" Load "dbe" SubSection "extmod" Option "omit xfree86-dga" EndSubSection EndSection Section "InputDevice" Identifier "Keyboards" Driver "kbd" Option "AutoRepeat" "250 40" #Option "XkbModel" "pc105" Option "XkbModel" "a4techKBS8" #Option "XkbLayout" "us,ru,ua" #Option "XkbVariant" ",winkeys,winkeys" #Option "XkbOptions" "grp:menu_toggle,grp_led:scroll" EndSection Section "InputDevice" Identifier "Keyboard0e" Driver "evdev" Option "Device" "/dev/input/by-path/platform-i8042-serio-0-event-kbd" Option "XkbModel" "evdev" # Option "XkbLayout" "us,ru,ua" # Option "XkbVariant" ",winkeys,winkeys" # Option "XkbOptions" "grp:menu_toggle,grp_led:scroll" EndSection Section "InputDevice" # keyboard 1 - the main part (useful keys) Identifier "Keyboard1e.0" Driver "evdev" Option "Device" "/dev/input/by-path/pci-0000:00:02.1-usb-0:1.1:1.0-event-kbd" Option "XkbModel" "evdev" # Option "XkbLayout" "us,ru,ua" # Option "XkbVariant" ",winkeys,winkeys" # Option "XkbOptions" "grp:menu_toggle,grp_led:scroll" EndSection Section "InputDevice" # keyboard 1 - the extra part (multimedia keys) Identifier "Keyboard1e.1" Driver "evdev" Option "Device" "/dev/input/by-path/pci-0000:00:02.1-usb-0:1.1:1.1-event-" EndSection Section "InputDevice" # keyboard 1 - the extra part (multimedia keys) # seems to be exact clone of "Keyboard1e.1" Identifier "Keyboard1e.2" Driver "evdev" Option "Device" "/dev/input/by-path/pci-0000:00:02.1-usb-0:1.2:1.3-event-" EndSection Section "InputDevice" Identifier "mice" Driver "mouse" Option "Device" "/dev/input/mice" Option "Protocol" "IMPS/2" Option "ZAxisMapping" "4 5" EndSection Section "InputDevice" Identifier "usbmouse0" Driver "mouse" Option "Device" "/dev/input/by-path/pci-0000:00:02.0-usb-0:3:1.0-mouse" Option "Protocol" "IMPS/2" Option "ZAxisMapping" "4 5" EndSection Section "InputDevice" Identifier "usbmouse1" Driver "mouse" Option "Device" "/dev/input/by-path/pci-0000:00:04.0-usb-0:1:1.0-mouse" Option "Protocol" "IMPS/2" Option "ZAxisMapping" "4 5" EndSection Section "Monitor" Identifier "Monitor0" EndSection Section "Monitor" Identifier "Monitor1" Option "DPMS" "true" EndSection Section "Device" Identifier "CardInt" Driver "nvidia" BoardName "GeForce 8200" BusID "PCI:2:0:0" Option "NoLogo" "True" Option "ProbeAllGpus" "False" EndSection Section "Device" Identifier "CardExt" Driver "nvidia" BoardName "GeForce 8400 GS" BusID "PCI:3:0:0" Option "NoLogo" "True" Option "ProbeAllGpus" "False" EndSection Section "Screen" Identifier "Screen0" Device "CardExt" Monitor "Monitor0" DefaultDepth 24 SubSection "Display" Depth 8 Modes "1280x1024" "1152x864" "1024x768" "832x624" "800x600" "720x400" "640x480" EndSubSection SubSection "Display" Depth 15 Modes "1280x1024" "1152x864" "1024x768" "832x624" "800x600" "720x400" "640x480" EndSubSection SubSection "Display" Depth 16 Modes "1280x1024" "1152x864" "1024x768" "832x624" "800x600" "720x400" "640x480" EndSubSection SubSection "Display" Depth 24 Modes "1280x1024" "1152x864" "1024x768" "832x624" "800x600" "720x400" "640x480" EndSubSection SubSection "Display" Depth 32 Modes "1280x1024" "1152x864" "1024x768" "832x624" "800x600" "720x400" "640x480" EndSubSection EndSection Section "Screen" Identifier "Screen1" Device "CardInt" Monitor "Monitor1" DefaultDepth 24 SubSection "Display" Depth 8 Modes "1680x1050" EndSubSection SubSection "Display" Depth 16 Modes "1680x1050" EndSubSection SubSection "Display" Depth 24 Modes "1680x1050" EndSubSection EndSection Section "DRI" Group "xgrp" Mode 0660 EndSection
Полезные ссылки
- Два рабочих места из одного компьютера на Linux Gentoo
- «Создание 3D Multiseat на основе debian»
- linux.org.ua «3D Multiseat» (укр.)
- Multiseat wiki (архив)
- Gentoo Wiki
- Arch Wiki
- MultiseatX Community Ubuntu Documentation
- Configuring multiseat X workstation
- Работоспособность Multiseat на различных железках/драйверах (2009)
- про GrabDevice при улетании evdev-ввода вместо графики в консоль
- страница ссылок MultiHead