Поскольку из блогов у меня есть учётка только в ЖЖ, где удобно только ругать Путина, решил поделиться опытом тут. Если уже было, извиняйте.
Пользуюсь мультиситом с 2008 года, но до сих пор не доходили руки разобраться с горячим подключением устройств ввода. Классический сетап подразумевает жесткое прописывание клавиатур и мышек в xorg.conf, и если во время работы иксов происходит отключение устройства, вернуть его можно только с помощью перезапуска сервера.
Относительно недавно всеми горячо любимый Леннарт Поттеринг, добавил поддержку мультисита в systemd. Ничего конкретного в новостях тогда не было, и после собственно расследования, я пришел к выводу, что это пустышка. Он придумал систему тэгов в базе udev, на основании которых иксы должны цеплять или не цеплять устройства ввода. Самая информативная часть его работы была кусочком кода на Си, пример обработки этих тегов сервером дисплеев.
И когда моё время встретилось с желанием его «продуктивно» провести, я стал копать в сторону относительно новой секции InputClass в конфиге иксов. В Ubuntu 10.04, где всё и происходило, в иксы она добавляется в виде патча. При этом в более позднии версии иксов была добавлена поддержка дополнительных опций для этой секции.
Оказалось, что функционал из systemd уже давно запилен и работает, всё что нужно, это несколько текстовых файлов с настройками.
Итак, сначала добавляем правила udev, чтобы связать устройства с места пользователей:
# Apply these rules only to input devices
SUBSYSTEM!="input", GOTO="custom_input_end"
KERNEL=="input[0-9]*", GOTO="custom_input_end"
ACTION!="add|change", GOTO="custom_input_end"
# Seat 0
ATTRS{description}=="i8042 KBD port", ENV{ID_INPUT.tags}="seat0"
ATTRS{idVendor}=="046d", ATTRS{idProduct}=="c01b", ENV{ID_INPUT.tags}="seat0"
ATTRS{name}=="Venus USB2.0 Camera", ENV{ID_INPUT.tags}="seat0"
# Seat 1
ATTRS{idVendor}=="046d", ATTRS{idProduct}=="c069", ENV{ID_INPUT.tags}="seat1"
ATTRS{idVendor}=="046d", ATTRS{idProduct}=="c313", ENV{ID_INPUT.tags}="seat1"
ATTRS{product}=="Plantronics Wireless Audio", ENV{ID_INPUT.tags}="seat1"
LABEL="custom_input_end"
Тут всё просто, ну а если не всё, то предлагаю почитать доки по удаву, пойдет на пользу. Я назвал это 99-multiseat-tags.rules, и скопировал в /etc/udev/rules.d
Дальше создаются почти одинаковые файлы настроек для иксов, вот первый, seat0.conf:
Section "ServerFlags"
Option "DontZap" "false"
Option "AllowEmptyInput" "true"
EndSection
Section "InputClass"
Identifier "Generic input device"
MatchTag "seat0"
Driver "evdev"
EndSection
Section "Monitor"
Identifier "Samsung"
Option "DPMS" "true"
EndSection
Section "Device"
Identifier "Radeon HD 4290"
Driver "radeon"
BusID "PCI:1:5:0"
EndSection
Section "Screen"
Identifier "Left Screen"
Device "Radeon HD 4290"
Monitor "Samsung"
DefaultDepth 24
SubSection "Display"
Viewport 0 0
Depth 24
EndSubSection
EndSection
Section "ServerLayout"
Identifier "Seat0"
Screen 0 "Left Screen" 0 0
Option "SingleCard" "on"
EndSection
Ключевые отличия настроек икс-сервера для разных мест это BusID и драйвер видеокарты, а также тэг в опции MatchTag. Остальное может совпадать. Файлы скопировал в /etc/X11.
И в завершение этого безобразия настройка менеджера дисплеев. У меня это KDM, подойдет также lightdm, а вот gdm3 гномоделы брутально упростили посредством фронтальной лоботомии. Спи спокойно дорогой друг.
[X-:0-Core]
AutoLoginAgain=false
AutoLoginDelay=0
AutoLoginEnable=false
AutoLoginLocked=false
AutoLoginUser=
ClientLogFile=.xsession-errors
ServerVT=7
ServerCmd=/usr/bin/X -config /etc/X11/seat0.conf -layout Seat0 -sharevts -keeptty
[X-:1-Core]
AutoLoginAgain=false
AutoLoginEnable=false
AutoLoginLocked=false
ClientLogFile=.xsession-errors
ServerVT=9
ServerCmd=/usr/bin/X -config /etc/X11/seat1.conf -layout Seat1 -sharevts -keeptty -novtswitch
Здесь только кусочек kdmrc, потому что целиком его помещать сюда было бы просто антигуммано. Обращаю внимание, что ключ -novtswitch нужен только для второго сервера.
Сейчас на моем месте используется интегрированный радеон с открытым драйвером, а на втором стоит GeForce 9800GT для любителей игр с проприетарным драйвером. Как следствие никакого 3D на радеоне. Перезапись стандартных библиотек - зло!