9

Мой внешний дисплей (подключенный к ноутбуку через Thunderbolt) работает нормально, если подключен до загрузки. Однако, как только он отключен или отключен каким-либо образом, xrandr больше не будет обнаруживать подключенный монитор.

Я использую Arch Linux , использую bumblebee для работы с графическими картами. Внешняя карта подключается через разъем Thunderbolt. Может кто-нибудь сказать мне, что не так с машиной, и как я могу сделать горячее подключение? Благодарю.


[Отладочная деталь]

После нескольких потоков на bumblebee и udevadm я сделал несколько испытаний и сделал сценарий горячего подключения. И все же проблема до сих пор не решена. Результат размещен как показано ниже.

Для шмеля я не особо подправлял, так как второй монитор нормально работает, когда не подключен к сети.

Для горячей замены, связанной с проблемой. Я сделал следующее:

Когда монитор работает нормально, xrandr --query возвращает

Screen 0: minimum 8 x 8, current 2944 x 1080, maximum 32767 x 32767
eDP1 connected primary 1920x1080+0+0 (normal left inverted right x axis y axis) 382mm x 215mm
   1920x1080     60.02*+

...

DP1 connected 1024x768+1920+0 (normal left inverted right x axis y axis) 0mm x 0mm
   1024x768      60.00* 

...

При отключении монитора от DP2 с помощью udevadm monitor --environment --udev открыт, собранная информация:

UDEV  [979.022342] change   /devices/pci0000:00/0000:00:02.0/drm/card0 (drm)
ACTION=change
DEVNAME=/dev/dri/card0
DEVPATH=/devices/pci0000:00/0000:00:02.0/drm/card0
DEVTYPE=drm_minor
HOTPLUG=1
ID_FOR_SEAT=drm-pci-0000_00_02_0
ID_PATH=pci-0000:00:02.0
ID_PATH_TAG=pci-0000_00_02_0
MAJOR=226
MINOR=0
SEQNUM=2650
SUBSYSTEM=drm
TAGS=:master-of-seat:uaccess:seat:
USEC_INITIALIZED=3775241

И при подключении монитора:

UDEV  [1111.426386] change   /devices/pci0000:00/0000:00:02.0/drm/card0 (drm)
ACTION=change
DEVNAME=/dev/dri/card0
DEVPATH=/devices/pci0000:00/0000:00:02.0/drm/card0
DEVTYPE=drm_minor
HOTPLUG=1
ID_FOR_SEAT=drm-pci-0000_00_02_0
ID_PATH=pci-0000:00:02.0
ID_PATH_TAG=pci-0000_00_02_0
MAJOR=226
MINOR=0
SEQNUM=2651
SUBSYSTEM=drm
TAGS=:seat:uaccess:master-of-seat:
USEC_INITIALIZED=3775241

UDEV  [1111.522857] change   /devices/pci0000:00/0000:00:02.0/drm/card0 (drm)
ACTION=change
DEVNAME=/dev/dri/card0
DEVPATH=/devices/pci0000:00/0000:00:02.0/drm/card0
DEVTYPE=drm_minor
HOTPLUG=1
ID_FOR_SEAT=drm-pci-0000_00_02_0
ID_PATH=pci-0000:00:02.0
ID_PATH_TAG=pci-0000_00_02_0
MAJOR=226
MINOR=0
SEQNUM=2652
SUBSYSTEM=drm
TAGS=:seat:uaccess:master-of-seat:
USEC_INITIALIZED=3775241

Кажется, что udev в состоянии обнаружить оборудование, когда монитор подключен, поэтому я установил правило udev, чтобы помочь xrandr использовать новый монитор. Мой скрипт для /etc/udev/rules.d/95-monitor-hotplug.rules выглядит следующим образом:

ACTION=="change", SUBSYSTEM=="drm", RUN+="/usr/local/bin/hotplug_monitor.sh"

И /usr/local/bin/hotplug_monitor.sh

#!/bin/sh
export XAUTHORITY=/home/chong/.Xauthority

function connectDP1(){
    DISPLAY=:0 xrandr --output DP1 --auto --right-of eDP1
}

function disconnectDP1(){
    DISPLAY=:0 xrandr --output DP1 --off
}

function connectDP2(){
    DISPLAY=:0 xrandr --output DP2 --auto --right-of eDP1
}

function disconnectDP2(){
    DISPLAY=:0 xrandr --output DP2 --off
}

xrandr | grep "DP1 connected" &> /dev/null && connectDP1 || disconnectDP1
xrandr | grep "DP2 connected" &> /dev/null && connectDP2 || disconnectDP2

Сценарий выполняется и завершается нормально, но после этого xrandr --query прежнему показывает, что DP1 и DP2 отключены.

1 ответ1

1

Я нашел ваш код и продолжал пытаться заставить его работать. Ни при каких условиях я не мог бы заставить его работать с парадигмой "если тогда". «xrandr | grep» ВСЕГДА не мог быть верным при запуске как триггер udev, но работал, если я запускал его вручную. Я был вынужден разбить его на два сценария.

Хотя мое устройство отличается (StarTech CDPVGDVHDMDP), я опубликую свою версию здесь.

Во-первых, я обнаружил, что полезно перезагрузить правила udev при устранении неполадок:

sudo udevadm control --reload-rules

Мое устройство было немного другим, и я обнаружил, что подсистема "hidraw" была чем-то, что я мог вызвать. Кроме того, я был вынужден запустить /bin /bash /path /to /script ", иначе он не запустился. Это мое правило udev (/etc/udev/rules.d/95-monitor-hotplug.rules):

ACTION=="remove", SUBSYSTEM=="hidraw", RUN+="/bin/bash /home/user/scripts/hotunplug-displayport.sh"
ACTION=="add", SUBSYSTEM=="hidraw", RUN+="/bin/bash /home/user/scripts/hotplug-displayport.sh"

Это мой скрипт горячего подключения

#!/bin/bash
export XAUTHORITY=/home/user/.Xauthority
DISPLAY=:0 /usr/bin/xrandr --addmode DP-1 1680x1050
DISPLAY=:0 /usr/bin/xrandr --output DP-1 --right-of  eDP-1 --mode 1680x1050
echo "$(date) : Hotplug Connect DP-1" >> /var/log/hotplug.txt
DISPLAY=:0 /usr/bin/xrandr --addmode DP-2 1680x1050
DISPLAY=:0 /usr/bin/xrandr --output DP-2 --right-of  eDP-1 --mode 1680x1050
echo "$(date) : Hotplug Connect DP-2" >> /var/log/hotplug.txt

Это мой сценарий горячего отключения

#!/bin/bash
export XAUTHORITY=/home/user/.Xauthority
DISPLAY=:0 /usr/bin/xrandr --output DP-1 --off
echo "$(date) : Hotplug Disconnect DP-1" >> /var/log/hotplug.txt
DISPLAY=:0 /usr/bin/xrandr --output DP-2 --off
echo "$(date) : Hotplug Disconnect DP-2" >> /var/log/hotplug.txt

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .