10/29/2012

Настольный Змей Горыныч, или Как подключить много мониторов - Multihead in Linux

В своё время автор этих строк купил себе новый ноутбук, водрузил на него Debian и воткнул внешний монитор. Казалось бы, ну и всё - что ещё надо джигиту для счастья? Одна голова — хорошо, а две — лучше, подумал автор, глядя на ещё одну электродырку в ноутбуке под названием DisplayPort. И подумалось мне: это ж можно задаром ещё и третий монитор прицепить, и будет неземное счастье. Но счастье обломилось (о чём ниже), а обзорчик от поисков решения остался ...




Зачем нужно несколько мониторов?

Наличие по крайней мере одного внешнего монитора гарантированно повысит продуктивность работы. Не знаю, как насчёт трёх мониторов, но два точно меняют жизнь к лучшему, и вот почему:
  • очень удобно работать с LaTeX: на одном мониторе пишем сам код, на второй выводим что-то типа Kdvi и видим непосредственно результат;
  • хорошо вывести на внешний монитор справочную информацию или документацию (например, MATLAB Help висит на внешнем мониторе, а на основном мы пишем код);
Вместо переключений между виртуальными рабочими столами можно просто посмотреть на внешний монитор. И это в самом деле удобно.

Программные решения: Что есть в Linux для Multihead?

Программные решения это когда либо не хочется тратиться на нормальное железо, либо есть желание использовать уже имеющееся. Особенно актуально на ноутбуках: если есть выход на VGA/HDMI/DisplayPort, почему бы его не использовать?

XrandR

На данный момент - самое простое и рабочее решение. XRandR позволяет изменять конфигурацию мониторов "на лету" (без перезагрузки X-server) и поддерживает аппаратное ускорение через OpenGL. Конфигурирование xrandr возможно через консольные команды, или через удобную графическую оболочку типа arandr.


 Собственно, история автора этих строк и началась с того, что был куплен адаптер DisplayPort2VGA для подключения третьего монитора к ноутбуку Lenovo T420. Всё шло очень хорошо и xrandr даже написал то, что третий монитор виден:


 xrandr

Screen 0: minimum 320 x 200, current 2646 x 1024, maximum 8192 x 8192

LVDS1 connected 1366x768+0+0 (normal left inverted right x axis y axis) 310mm x 174mm

   1366x768       60.0*+
   1360x768       59.8     60.0
   1024x768       60.0
   800x600        60.3     56.2
   640x480        59.9

VGA1 connected (normal left inverted right x axis y axis)

   1680x1050      60.0 +
   1600x1200      60.0
   1280x1024      75.0     60.0
   1440x900       59.9
   1280x960       60.0
   1152x864       75.0
   1024x768       75.1     70.1     60.0
   832x624        74.6
   800x600        72.2     75.0     60.3     56.2
   640x480        72.8     75.0     66.7     60.0
   720x400        70.1

HDMI1 disconnected (normal left inverted right x axis y axis)

DP1 connected 1280x1024+1366+0 (normal left inverted right x axis y axis) 376mm x 301mm

   1280x1024      60.0*+   76.0     75.0     72.0
   1152x864       75.0
   1024x768       75.1     70.1     60.0
   832x624        74.6
   800x600        72.2     75.0     60.3
   640x480        72.8     75.0     66.7     60.0
   720x400        70.1
   640x350        70.1


