Настройка мультимониторной конфигурации

постоянный адрес этой статьи - http://www.klv.lg.ua/~vadim/multihead.html

дата последнего обновления - октябрь 2005 г.

Введение

Это описание посвящено еще одному способу использования избыточной мощности, а именно - рассмотрению возможности посадить за один компьютер нескольких пользователей.

Следует заметить, что этот способ использования компьютеров не нов (в МГИУ был проект «Змей Горыныч» или здесь), но раньше для его воплощения требовалось много лишних телодвижений. Сегодня в связи с распространением USB и использованием udev это не нужно.

Посадить сразу всю семью или часть отдела за одну машину хотелось давно, но толчком к осуществлению желаемого послужила новость от Hewllet Packard «HP Multi-user 441 desktop solution» о начале продаж компьютеров для школ и библиотек с четырьмя рабочими местами под ОС Linux Mandrike (Windows же, скорее всего, в ближайшие несколько лет такой режим работы поддерживать не будет, для Microsoft это несколько невыгодно). Углубление в эту проблему позволило предложить следующий чрезвычайно простой способ увеличения рабочих мест для пользователей при наличии одного компьютера.

Общие принципы работы

На каждого нового пользователя в системный блок вставляется дополнительная видеокарта, к которой подключается монитор, а также клавиатура и мышь. При включении компьютера для каждого рабочего места автоматически загружается отдельная копия Х-сервера. В настройках каждого Х-сервера указано, с какой клавиатурой и мышкой он работает и посредством какой видеокарты выводится изображение. Все остальные аппаратные части компьютера находятся в общем использовании. За распределением ресурсов между пользователями следит ядро системы.

Описываемый способ организации «многоголового» компьютера (от англ. Multihead) обладает рядом достоинств. Прежде всего – это может сделать каждый, мало-мальски знакомый с Linux'ом. Наиболее существенное и приятное – затраты всего лишь на один системный блок для нескольких пользователей. Кроме того, в отличие от терминалов, данная система не зависит от пропускной способности сети, а значит позволяет всем пользователям работать быстрее и комфортнее. Более притязательных обрадует возможность использования на нем достаточно ресурсоемких графических оболочек (Gnome, KDE) и программ (хотя одна чрезвычайно ресурсоемкая программа, например Unreal, заметно отразится на остальных).

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

Перечислим то необходимое, что нужно для реализации «многоголового» у себя дома или на рабочем месте.

Аппаратная часть

Видеосистема

