Краткое HowTo о том, как жить, если у тебя ноутбук, а экранов стало не хватать.
Исторически так сложилось, что у меня нет и никогда не было стационарного ПК. Только ноутбуки, так как требуется мобильность. И последнее ныне актуальное приобретение — ультрабук Asus S300CA (с ненужным сенсорным экраном) с ArchLinux на борту.
Имеется монитор на 23.6". И все бы хорошо — два экрана, уют, комфорт, тайлинг. Но некоторое время назад, когда работы стало больше, я вновь ощутил нехватку экранов…
Казалось бы, делов-то — подключить еще один монитор в свободный VGA-порт… Любезным товарищем был найден в закромах монитор с VGA. Подключаем монитор и… И ничего! Совсем. Кроме некоей ошибки, выдаваемой xrandr.
Курение интернетов говорит, что установленный Intel HD4000 умеет 3 вывода одновременно, но, как я понял, при условии, что два из них через идентичные цифровые каналы, т.е. LVDS + HDMI + HDMI или LVDS + DP + DP (которого вообще нет).
Купить персональный ПК? Ну уж нет.
Решено попробовать DisplayLink, о котором ранее была статья. Технологией оснащаются, например, мониторы и проекторы. Устройство подключается по USB и создает в системе дополнительный видеоадаптер для передачи изображения. Аппаратной модификации ПК не требуется, только драйвер. Кроме перечисленного производятся и конвертеры, к которым подключается монитор. Такое устройство и решено попробовать.
Был найден вот такой конвертер от HP
Уютная поддержка обещана пользователям 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: 1280x1024 @ 60 Hz valid mode
[ 53.578167] udlfb: 720x400 @ 70 Hz valid mode
[ 53.578171] udlfb: 640x480 @ 60 Hz valid mode
[ 53.578175] udlfb: 640x480 @ 67 Hz valid mode
[ 53.578178] udlfb: 640x480 @ 72 Hz valid mode
[ 53.578181] udlfb: 640x480 @ 75 Hz valid mode
[ 53.578184] udlfb: 800x600 @ 56 Hz valid mode
[ 53.578187] udlfb: 800x600 @ 60 Hz valid mode
[ 53.578190] udlfb: 800x600 @ 72 Hz valid mode
[ 53.578193] udlfb: 800x600 @ 75 Hz valid mode
[ 53.578196] udlfb: 832x624 @ 75 Hz valid mode
[ 53.578200] udlfb: 1024x768 @ 60 Hz valid mode
[ 53.578203] udlfb: 1024x768 @ 70 Hz valid mode
[ 53.578206] udlfb: 1024x768 @ 75 Hz valid mode
[ 53.578209] udlfb: 1280x1024 @ 75 Hz valid mode
[ 53.578213] udlfb: 1152x864 @ 75 Hz valid mode
[ 53.578216] udlfb: 1152x864 @ 75 Hz valid mode
[ 53.578219] udlfb: 1280x960 @ 60 Hz valid mode
[ 53.578222] udlfb: 1280x1024 @ 60 Hz valid mode
[ 53.578226] udlfb: Reallocating framebuffer. Addresses will change!
[ 53.579838] udlfb: 1280x1024 @ 60 Hz valid mode
[ 53.579849] udlfb: set_par mode 1280x1024
[ 53.589240] udlfb: DisplayLink USB device /dev/fb1 attached. 1280x1024 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: 0x7b cap: 0xb, Source Output, Sink Output, Sink Offload crtcs: 4 outputs: 5 associated providers: 0 name:Intel
Provider 1: id: 0x41 cap: 0x2, 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 x 8, current 4566 x 1080, maximum 32767 x 32767
LVDS1 connected 1366x768+1280+0 (normal left inverted right x axis y axis) 293mm x 164mm
1366x768 60.02*+
1024x768 60.00
800x600 60.32 56.25
640x480 59.94
DP1 disconnected (normal left inverted right x axis y axis)
HDMI1 connected 1920x1080+2646+0 (normal left inverted right x axis y axis) 509mm x 286mm
1920x1080 60.00*+ 50.00 59.94 30.00 29.97
1680x1050 59.88
1280x1024 60.02
1440x900 59.90
1280x800 59.91
1152x864 75.00
1280x720 60.00 50.00 59.94
1024x768 70.07 60.00
800x600 60.32 56.25
720x576 50.00
720x480 60.00 59.94
640x480 66.67 60.00 59.94
720x400 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 1280x1024+0+0 (normal left inverted right x axis y axis) 338mm x 270mm
1280x1024 60.02*+ 75.02
1280x960 60.00
1152x864 75.00
1024x768 75.08 70.07 60.00
832x624 74.55
800x600 72.19 75.00 60.32 56.25
640x480 75.00 72.81 66.67 60.00
720x400 70.08
1280x1024 (0x42) 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
1152x864 (0x45) 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
1024x768 (0x47) 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
1024x768 (0x48) 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
800x600 (0x4c) 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
800x600 (0x4d) 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
640x480 (0x50) 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
640x480 (0x51) 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
720x400 (0x52) 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.
Получаем что-то подобное:
DVI-1-0 — LVDS1 — HDMI1
И вид общим планом:
P.S.: Обнаружил проблему с Chromium — при загрузке страницы, а также на панели вкладок, курсор постоянно мерцает. При том проблема наблюдается на всех мониторах кроме того, который выведен через DisplayLink.
Буду благодарен сообществу за замечания об ошибках и неточностях и надеюсь, что кому-то эта статья-мануал пригодится.
Автор: cryptomaniac512