ПАВЕЛ ЗАКЛЯКОВ
Linux Xinerama: один монитор хорошо, а много лучше
Данная статья рассказывает о подключении нескольких мониторов к компьютеру с установленной ОС Linux (RedHat Linux v.7.3, Fedora Core 3 и ASPLinux 10) и приводит рабочие примеры конфигурационных файлов для оконной среды X-Window.
Сколько пользователю ни дай, а ему всё мало. Так и хочется сказать: «Таблеток от жадности и побольше, побольше...» Если лет 10 назад у пользователей в основном были 14" CGA- и EGA-модели мониторов и о большем, чем VGA с разрешением 320 х 200 точек при 256 цветах или 640 х 480 при 16 цветах мечтать не приходилось, а большие диагонали и разрешения встречались только в типографиях и на графический станциях, то сейчас многие любители могут за небольшие деньги приобрести такое, что не в каждой типографии есть.
Вначале, после VGA стали появляться SVGA-мониторы, диагональ увеличились до 15". Качество и «плоскость» картинки улучшались. Потом были пройдены рубежи 17" и 19", вплоть до 22". После 22" рост на какое-то время приостановился. Смотреть на такой монитор было неудобно (уж очень большой), цена заоблачная, плюс не каждая видеокарта могла поддерживать такую махину на максимальных видеорежимах. Специальная видеокарта стоила примерно столько же, сколько и монитор. По истечении некоторого времени появились LCD- и TFT-панели. Если отбросить технологические особенности, то развитие TFT-технологий шло и идёт по тому же пути улучшения качества и увеличения размера диагонали (как следствие – разрешения). Единственное небольшое отличие от пути развития CRT-технологий появилось из-за параллельного развития DVD-индустрии, которая породила новый сегмент рынка – домашние кинотеатры, где нашли своё применение мониторы с диагональю более 22".
На сегодняшний день ситуация такова, что продвинутым пользователям 17" мало, а 19" и выше – это дорого. Почувствовав данную ситуацию года четыре назад и учтя тот факт, что AGP-шина в компьютере только одна, многие фирмы стали производить dualhead-видеокарты. На сегодняшний день можно сказать, что лишь только самые дешёвые и урезанные версии видеокарт имеют один видеовыход. Все же остальные де факто имеют 2 видеовыхода. Количество людей, использующих мультидисплейные конфигурации в самых различных областях, растёт [8]. Два видеовыхода – это далеко не предел, есть дорогие модели на 3 видеовыхода (вроде Matrox Parhelia 512 или P750) и даже больше [7].
Пока производители видеокарт совершенствовали железо и писали для него «хитрые» драйвера, разработчики операционных систем не стояли в стороне, и начиная с Windows 98 появилась поддержка нескольких видеокарт средствами ОС. Это позволило увеличивать площадь рабочего стола только старыми аппаратными средствами.
Если железо и программы готовы, так почему бы не использовать несколько мониторов для работы, особенно если площадь вашего компьютерного стола позволяет? Это ведь очень удобно: в два-три раза больше видимая площадь при относительно малой стоимости. Конечно, есть и некоторые неудобства – половина окна тут, половина окна там (на другом мониторе), но эта проблема частично решается специальным программным обеспечением, перемещающим окна, вроде HydraVision под Windows. Именно по этому пути я и пошёл. Моя история с настройкой началась, когда я совсем недорого купил в 2001 году видеокарту RadeonVE, а чуть позже, где-то через полгода, второй б/у монитор.
Драйвера от ATI+HydraVision под NT4.0 работали на ура, а вот под Red Hat Linux v.7.3 пришлось повозиться с настройкой. Второй монитор показывал копию первого, и оба работали на 85 Гц вместо возможных 120 Гц. Мне же хотелось под X иметь и подходящее разрешение, и частоту обновления, и один широкий рабочий стол вместо двух одинаковых.
Долгие поиски в конце концов увенчались успехом. Из нескольких документов (на сегодня сохранились лишь [1, 2]) был создан файл /etc/X11/XF86Config-4 следующего содержания:
Section "ServerLayout"
Option "Xinerama" "on"
Identifier "Multi Head"
Screen 0 "Screen0" 0 0
Screen 1 "Screen1" LeftOf "Screen0"
InputDevice "Mouse0" "CorePointer"
InputDevice "Keyboard0" "CoreKeyboard"
InputDevice "DevInputMice" "AlwaysCore"
EndSection
Section "Files"
RgbPath "/usr/X11R6/lib/X11/rgb"
FontPath "unix/:7100"
EndSection
Section "Module"
Load "dbe"
Load "extmod"
Load "fbdevhw"
Load "glx"
Load "record"
Load "freetype"
Load "type1"
Load "dri"
EndSection
Section "InputDevice"
Identifier "Keyboard0"
Driver "keyboard"
Option "XkbRules" "xfree86"
Option "XkbModel" "pc104"
Option "XkbLayout" "ru"
Option "XkbVariant" "winkeys"
Option "XkbOptions" "grp:alt_shift_toggle"
EndSection
Section "InputDevice"
Identifier "Mouse0"
Driver "mouse"
Option "Device" "/dev/mouse"
Option "Protocol" "IMPS/2"
Option "Emulate3Buttons" "no"
Option "ZAxisMapping" "4 5"
EndSection
Section "InputDevice"
Identifier "DevInputMice"
Driver "mouse"
Option "Protocol" "IMPS/2"
Option "Device" "/dev/input/mice"
Option "ZAxisMapping" "4 5"
Option "Emulate3Buttons" "no"
EndSection
Section "Monitor"
DisplaySize 1024 768
ModeLine "1024x768" 135.920 1024 1104 1216 ї
1392 768 769 772 814 -hsync +vsync
Identifier "Monitor0"
VendorName "Samsing"
ModelName "Samsung SyncMaster 700IFT (CSH780B*)"
HorizSync 30.0 - 98.0
VertRefresh 50.0 - 160.0
Option "dpms"
EndSection
Section "Monitor"
DisplaySize 1024 768
ModeLine "1024x768" 135.920 1024 1104 1216 ї
1392 768 769 772 814 -hsync +vsync
Identifier "Monitor1"
VendorName "Samsung"
ModelName "SyncMaster 700IFT (CSH780B*)"
HorizSync 30.0 - 98.0
VertRefresh 50.0 - 160.0
Option "dpms"
EndSection
Section "Device"
Identifier "Videocard0"
Driver "radeon"
VendorName "Videocard vendor"
BoardName "ATI Radeon VE"
BusID "AGP:1:5:0"
Screen 0
EndSection
Section "Device"
Identifier "Videocard1"
Driver "radeon"
VendorName "Videocard vendor"
BoardName "ATI Radeon VE"
BusID "AGP:1:5:0"
Screen 1
EndSection
Section "Screen"
Identifier "Screen0"
Device "Videocard0"
Monitor "Monitor0"
DefaultDepth 16
SubSection "Display"
Modes "1024x768"
Depth 16
EndSubSection
EndSection
Section "Screen"
Identifier "Screen1"
Device "Videocard1"
Monitor "Monitor1"
DefaultDepth 16
SubSection "Display"
Depth 16
Modes "1024x768"
EndSubSection
EndSection
Это позволило в Red Hat Linux v.7.3 иметь один рабочий стол на два монитора с разрешением 2 х 1024 х 768 при 120 Гц.
Замечание 1. После включения режима Xinerama Linux не понимал, что это два монитора, думая что это один большой. Многие окна появлялись половинчато. Половина тут, половина там.
Замечание 2. Проигрывание видео на двух мониторах невозможно. Картинка есть только там, где больший процент окна, на другом мониторе окно чёрное.
Замечание 3. К сожалению, установить нужный режим и выбрать строчку ModeLine как с помощью xvidtune, так и руками, читая [3], мне не удалось. Тут я пошёл на хитрость. Установил PowerStrip под Windows. Далее шёлкнул правой кнопкой мыши на появившемся значке около часов и выбрал пункты меню «Display profiles» и «Configure».
В появившемся окне я выбрал нужный мне видеовыход и нажал «Advanced timing options...».
Появилось окно, где можно менять настройки в реальном времени, сразу отслеживая их изменение.
Методом ручного подбора мне удалось выжать максимум из того, что могли мониторы. Далее я заглянул в файл С:Program FilesPowerStrippstrip.ini и переписал себе следующие две строчки, данные из которых после поместил в файл XF86Config-4:
[Modelines]
1024x768="1024x768" 135,920 1024 1104 1216 1392 768 769 772 814 -hsync +vsync
Всё хорошо, но в X при такой же ModeLine вместо нужного мне 1024 х 768 запускалось меньшее разрешение. Почитав разные документы и подумав немного, как описано в [4], я произвёл расчёт горизонтальной частоты для своего случая:
768 точек * 120 Гц * 1,05 = 96,768 КГц
После посмотрел в XF86Config-4 и увидел там:
HorizSync 30.0 – 96.0
как видно, полоса оказалась больше 96.0, а «умные» X уменьшили разрешение. Пришлось руками увеличить 96.0, например, до 98.0. После этого нужный видеорежим заработал.
Fedora Core 3
Всё прекрасно работало где-то до марта 2005 года, когда мне пришла в голову мысль на второй винчестер установить Linux Fedora Core3 c целью его изучения. Естественно, после установки по умолчанию мои два монитора, как и ранее в RedHat 7.3, показывали одно и то же.
«Разве это проблема?» – подумал я и полез в меню «Приложения –> Системные параметры –> Дисплей» менять настройки.
Увы, это оказалось проблемой. Скрипт, осуществляющий настройку, содержал ошибку и после выбора двух мониторов просто не позволял нажать кнопку «ok», ругаясь в текстовой консоли, из-под которой были запущены X. Аналогичным образом нельзя было выбрать частоту обновления экрана более 85 Гц.
Пришлось перейти к ручному режиму. Недолго думая, я заменил новый файл /etc/X11/xorg.conf старым, проверенным /etc/X11/XF86Config-4 (который можно видеть выше), заменив в нём
Option "Device" "/dev/mouse"
на
Option "Device" "/dev/input/mice"
однако это не помогло делу. Пришлось прочитать «man radeon», после чего у меня получился следующий конфигурационный файл /etc/X11/xorg.conf для поддержки двух мониторов:
Section "ServerLayout"
Identifier "dual head configuration"
Screen 0 "Screen0" 0 0
InputDevice "Mouse0" "CorePointer"
InputDevice "Keyboard0" "CoreKeyboard"
EndSection
#Section "ServerFlags"
# Option "Xinerama" "true"
#EndSection
Section "Files"
RgbPath "/usr/X11R6/lib/X11/rgb"
FontPath "unix/:7100"
EndSection
Section "Module"
Load "dbe"
Load "extmod"
Load "fbdevhw"
Load "glx"
Load "record"
Load "freetype"
Load "type1"
Load "dri"
EndSection
Section "InputDevice"
Identifier "Keyboard0"
Driver "keyboard"
Option "XkbRules" "xfree86"
Option "XkbModel" "pc104"
Option "XkbLayout" "ru"
Option "XkbVariant" "winkeys"
Option "XkbOptions" "grp:alt_shift_toggle"
EndSection
Section "InputDevice"
Identifier "Mouse0"
Driver "mouse"
Option "Device" "/dev/input/mice"
Option "Protocol" "IMPS/2"
Option "Emulate3Buttons" "no"
Option "ZAxisMapping" "4 5"
EndSection
Section "InputDevice"
Identifier "DevInputMice"
Driver "mouse"
Option "Protocol" "IMPS/2"
Option "Device" "/dev/input/mice"
Option "ZAxisMapping" "4 5"
Option "Emulate3Buttons" "no"
EndSection
Section "Monitor"
Identifier "Monitor0"
VendorName "Samsung"
ModelName "Samsung SyncMaster 700IFT (CSH780B*)"
DisplaySize 1024 768
HorizSync 30.0 - 98.0
VertRefresh 50.0 - 160.0
ModeLine "1024x768" 135.9 1024 1104 1216 ї
1392 768 769 772 814 -hsync +vsync
Option "dpms"
EndSection
Section "Device"
Identifier "Videocard0"
Driver "radeon"
VendorName "Videocard vendor"
BoardName "ATI Radeon VE"
BusID "AGP:1:5:0"
Option "MonitorLayout" "CRT, CRT"
Option "CRT2Position" "LeftOf"
Option "MergedFB" "yes"
EndSection
Section "Screen"
Identifier "Screen0"
Device "Videocard0"
Monitor "Monitor0"
DefaultDepth 24
SubSection "Display"
Depth 24
Modes "1024x768" "800x600" "640x480"
EndSubSection
EndSection
Замечание 4. Оба монитора у меня одинаковые, режимы работы тоже, поэтому как следствие строчки ModeLine для них тоже одинаковые. На практике через меню монитора проверено – видеорежимы выставлены правильно. Однако если посмотреть внимательнее, то ранее использовались две раздельные строчки ModeLine на каждый монитор, что, на мой взгляд, правильнее. На данный момент для второго видеовыхода можно прописать только:
Option "CRT2HSync" "30.0-86.0"
Option "CRT2VRefresh" "50.0-120.0"
Но проблемы это не решает, так как возможные диапазоны горизонтальной и вертикальной развёртки – это всё-таки не одно и то же, что и ModeLine. Каким способом можно настроить видеовыходы одновременно на разные режимы, пока не известно. Внимательное чтение «man radeon» и эксперименты с xorg.conf результата не дали.
Замечание 5. Несмотря на замечание 4, был и положительный момент. Если ранее без включения Xinerama один рабочий стол не получался, то сейчас же рабочий стол получался общим, а панели меню занимали лишь один монитор, при этом разворачивание окна во весь экран шло только на один монитор, что мне показалось удобным. При этом руками окно можно растянуть на два монитора. (Поведение, аналогичное HydraVision.)
Если же строки:
#Section "ServerFlags"
# Option "Xinerama" "true"
#EndSection
раскомментировать, то тогда панели меню получались на оба экрана, окошки вылетали по половинкам посередине, а при разворачивании окна занимали площадь двух мониторов. Удобства от такой работы меньше. Поэтому эти строки я оставил закомментированными.
На этом можно было бы закончить статью, но...
«Два монитора хорошо, а три лучше...»
Имея в наличии под руками лишнюю видеокарту S3 Trio 64v+, я не удержался, чтобы не воткнуть её в и так достаточно набитый системный блок и попытаться подключить ещё один монитор.
Во время загрузки карточка была обнаружена kudzu, однако предложенная автонастройка только сбила предыдущие настройки, поэтому опять пришлось перейти в ручной режим правки файла xorg.conf. В результате правки получилось следующее:
Section "ServerLayout"
Identifier "dual head configuration"
Screen 0 "Screen1" 0 0
Screen 1 "Screen0" RightOf "Screen1"
InputDevice "Mouse0" "CorePointer"
InputDevice "Keyboard0" "CoreKeyboard"
EndSection
Section "ServerFlags"
Option "Xinerama" "true"
EndSection
Section "Files"
RgbPath "/usr/X11R6/lib/X11/rgb"
FontPath "unix/:7100"
EndSection
Section "Module"
Load "dbe"
Load "extmod"
Load "fbdevhw"
Load "glx"
Load "record"
Load "freetype"
Load "type1"
Load "dri"
EndSection
Section "InputDevice"
Identifier "Keyboard0"
Driver "keyboard"
Option "XkbRules" "xfree86"
Option "XkbModel" "pc104"
Option "XkbLayout" "ru"
Option "XkbVariant" "winkeys"
Option "XkbOptions" "grp:alt_shift_toggle"
EndSection
Section "InputDevice"
# Modified by mouseconfig
# Option "Device" "/dev/mouse"
Identifier "Mouse0"
Driver "mouse"
Option "Device" "/dev/input/mice"
Option "Protocol" "IMPS/2"
Option "Emulate3Buttons" "no"
Option "ZAxisMapping" "4 5"
EndSection
Section "InputDevice"
Identifier "DevInputMice"
Driver "mouse"
Option "Protocol" "IMPS/2"
Option "Device" "/dev/input/mice"
Option "ZAxisMapping" "4 5"
Option "Emulate3Buttons" "no"
EndSection
Section "Monitor"
Identifier "Monitor0"
VendorName "Samsung"
ModelName "Samsung SyncMaster 700IFT (CSH780B*)"
DisplaySize 1024 768
HorizSync 30.0 - 98.0
VertRefresh 50.0 - 160.0
ModeLine "1024x768" 135.9 1024 1104 1216 ї
1392 768 769 772 814 -hsync +vsync
Option "dpms"
EndSection
Section "Monitor"
Identifier "Monitor1"
VendorName "Samsung"
ModelName "My TFT Monitor"
DisplaySize 1024 768
HorizSync 30.0 - 98.0
VertRefresh 50.0 - 160.0
Option "dpms"
EndSection
Section "Device"
Identifier "Videocard0"
Driver "radeon"
VendorName "Videocard vendor"
BoardName "ATI Radeon VE"
BusID "AGP:1:5:0"
Option "MonitorLayout" "CRT, CRT" #!!
Option "CRT2Position" "LeftOf" #!!
Option "MergedFB" "yes"
EndSection
Section "Device"
Identifier "Videocard1"
Driver "s3"
BoardName "S3"
BusID "PCI:0:10:0"
EndSection
Section "Screen"
Identifier "Screen0"
Device "Videocard0"
Monitor "Monitor0"
DefaultDepth 16
SubSection "Display"
Depth 16
Modes "1024x768" "800x600" "640x480"
EndSubSection
EndSection
Section "Screen"
Identifier "Screen1"
Device "Videocard1"
Monitor "Monitor1"
DefaultDepth 16
SubSection "Display"
Depth 16
Modes "1024x768" "800x600" "640x480"
EndSubSection
EndSection
Как видно, пришлось добавить разделы описания нового монитора и видеокарты и указать физическое расположение мониторов относительно друг друга. Ничего сложного в настройке двух видеокарт нет, всё должно быть интуитивно понятно.
На мой взгляд, единственный вопрос, который может возникнуть, – это откуда берётся строчка:
BusID "PCI:0:10:0"
Для получения значения BusID можно заглянуть в файл /etc/sysconfig/hwconf и найти нужную видеокарту либо проще – запустить lspci и среди выведенного списка PCI-устройств найти нужное.
# lspci
....
00:08.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL-8139/8139C/8139C+ (rev 10)
00:09.0 Communication controller: NetMos Technology: Unknown device 9805 (rev 01)
00:0a.0 VGA compatible controller: S3 Inc. 86c764/765 [Trio32/64/64V+] (rev 54)
01:05.0 VGA compatible controller: ATI Technologies Inc Radeon RV100 QY [Radeon 7000/VE]
|
AGP-устройства выводятся вместе с PCI, при этом у PCI-устройств вначале идёт цифра 0(00:0a.0), а у AGP – 1(01:05.0). Первое поясняющее поле у BusID не влияет на работу X, поэтому не важно, PCI или AGP вы там напишете, это нужно для наглядности.
Замечание 6. Про несоответствие видеорежимов на мониторах. При различных глубинах цветности на разных мониторах X не запускаются. Например, если у вас одна карточка не поддерживает 24 бита цветности, а другая поддерживает, придётся снизить значение у последней. Если разрешение на каком-то мониторе меньше, то создаётся виртуальный рабочий стол большего размера. При подведении курсора мыши к краю окна просмотра видимое поле вместе с курсором начинает двигаться вплоть до противоположной стороны виртуального экрана.
Замечание 7. Если режим Xinerama в последнем конфигурационном файле выключен, то пользователь видит два рабочих «меню программ» и два рабочих стола, не связанных друг с другом. Фактически для пользователя мониторы выглядят как два не связанных сеанса X. Единственная связь между которыми – это то, что пользователь может перемещать курсор мышки из одного монитора в другой. Несмотря на то, что курсор свободно путешествует между рабочими столами разных видеокарт, окна и меню перетащить нельзя. Создание скриншота рабочего стола для обоих частей работает раздельно.
При включенном режиме Xinerama все три монитора рассматриваются как единый рабочий стол. Естественно, скриншот снимается один со всей рабочей области. При этом растянуть меню на все три монитора нельзя, а окна можно. Либо меню находится на мониторе от S3 либо одновременно на двух от Radeon.
Замечание 8. Всё написанное выше для Fedora Core 3 справедливо для ASP Linux 10.
Надеюсь, что настройка X через правку xorg.conf не показалась вам сложной и при аналогичном подключении нескольких мониторов в вашей конфигурации к одной или более видеокартам не вызовет проблем.
Ссылки:
- Radeon VE Dual Display Support with Linux/XFree86: http://www.polylith.com/~brendan/UnixBoxes/RadeonVE.html.
- Multiple Monitors with X Mini Guide:
http://www.linux-lookup.com/modules.php?op=modload&name=Sections&file=index&req=viewarticle&artid=13&page=1.
- Настройка режима монитора в XFree86: http://www.inp.nsk.su/~buzykaev/xf_monitor.html, http://knot.pu.ru/faq/xfaq.html.
- Связь между полосой пропускания, частотой кадров и частотой горизонтальной развертки: http://www.samsung.ru/support/products/displays/faq/?id=114.
- Another Quick How-To for Dual-X-Headed/Legged Linux: http://www.disjunkt.com/dualhead.
- Из архива сообщений Re: [K12OSN] 1PC+4KVM=4users/PC: http://www.redhat.ru/archives/k12osn/2004-May/msg00260.html.
- Matrox Graphics. Multi-display products: http://www.matrox.com/mga/multidisplay/product_chart.cfm.
- Welcome to the Multi-display community: http://www.matrox.com/mga/multidisplay/md_testimonials.cfm.
- Using Xinerama to MultiHead XFree86 V. 4.0+: http://www.tldp.org/HOWTO/Xinerama-HOWTO/index.html.