Современные наиболее распространенные видеокарточки использовать везде невозможно, так как на материнских платах нет второго AGP-разъема. Приходится использовать PCI видеокарты. Опыт показывает, что наиболее оптимальны из них S3 Virge и ATI Rage, так как не создают трудностей при использовании и являются наиболее доступными. Некоторые PCI видеокарты отказываются работать в качестве ведомой с какой-либо еще. Проблем не встретилось практически ни с одной видеокарточкой от S3, кроме S3TrioV+ и более старых, которые несовместимы с современными материнскими платами, что неоднократно было проверено нами на чипсетах Intel, nVidia и SiS. Думаю, использование современных видеокарт станет скоро возможным, благодаря распространению материнских плат с PCI-E, которые уже имеют несколько разъемов для поддержки SLI, или же выпуску видеокарт PCI-E 1x (сегодня производимые Matrox'ом).

Клавиатура

Последние клавиатуры можно разделить на два вида по типу разъема – PS/2 и USB. Для увеличения рабочих мест для пользователей при наличии одного компьютера клавиатура USB не имеет ограничений на количество подключений. Клавиатуру PS/2 можно использовать и в качестве второй, подключается вместо мыши в PS/2 порт, при загрузке она будет распознана Linux'ом корректно. Очевидно, что третья и более клавиатуры могут быть только USB.

Мышь

Для работы подходит любая USB-мышь. Если создается два рабочих места с клавиатурами PS/2, то неизбежна замена мыши PS/2 на мышь USB (обычно usb-мышь дешевле, чем usb-клавиатура).

Настройка системы

Настройка старых систем (на ядре 2.4 + Xfree86 и более старых) хорошо описана здесь, но т.к. этот сервер работает через раз, то копия есть здесь. Я остановлюсь на одном из современных и достаточно распространеных - на дистрибутиве Fedora Core 3 и совместимых с ним (например ASPLinux 10). В нем используется ядро 2.6 с поддержкой udev, что значительно упрощает настройку, а также для него есть X-сервер с необходимыми изменениями, который достаточно выкачать и установить на компьютер (на ftp://ftp.linux.cz/pub/linux/people/jan_kasprzak/xorg-dualhead/ лежат xorg*.src.rpm, xorg*.athlon.rpm; здесь же есть патч для xorg и приведен пример конфигурационных файлов). После того, как будут в системный блок вставлена видеокарта и подключены дополнительные клавиатура и мышь, надо загрузиться в консольном режиме (run level 3). Однако некоторые BIOS'ы не понимают, что в мышиный порт подключена клавиатура и останавливаются на этапе загрузки, следует нажать any key на этой клавиатуре - и загрузка системы будет продолжена, то же требуется и для asploader (так же не желательно при таком варианте подключения клавиатур запускать Windows, если она у Вас такая стоит параллельно, т.к. если нажать на второй клавиатуре эту самую any key, то и первая станет недоступна до ближайшей перезагрузки).

Рассмотрим пример настройки двух рабочих мест (2 PS/2 клавиатуры и 2 USB мыши – это дешевле обходится, плюс я пару раз встречал глюки с инициализацией «only usb»-клавиатур). Настройка большего количества мест делается аналогично, только все остальные клавиатуры будут USB.

Итак, начинать настройку следует с указания о загрузке двух X-серверов (здесь для gnome display manager): в файле /etc/X11/gdm/gdm.conf заменить:

[server]
0=Standart

[server-Standart]
name=Standart server
command=/usr/X11R6/bin/X -audit 0
flexible=true

на

[server]
0=Standart0
1=Standart1

[server-Standart0]
name=Standart server
command=/usr/X11R6/bin/X -audit 0 vt7 -layout Layout0 -nopciaccessdisable
flexible=true

[server-Standart1]
name=Second server
command=/usr/X11R6/bin/X -audit 0 vt7 -layout Layout1 -nopciaccessdisable -novtswitches
flexible=true

После этого настраиваются клавиатуры и мыши.

При загрузке Linux'а со всеми устройствами ввода в каталоге /dev/input сопоставляются файлы event0, event1 и т. д., в дополнение к этому для мышей mouse0, mouse1, а всем мышам одновременно - mice, но при каждой загрузке это сопоставление происходит заново без оглядки на прошлую нумерацию, и чтобы это упорядочить, надо каждому конкретному устройству назначить постоянную символическую ссылку. Посмотреть подключенные устройства ввода можно в файле /proc/bus/input/devices. Для PS/2 устройств (в нашем случае 2 клавиатуры) надо в файл /etc/udev/rules.d/10-input.rules добавить (если файла нет, то создать его):

#PS/2 keyboard
SYSFS{dev}=”13:64”, KERNEL=”event*”, SYMLINK=”keyboard_one”
SYSFS{dev}=”13:65”, KERNEL=”event*”, SYMLINK=”keyboard_two”

USB-устройства лучше всего различать по кодам Bus, Vendor (например у меня 046d – Logitech), Product и другим из файла /proc/bus/input/devices (если устройства одинаковые, то можно воспользоваться udevinfo -q path -n /dev/device и полученный путь передать udevinfo -a -p путь, подробнее - http://www.linuxforum.ru/index.php?showtopic=9712&hl=udev):

#USB mouse
BUS=”usb”, KERNEL=”mouse*”, SYSFS{idVendor}=”046d”, SYSFS{idProduct}=”c50b”, SYMLINK=”mouse_one”
BUS=”usb”, KERNEL=”mouse*”, SYSFS{idVendor}=”046d”, SYSFS{idProduct}=”025c”, SYMLINK=”mouse_two”

После перезагрузки (или перезапуска udev – killall udevd & /sbin/start_udev) в каталоге /dev/input появятся нужные символические ссылки. (детальное более подробное описание всех параметров – man udev, udevinfo, udevd или http://linux-hotplug.sourceforge.net).
Теперь нужно указать X серверу, что со всем этим делать в файле /etc/X11/xorg.conf. В нем прописана конфигурация для текущего состояния:

Section “ServerLayout”
	Identifier	“Xfree86 Configurited”
	Screen	0	“Screen0” 0 0
	InputDevice	“Mouse0” “CorePointer”
	InputDevice	“Keyboard0” “CoreKeyboard”
EndSection

Ее нужно заменить на:

Section “ServerLayout”
	Identifier	“Layout0”
	Screen	0	“Screen0” 0 0
	InputDevice	“Mouse0” “CorePointer”
	InputDevice	“Keyboard0” “CoreKeyboard”
EndSection

Section “ServerLayout”
	Identifier	“Layout1”
	Screen	0	“Screen1” 0 0
	InputDevice	“Mouse1” “CorePointer”
	InputDevice	“Keyboard1” “CoreKeyboard”
EndSection

Ниже следует найти секцию “InputDevice” с Identifier “Keyboard0”, заменить в ней протокол “Standart” на “usbev” (чтобы работа с клавиатурой шла не напрямую, а через заданные нами файлы), добавить строки, с указанием какой файл использовать и как обходится с переключениями:

	Option		“Device”	“/dev/input/keyboard_one”
	Option		“XkbRules”	“xorg”

и создать такую же секцию с Identifier “Keyboard1” и “/dev/input/keyboard_two”.
Подобным же образом отредактировать секцию “Mouse0”:

Section “InputDevice”
	Identifier	“Mouse0”
	Driver		“mouse”
	Option		“Protocol”	“IMPS/2”
	Option		“Device”	“/dev/input/mouse_one”
	Option		“ZaxisMapping”	“4 5”
EndSection

Если Вам не понравится кому достались какие клавиатуры и мыши, поменяйте ..._one на ..._two

Далее, в секции для “Screen0” заменить “Monitor” на “Monitor0” и сделать его копию с параметрами “Screen1”, “Monitor1” и в Device заменить на “videocard1”. Если второй монитор отличается, то текущие разрешения заменить на требуемые. Пример:

Section "Screen"
	Identifier	"Screen1"
	Device	"videocard1"
	Monitor	"Monitor1"
	DefaultColorDepth	16
	SubSection "Display"
		Depth	4
		Modes	"1024x768" 
	EndSubSection
	SubSection "Display"
		Depth	8
		Modes	"1024x768" 
	EndSubSection
	SubSection "Display"
		Depth	16
		Modes	"1024x768" 
	EndSubSection
EndSection

В секции “Monitor” заменить значение Identifier “Monitor” на “Monitor0”, создать его копию с Identifier “Monitor1”. Вот пример для монитора 17'' LCD с разрешением 1280х1024 и частотой 60 – 75 Гц:

Section “Monitor”
	Identifier	“Monitor0”
	VendorName	“SAM”
	ModelName	“Samsung SyncMaster”
	HorizSync	61.5-81.0
	VertRefresh	59.0-76.0
EndSection

и 17'' ЭЛТ монитора

Section “Monitor”
	Identifier	“Monitor1”
	VendorName	“SAM”
	ModelName	“Samsung SyncMaster”
	HorizSync	30.0-96.0
	VertRefresh	50.0-160.0
EndSection

В секции для видеокарты обязательно нужно правильно указать номер устройства на PCI шине (просмотреть устройства можно по команде lspci) и драйвер (список находится в /usr/X11R6/lib/modules/drivers, для S3TrioV2 нужен vesa, а остальные явствуют из названия).

Section	"Device"
	BusID	"PCI:2:0:0"
	Driver	"radeon"
	Identifier	"videocard0"
	BoardName	"ATI Radeon 9000"
EndSection

Вместо вышеобозначенных настроек все параметры для второй видеокарты и монитора можно получить при помощи программы system-config-display, но перед этим желательно сделать копию xorg.conf и вынуть видеокарту из AGP-разъема. Потом оригинальный xorg.conf вернуть на место, а из полученного, при помощи system-config-display, перенести настройки для видеокарты и монитора.

Теперь после внесения всех изменений нужно проверить работоспособность. Для этого в консоли (можно под любым юзером) следует дать команду:

$X -layout Layout0

Экран переключится в графический режим с курсором в виде X на экране. Для возвращения назад следует нажать Ctrl+Alt+Backspace. То же проделать для Layout1.

Если все вышеописанное заработало, можно перегружать компьютер - и на обоих экранах после загрузки появятся приглашения для ввода имени/пароля.

Мелкие неприятности

а без этого нельзя

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

Из-за того, что при работе с клавиатурой x-server не имеет приоритета над консолью (которая видит все клавиатуры одновременно), может случится ситуация, когда один пользователь нажмет Ctrl+Del, а другой Alt (одновременно), и компьютер перезагрузится. У меня раз такое было, т.к. у меня перезагруска по Ctrl+Atl+Del не отключина. Один из способов решить это - отключить USB-клавиатуру для консоли (или вообще поддержку клавиатуры для консоли для init5), другой - развести работу клавиатуры по разным виртуальным терминалам, но придется накладывать патч на ядро (см. в ссылках ruby kernel patch)

Не относящееся к делу завершение

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

Ссылки

Форумы по статье: на LOR'е, на opennet.ru
Multiple local XFree users under Linux, так же там много других ссылок, его копия и модифицированный вариант
< href="http://cambuca.ldhs.cetuc.puc-rio.br/multiuser/g450.html">Sharing your computer with Matrox G450 dualhead HOWTO
XFree Local Multi-User HOWTO - при помощи Backstreet Ruby kernel patch или на основе этого же Another Quick How-To for Dual-X-Headed/Legged Linux
Multiseat X Under X11R6.9/7.0 - то, что нас ждет в следующей версии xorg, пропатченный Х-сервер больше не понадобится, все уже будет внутри
LOR FAQ - много интересного по настройке иксов

вопросы и предложения направлять по адресу vadim-lvv[at]yandex.ru
(c) Vadim Likhota, при копировании оставлять ссылку на оригинал

главная main