То есть мониторы видятся оба, но при попытке задействовать все три приводит к ошибке:
xrandr: cannot find crtc for output VGA1
Что бы это всё значило? - спросил я себя, усиленно почёсывая затылок. А значит это вот что:
CRTC это Cathode Ray Tube Controller, который аппаратно считывает кадры из framebuffer из видеопамяти и выводит изображение на экран. В понимании Xrandr, для каждого внешнего монитора должен быть свой аппаратный CRTC. На ноутбуках их обычно два: 0 и 1, то есть для встроенного монитора и внешнего. Это позволяет сделать полноценный dualhead, то есть два монитора соединить в один. Если же прицепить монитор третий монитор к уже существующему CRTC, то мы получим тоже изображение (clone mode).
Но не всё так грустно: есть попытки надурить видеоадаптер и сделать Virtual CRTC.
Virtual CRTC (VCRTC) is a new (and experimental) mechanism for redirecting pixels from a GPU's frame buffer to some other device. This code allows virtual CRTCs to be created in the kernel drivers so that they can be used for a variety of tasks. A virtual CRTC with this code is treated just like a real hardware CRTC. This experimental code allows these virtual CRTCs to be attached to "CTD devices" (Compression Transmission and Display). Then finishing off the equation is a new kernel module, the VCRTCM (Virtual CRTC Manager), that bridges the traffic between GPUs and CTDs.
И хотя нынешние иксы (Xorg) поддерживают максимум 16 дисплеев, ограничения чаще всего упираются в видеокарту и наличие аппаратных CRTC не более 2. Остаётся надеяться на Virtual CRTC или отдавать кровные килодоллары за аппаратные многоголовые решения (о чём ниже).

Плюсы Xrandr:
  • использование возможностей видеокарты и аппаратное ускорение графики на внешнем мониторе
  • гибкое изменение параметров на лету, особенно при использовании arandr.
Минусы Xrandr:
  • количество прицепляемых независимых мониторов ограничено числом CRTC.


Xinerama

Xinerama представляет собой расширение X Window System, которое позволяет приложениям и оконным менеджерам использовать два и более физических монитора как один большой. Это исторически был первый способ вообще получать объединённый монитор в иксах, и в Сети огромное количество рецептов на эту тему.

Плюсы Xinerama:
  • рабочее решение, поддерживает большинство графических карт
Минусы Xinerama:
  • требует, чтобы на всех мониторах была одна глубина цвета;
  • вы теряете аппаратное ускорение на всех экранах, кроме одного.
  • на дополнительных мониторах окна с 3D графикой могут выглядеть чёрными; 
В общем, старуха-ксинерама это последнее, что стоит пробовать, когда ничто другое не работает или слишком дорого, чтобы покупать.

 

Xdmx - Distributed Multihead X

DMX расшифровывается как Distributed Multihead X. Обычно Xinerama или Xrandr позволяют делать multi-head, сшивая несколько мониторов в один, подключённых к одной и той же машине.

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


Пример посложнее - объединение четырёх соединённых по сети ноутбуков в один монитор. Настройка Xdmx несколько нетривиальна, но есть отличное руководство от IBM.


Но основное применение Xdmx это создание огромных систем отображения данных для университетов и исследовательских центров. В основном это Diplay Walls с общим разрешением типа 16000x4800:


Такое есть, например, в Университете Северной Каролины и в Университете Иллинойса в Чикаго.

Прочая экзотика

Есть и другие методы получения нескольких мониторов в Linux.

TwinView

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

Merged Framebuffer

Позволяет получать аппаратное ускорение графики на двух мониторах в режиме dualheaded для карт Radeon. Очень похоже на TwinView, но работает только с открытыми драйверами (mga, ati), в которых поддержка direct rendering часто не реализована. Кроме того, MergedFB ограничивает размер максимального экрана до 2048x2048.


Аппаратные решения

Как правило, это проще в настройке и добавляет меньше головной боли. Самый правильный и лёгкий способ - Matrox TrippleHead2Go, но он стоит денег. Если начать жадничать, то можно остановиться на решении USB2VGA, но оно грузит процессор и требует драйвер.


USB2VGA

Да, бывает и такое. Плюс - сравнительно простой (если драйвер в ядре есть) способ получить дополнительный монитор (в зависимости от чипсета - и не один). Но всё это ложится тяжким грузом на CPU, ибо именно процессор сжимает видео и передаёт его через USB2VGA адаптер на другой монитор. Цена вопроса в районе $70:
Здесь всё зависит от того, кто сделал адаптер и на каком чипе он работает. Простые и дешёвые адаптеры могут и не иметь поддержки в Linux, или работать через драйвер udlfb. Последнее предпочтительно, так как имеется в ядре Linux начиная с 2.6.35. Простые видеоадаптеры USB2VGA, например от StarTech, позволят подключить один дополнительный монитор с разрешением до 1920x1200. Таких адаптеров можно воткнуть до пяти (5) штук.

Другой пример - адаптеры от Displaylink типа DL-125, DL-165 и DL-195 которые поддерживают до шести мониторов и разрешение 1440х1050, 1920х1080 и 2048х1152 соответственно. Компания выкладывает исходники драйверов к ядру.

Matrox TrippleHead2Go

Вот именно так и делается нормальная, честная аппаратная многоголовость (multihead). Matrox TrippleHead2Go представляет собой навороченную внешнюю видеокарту в компактном корпусе, в которую втыкается несколько мониторов (два или три).

Разрешение воткнутых в TrippleHead2Go мониторов суммируется, а при работе - аппаратно разделяется на разные физические мониторы (сжатие видео не используется). При этом видеокарта вашего ноутбука или десктопа думает, что это один огромный монитор (и не подозревает, что её надурили). В результате вы получаете вожделенное Dual/Tripple Head с аппаратным ускорением и всеми плюшками без геморроя с настройкой:


Один минус - стоит это удовольствие около $400.

И кроме того, не стоит подключать его через дополнительные адаптеры - в сети огромное количество полных горя отзывов персонажей, пытавшихся использовать этот TrippleHead2Go через дешёвые адаптеры.

 

Заключение

Этот пост был навеян тем, что автор внезапно обнаружил новую электрическую дырку под названием DisplayPort на борту своего ноутбука. Справедливо решив, что Ленова просто так порты не втыкает, возжелал извлечь из этого профит в виде третьего монитора. Но не получилось, и Xrandr мне выдал всю горькую правду: нет дополнительного контроллера CRTC у видеокарты - нет третьего монитора.

Поиск облегчений не принёс, но в процессе гуглежа автор открыл для себя много нового, и чтоб оно не забылось, решил выложить в бложик.
Всё имеет свои плюсы и минусы:
  • Аппаратное решение от Matrox хорошо и просто, но стоит денег и не мобильно (питание от сети).
  • Игрушки типа USB2VGA это multihead, конечно, но вы получите нагрузку на процессор - чем больше мониторов, тем хуже. Плюс игрища с драйверами в Linux.
  • Программные решения чреваты осложнениями: xrandr это самый лёгкий способ, но честный: нет crtc - нет внешнего монитора. Хотя есть попытки его надурить и сделать Virtual CRTC.

