[Из песочницы] Как жить, если у тебя ноутбук, а экранов стало не хватать

imageКраткое HowTo о том, как жить, если у тебя ноутбук, а экранов стало не хватать.Исторически так сложилось, что у меня нет и никогда не было стационарного ПК. Только ноутбуки, так как требуется мобильность. И последнее ныне актуальное приобретение — ультрабук Asus S300CA (с ненужным сенсорным экраном) с ArchLinux на борту.Имеется монитор на 23.6». И все бы хорошо — два экрана, уют, комфорт, тайлинг. Но некоторое время назад, когда работы стало больше, я вновь ощутил нехватку экранов…Казалось бы, делов-то — подключить еще один монитор в свободный VGA-порт… Любезным товарищем был найден в закромах монитор с VGA. Подключаем монитор и… И ничего! Совсем. Кроме некоей ошибки, выдаваемой xrandr.

Курение интернетов говорит, что установленный Intel HD4000 умеет 3 вывода одновременно, но, как я понял, при условии, что два из них через идентичные цифровые каналы, т.е. LVDS + HDMI + HDMI или LVDS + DP + DP (которого вообще нет).

Купить персональный ПК? Ну уж нет.

Решено попробовать DisplayLink, о котором ранее была статья. Технологией оснащаются, например, мониторы и проекторы. Устройство подключается по USB и создает в системе дополнительный видеоадаптер для передачи изображения. Аппаратной модификации ПК не требуется, только драйвер. Кроме перечисленного производятся и конвертеры, к которым подключается монитор. Такое устройство и решено попробовать.

Был найден вот такой конвертер от HPimageУютная поддержка обещана пользователям Mac и Windows, но в данном случае имеем Linux, так что достаем бубен…

По ссылке приведен неплохой мануал, который дает понять ряд необходимых вещей:

устройство поддерживается необходим модуль udl вместо существующего udlfb (хотя я так и не смог понять, почему udlfb продолжает существовать в системе, если не применим для этой задачи) все это отлично поддерживатся xrandr’ом Подключаем устройство в USB, подключаем монитор к устройству — монитор горит ярко зеленым, чем сообщает о готовности.Посмотрим, определилось ли устройство в системе: [root@machine ~]$ lsusb Bus 002 Device 002: ID 8087:0024 Intel Corp. Integrated Rate Matching Hub Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub Bus 001 Device 005: ID 03eb:8810 Atmel Corp. Bus 001 Device 004: ID 0bda:5705 Realtek Semiconductor Corp. Bus 001 Device 003: ID 13d3:3402 IMC Networks Bus 001 Device 002: ID 8087:0024 Intel Corp. Integrated Rate Matching Hub Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub Bus 004 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub Bus 003 Device 003: ID 17e9:01d7 DisplayLink Bus 003 Device 002: ID 045e:07b1 Microsoft Corp. Bus 003 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub Видим строчку Bus 003 Device 003: ID 17e9:01d7 DisplayLink, а значит, надежды есть.Требуется поддержка фрэймбуфера X-сервером, для чего существует пакет xf86-video-fbdev. Также нам потребуется xf86-video-modesetting.

Оба пакета доступны в репозитории Extra. Установим:

[root@machine ~]$ pacman -S xf86-video-fbdev xf86-video-modesetting Попробуем перезагрузиться и получить работу «из коробки», но снова видим только зеленый экран.Отключаем-подключаем устройство и смотрим вывод dmesg: [root@machine ~]$ dmesg [ 53.300045] usb 1–2: new high-speed USB device number 9 using xhci_hcd [ 53.479369] udlfb: DisplayLink HP USB Graphics Adap — serial #319454 [ 53.479387] udlfb: vid_17e9&pid_01d7&rev_0102 driver’s dlfb_data struct at ffff8800ab8e7800 [ 53.479395] udlfb: console enable=1 [ 53.479398] udlfb: fb_defio enable=1 [ 53.479404] udlfb: shadow enable=1 [ 53.479546] udlfb: vendor descriptor length:1b data:1b 5f 01 0019 05 00 01 03 00 04 [ 53.479558] udlfb: DL chip limited to 2080000 pixel modes [ 53.479653] udlfb: allocated 4 65024 byte urbs [ 53.578156] udlfb: 1280×1024 @ 60 Hz valid mode [ 53.578167] udlfb: 720×400 @ 70 Hz valid mode [ 53.578171] udlfb: 640×480 @ 60 Hz valid mode [ 53.578175] udlfb: 640×480 @ 67 Hz valid mode [ 53.578178] udlfb: 640×480 @ 72 Hz valid mode [ 53.578181] udlfb: 640×480 @ 75 Hz valid mode [ 53.578184] udlfb: 800×600 @ 56 Hz valid mode [ 53.578187] udlfb: 800×600 @ 60 Hz valid mode [ 53.578190] udlfb: 800×600 @ 72 Hz valid mode [ 53.578193] udlfb: 800×600 @ 75 Hz valid mode [ 53.578196] udlfb: 832×624 @ 75 Hz valid mode [ 53.578200] udlfb: 1024×768 @ 60 Hz valid mode [ 53.578203] udlfb: 1024×768 @ 70 Hz valid mode [ 53.578206] udlfb: 1024×768 @ 75 Hz valid mode [ 53.578209] udlfb: 1280×1024 @ 75 Hz valid mode [ 53.578213] udlfb: 1152×864 @ 75 Hz valid mode [ 53.578216] udlfb: 1152×864 @ 75 Hz valid mode [ 53.578219] udlfb: 1280×960 @ 60 Hz valid mode [ 53.578222] udlfb: 1280×1024 @ 60 Hz valid mode [ 53.578226] udlfb: Reallocating framebuffer. Addresses will change! [ 53.579838] udlfb: 1280×1024 @ 60 Hz valid mode [ 53.579849] udlfb: set_par mode 1280×1024 [ 53.589240] udlfb: DisplayLink USB device /dev/fb1 attached. 1280×1024 resolution. Using 5120K framebuffer memory udlfb обнаружил устройство, прочитал доступные режимы и привязал устройство /dev/fb1.В принципе, этого достаточно, если настройка выводов будет производиться через конфиги X-сервера, но желаемое — поддержка xrandr.Собственно, цепляясь за факт, что udlfb обнаружил устройство, хотя udl в системе есть, принимаем за факт, что модули конфликтуют и потому вносим udlfb в список не загружаемых. Создадим файл displaylink.conf и запишем это туда:

[root@machine ~]$ echo 'blacklist udlfb' >> /etc/modprobe.d/displaylink.conf Вновь перезагружаемся и смотрим доступные адаптеры: [user@machine ~]$ xrandr —listproviders: Provider 0: id: 0×7b cap: 0xb, Source Output, Sink Output, Sink Offload crtcs: 4 outputs: 5 associated providers: 0 name: Intel Provider 1: id: 0×41 cap: 0×2, Sink Output crtcs: 1 outputs: 1 associated providers: 0 name: modesetting Ура, теперь их два! Первый — через встроенный Intel HD4000, второй — через наш адаптер.Теперь сообщим xrandr как с этим жить:

[user@machine ~]$ xrandr —setprovideroutputsource 1 0 … и посмотрим вывод: [user@machine ~]$ xrandr Screen 0: minimum 8×8, current 4566×1080, maximum 32767×32767 LVDS1 connected 1366×768+1280+0 (normal left inverted right x axis y axis) 293mm x 164mm 1366×768 60.02*+ 1024×768 60.00 800×600 60.32 56.25 640×480 59.94 DP1 disconnected (normal left inverted right x axis y axis) HDMI1 connected 1920×1080+2646+0 (normal left inverted right x axis y axis) 509mm x 286mm 1920×1080 60.00*+ 50.00 59.94 30.00 29.97 1680×1050 59.88 1280×1024 60.02 1440×900 59.90 1280×800 59.91 1152×864 75.00 1280×720 60.00 50.00 59.94 1024×768 70.07 60.00 800×600 60.32 56.25 720×576 50.00 720×480 60.00 59.94 640×480 66.67 60.00 59.94 720×400 70.08 VGA1 disconnected (normal left inverted right x axis y axis) VIRTUAL1 disconnected (normal left inverted right x axis y axis) DVI-1–0 connected 1280×1024+0+0 (normal left inverted right x axis y axis) 338mm x 270mm 1280×1024 60.02*+ 75.02 1280×960 60.00 1152×864 75.00 1024×768 75.08 70.07 60.00 832×624 74.55 800×600 72.19 75.00 60.32 56.25 640×480 75.00 72.81 66.67 60.00 720×400 70.08 1280×1024 (0×42) 108.000MHz h: width 1280 start 1328 end 1440 total 1688 skew 0 clock 63.98KHz v: height 1024 start 1025 end 1028 total 1066 clock 60.02Hz 1152×864 (0×45) 108.000MHz h: width 1152 start 1216 end 1344 total 1600 skew 0 clock 67.50KHz v: height 864 start 865 end 868 total 900 clock 75.00Hz 1024×768 (0×47) 75.000MHz h: width 1024 start 1048 end 1184 total 1328 skew 0 clock 56.48KHz v: height 768 start 771 end 777 total 806 clock 70.07Hz 1024×768 (0×48) 65.000MHz h: width 1024 start 1048 end 1184 total 1344 skew 0 clock 48.36KHz v: height 768 start 771 end 777 total 806 clock 60.00Hz 800×600 (0×4c) 40.000MHz h: width 800 start 840 end 968 total 1056 skew 0 clock 37.88KHz v: height 600 start 601 end 605 total 628 clock 60.32Hz 800×600 (0×4d) 36.000MHz h: width 800 start 824 end 896 total 1024 skew 0 clock 35.16KHz v: height 600 start 601 end 603 total 625 clock 56.25Hz 640×480 (0×50) 30.240MHz h: width 640 start 704 end 768 total 864 skew 0 clock 35.00KHz v: height 480 start 483 end 486 total 525 clock 66.67Hz 640×480 (0×51) 25.200MHz h: width 640 start 656 end 752 total 800 skew 0 clock 31.50KHz v: height 480 start 490 end 492 total 525 clock 60.00Hz 720×400 (0×52) 28.320MHz h: width 720 start 738 end 846 total 900 skew 0 clock 31.47KHz v: height 400 start 412 end 414 total 449 clock 70.08Hz DVI-1–0 — наш искомый вывод.На этом небольшой квест завершается. Далее остается только указать xrandr’у как работать с выводами. Любители GUI могут использовать arandr, в противном случае можно сделать, например, так:

[user@machine ~]$ xrandr --output LVDS1 --auto --output HDMI1 --auto --right-of LVDS1 --output DVI-1–0 --auto --left-of LVDS1 , где LVDS1 — встроенный вывод ноутбука. Для всех выводов параметры устанавливаются автоматически, HDMI1 вывести справа от LVDS1, DVI-1–0 вывести слева от LVDS1.Получаем что-то подобное:

imageDVI-1–0 — LVDS1 — HDMI1

И вид общим планом:

image

P.S.: Обнаружил проблему с Chromium — при загрузке страницы, а также на панели вкладок, курсор постоянно мерцает. При том проблема наблюдается на всех мониторах кроме того, который выведен через DisplayLink.

Буду благодарен сообществу за замечания об ошибках и неточностях и надеюсь, что кому-то эта статья-мануал пригодится.

© Habrahabr.ru