LINUX.ORG.RU

multiseat + udev = profit


0

2

Поскольку из блогов у меня есть учётка только в ЖЖ, где удобно только ругать Путина, решил поделиться опытом тут. Если уже было, извиняйте.

Пользуюсь мультиситом с 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 на радеоне. Перезапись стандартных библиотек - зло!

В местную wiki!

anonymous ()

Driver «radeon»

Ээ, это то каждый может. А вот вы попробуйте накатать красивый конфиг на три видеокарты с fglrx. НЕ пройдёт) Придётся извращаться.

darkshvein ☆☆ ()
Ответ на: комментарий от leonidko

Каких? Драйвер закрытый упорно не принимает обычный конфиг и для него приходится прописывать всякую мультимониторную ересь в дополнение.
«monitor1» «LeftOfMonitor2»
«monitor2» «LeftOfMonitor1»
что то такое было там, уже не помню. Помню, что сломал моск.

darkshvein ☆☆ ()
Ответ на: комментарий от darkshvein

Ээ, это то каждый может. А вот вы попробуйте накатать красивый конфиг на три видеокарты с fglrx. НЕ пройдёт) Придётся извращаться.

Ээээ, ну я это, про устройства ввода хотел рассказать только. С проблемами fglrx года три назад сталкивался, тогда он с вайном еще не дружил, и я ушел к конкурентам.

simburde ()
Ответ на: комментарий от lazyklimm

ух-ты! хоть кому-то Поттерингоподелия пригодились

systemd не использовался, да и нечего там пока что использовать...

simburde ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.