21 комментарий:

  1. Да только 2. Через порт репликатор подключаешь 2 и матрица ноута отключается. Tigro.

    ОтветитьУдалить
  2. xrandr действительно прекрасный инструмент :)

    ОтветитьУдалить
  3. хорошо вывести на внешний монитор справочную информацию или документацию
    А я несколько лет назад так же делал! На первом мониторе Kile, на втором - браузер с Записками дебианщика. Уж очень оно удобно, особенно когда краски в принтере нет :-)

    Михаил, у меня к тебе только один вопрос: что означает ссылка на твой dashboard в фразе "иксы (Xorg) поддерживает максимум 16 дисплеев"? Светить BlogID лишний раз не стоит...

    ОтветитьУдалить
  4. @Tigro комментирует...
    Да только 2.
    Не, ну я так не играю :-) Тащил переходники из США, через полмира, чтобы получить облом? Нифига подобного, щас вот накачу патчик на ядро %-)

    Через порт репликатор подключаешь 2 и матрица ноута отключается.
    Ну вот, а я так ждал, надеялся и верил :-)

    @tengu911 комментирует...
    xrandr действительно прекрасный инструмент
    Особенно с arandr. Вот с такими тулзами Линукс точно будет на десктопе.

    @Vlsu комментирует...
    А я несколько лет назад так же делал!
    Делаю так до сих пор. Надо будет xdmx попробовать, а то ноут с виндой рядом стоит без дела.

    на втором - браузер с Записками дебианщика.
    Вот ты не поверишь - у меня такая же история. Нет, серьёзно: забыл вот тут, как графики строил - а тут тебе всё расскажут и примеры приведут. И поиск есть.

    Михаил, у меня к тебе только один вопрос: что означает ссылка на твой dashboard в фразе
    Оп-па, а этого не было в сценарии. Поправил ссылку - должна быть вот эта.

    Светить BlogID лишний раз не стоит...
    Да кому нужен этот сборник баянов?! :-)

    ОтветитьУдалить
  5. У DisplayPort есть одно преимущество - он поддерживает мониторы разрешением до 2560x1600 http://support.lenovo.com/en_US/detail.page?LegacyDocID=MIGR-75377

    ОтветитьУдалить
  6. @Alexey Alexeev комментирует...
    У DisplayPort есть одно преимущество - он поддерживает мониторы разрешением до 2560x1600
    Это ненамного выше DVI. Мне не очень понятен смысл изобретения DP - его авторы утверждают, что можно по DP гонять ещё и аудио, но зачем?!

    Кроме того, большинство проекторов - VGA, и зачем делать ещё один стандарт к уже имеющимся VGA и DVI (посконную проприетарщину HDMI не считаем) не очень ясно.

    В тему поста. Мне в самом деле хочется попробовать решение от Matrox, ибо оно выглядит как наиболее рабочее. Заниматься техноложеством с xdmx не тянет, особенно на фоне их убогой документации...

    Кстати, есть ещё варианты (не шибко экзотические), которые не упомянуты?

    ОтветитьУдалить
  7. В статье не упомянуто про разработки горячего подключения видео адаптеров в Xorg и GPU offloading

    Пруф:
    http://palm.opennet.ru/opennews/art.shtml?num=34763

    Помимо всяких Nvidia Optimus эти разработки сделают сильно полезнее контроллеры usb2vga. Софтовость Display Link не так страшна как отсутствие горячего подключения и аппаратного ускорения.

    ОтветитьУдалить
  8. > очень удобно работать с LaTeX: на одном мониторе пишем сам код, на второй выводим что-то типа Kdvi и видим непосредственно результат;

    Несколько дней назад мне в первый раз в жизни пришлось использовать (а не только читать про) LaTeX, использовал редактор Gummi, там автоматически предпросмотр выводится сбоку от окна редактирования.

    ОтветитьУдалить
  9. @openid комментирует...
    В статье не упомянуто про разработки горячего подключения видео адаптеров в Xorg и GPU offloading
    Ну как бы это несколько не в тему поста. Имелось в виду про методы подключений мониторов.

    Помимо всяких Nvidia Optimus
    То есть теперь уже не надо приносить в жерву синих лягушек на кладбище в полночь, чтобы дискретная графика на линупсовом десктопе заработала? :-) Надо же, удивительное рядом!

    В тему: зачем дискретная графика нужна для не-геймеров, мне сказать трудно. Как необъяснимо фанатичное упорство совать её везде и всюду. И это на фоне безумных решений типа cost-cut и make-it-cheap (ленова, я тебя прибью за chicklet keyboard).

    @Kostiantyn комментирует...
    Несколько дней назад мне в первый раз в жизни пришлось использовать (а не только читать про) LaTeX
    Удобно, да? А ещё удобнее использовать Kdvi (или что там в КДЕ4 умеет LaTeX dvi показывать) для предпросмотра, ибо оно быстрее генерится.

    использовал редактор Gummi
    Далеко не самый лучший, надо сказать. Предпросмотр в PDF (!), нет отображения структуры документов, нет вставки команд из сайдбара (а в Kile это всё есть)....

    там автоматически предпросмотр выводится сбоку от окна редактирования.
    У меня эту роль выполняют Kdvi, Kghostview и Kpdf по вкусу и надобности (чаще всего Kdvi).

    ОтветитьУдалить
  10. Ну как бы это несколько не в тему поста. Имелось в виду про методы подключений мониторов.

    На мой взгляд полноценная поддержка DisplayLink это как раз в тему методов подключения мониторов.

    То есть теперь уже не надо приносить в жерву синих лягушек на кладбище в полночь, чтобы дискретная графика на линупсовом десктопе заработала? :-) Надо же, удивительное рядом!
    Почти почти, теперь дело за самой Nvidia. Правда у неё появились некоторые проблемы в следствии анально-огороженногоо блоба http://www.opennet.ru/opennews/art.shtml?num=35067

    В тему: зачем дискретная графика нужна для не-геймеров, мне сказать трудно. Как необъяснимо фанатичное упорство совать её везде и всюду. И это на фоне безумных решений типа cost-cut и make-it-cheap (ленова, я тебя прибью за chicklet keyboard).

    Дискретная графика сейчас это не только игры, но так же и математические расчёты через CUDA и OpenCL, что очень быстро набирает обороты. Год назад я сознательно брал ноут без дискретной графики. Но сейчас уже задумываюсь о том что неплохо бы, т.к. есть потребность вынести в blender рендер на GPU.

    Мне кажется, что не сбалансированное уродство конфигурации, это заслуга маркетинга. Видео и поддержка игрушек на слуху, поэтому надо воткнуть карточку потолще. А всё остальное, о чем не напишешь в рекламном постере - из вторсырья.

    ОтветитьУдалить
  11. (посконную проприетарщину HDMI не считаем)
    не ожидал я от Вас Михаил... Я думал проблемы лицензий Вас интересуют меньше всего (собственно лично меня они не задевают, а Столлман с его фобиями может идти лесом), какова причина ненависти к проиприоретарщине у Вас, Михаил?

    ОтветитьУдалить
  12. Здравствуйте,

    а вы не сталкивались с таким, что пока не пропишешь руками в xorg.conf оба монитора - xrandr их не видит?

    у меня wheezy x86_64 со всеми обновлениями.

    может есть какой-то более правильный способ "уговорить" xrandr ?

    ОтветитьУдалить
  13. а вы не сталкивались с таким, что пока не пропишешь руками в xorg.conf оба монитора - xrandr их не видит?
    А я вот сталкивался с вот такой штукой, Grandr (он же Xrandr только с GUI) видит монитор, подключенный через VGA сразу, но вот совершать с ним какие-либо манипуляции кроме clone mod только после перезапуска этого самого Grandr.
    P.S. Кто-нибудь смог настроить разрешение на мониторе 1280x1024 (4:3) при разрешении на ноутбуке 1366x768(16:9)? Такое вообще возможно?

    ОтветитьУдалить
  14. Конечно вохзможно, нужно просто подредактировать xorg.conf
    Вот мой для примера
    http://prolinux.org/content/xorgconf.php

    ОтветитьУдалить
  15. @insider
    Слава Шаману бубна и пингвинов! Укротителю непослушных мониторов и вообще хорошему человеку. Спасибо.

    ОтветитьУдалить
  16. Михаил, заметил странную зависимость. Вы поздравляете читателей Вашего блога и подводите итоге через год 2006, 2008, 2010... Это традиция такая?

    ОтветитьУдалить
  17. @openid комментирует...
    На мой взгляд полноценная поддержка DisplayLink это как раз в тему методов подключения мониторов.

    У меня была идея добавить в этот пост про кабели и переходники, но думаю, это слишком уж много. Надо бы в отдельный пост вынести.

    Дискретная графика сейчас это не только игры, но так же и математические расчёты через CUDA и OpenCL
    Вы же не хотите сказать, что CUDA на чахлой ноутбучной карте - это серьёзно? По мне, так меньше, чем на Nvidia Tesla, облизываться и не стоит.


    @Iskander комментирует...
    не ожидал я от Вас Михаил... Я думал проблемы лицензий Вас интересуют меньше всего

    А вот такого вопроса не ожидал, в свою очередь, я :-) То есть как не интересуют вопросы лицензий?! А Debian мне тогда зачем? Вообще можно было MacBook купить и не страдать.

    Меня конкретно огорчают проприетарные решения, особенно в железе. SecureBoot и HDMI - это отвратительно, это ещё один walled garden в угоду продажным капиталистам.

    собственно лично меня они не задевают, а Столлман с его фобиями

    Это вы расскажете тогда, когда мелкософт продавит SecureBoot на X86, и вы не сможете загрузить свой уютненький линукс без откатывания денег микрософту. И да, Столлман с его фобиями как раз для этого GPL и создавал, чтобы всякие уроды вроде SCO не смогли это дело засудить.

    @Анонимный комментирует...
    а вы не сталкивались с таким, что пока не пропишешь руками в xorg.conf оба монитора - xrandr их не видит?

    Нет, не сталкивался. По идее, это означает, что ваша видеокарта в текущих иксах поддерживается криво.


    Iskander комментирует..
    P.S. Кто-нибудь смог настроить разрешение на мониторе 1280x1024 (4:3) при разрешении на ноутбуке 1366x768(16:9)? Такое вообще возможно?

    Ниже отписались, и я скажу - конечно можно, только качество картинки может быть не очень хорошим.


    @Iskander комментирует...
    Михаил, заметил странную зависимость. Вы поздравляете читателей Вашего блога и подводите итоге через год 2006, 2008, 2010... Это традиция такая?

    Хм, наверное, хотя я и не знал про это :-) Надо будет в этом году продолжить.

    ОтветитьУдалить
  18. @virens
    Это вы расскажете тогда, когда мелкософт продавит SecureBoot на X86, и вы не сможете загрузить свой уютненький линукс без откатывания денег микрософту.
    Да, как-то с этой стороны я этот вопрос не рассматривал, там кстати вроде вопрос о x86 не стоял как таковой там сразу на корню вначале BIOS+UEFI, а потом так и вообще ТОЛЬКО UEFI мда, бидаа, учитывая, что мэйнтейнеры Debian так и не пришли к единому мнению в этом вопросе.
    Но в вопросе софта я считаю, что должна быть какая-то одна линия, контролируемая ограниченным количеством людей, чтобы не случалось KDE 4 и Gnome 3. Добиться этой одной линии при GPL довольно сложно.
    P.S. Кстати к вопросу о UEFI Windows 8 не щупали? Я тут намедни на лабораторных компах посмотрел на это дело так сказать "вживую" и после этого понял, что KDE 4 очень даже ничего! Не представляю как можно работать на Microsoft Surface без мыши и не расчехляя клавиатуру...

    ОтветитьУдалить
  19. @virens комментирует...

    Кстати, есть ещё варианты (не шибко экзотические), которые не упомянуты?

    2 видеокарты - 4 монитора

    ОтветитьУдалить
  20. 2 virens
    Про горыныча подумал речь идет о практике "один системник - много рабочих мест" их так раньше называли.

    2 Роман
    Речь идет о ноуте - к ним особо и не прикрутишь еще одну видеокарту.

    2 Iskander
    Вроде так и быть должно - ставьте арандр.

    ОтветитьУдалить
  21. В современных ноутах уже проще - у меня в ноуте например есть разъем и D-SUB и HDMI, через них к ноуту можно подключить ещё два монитора, в итоге получится три монитора, работающих быстро и без проблем, не нагружая систему, при чем, через HDMI можно передавать не только видеосигнал, но и аудио, если конечно устройство может его принимать. Я например подключил 32" телевизор, который теперь воспроизводит видео с моего ноута в большом разрешении (1920 x 1080), и аудио. Работать реально стало гораздо удобнее))

    ОтветитьУдалить