起動前に接続すると、外部ディスプレイ(Thunderboltを介してラップトップに接続)は正常に機能します。ただし、何らかの方法でプラグを抜いたり切断したりすると、xrandrは再接続されたモニターを検出しなくなります。
グラフィックカードの処理にbumblebee
を使用して、Arch Linux
を実行しています。外部カードはThunderboltコネクタを介して接続されます。誰かがマシンの何が問題になっているのか、そしてどうすればホットプラグを機能させることができるのか教えてもらえますか?ありがとう。
[デバッグの詳細]
bumblebee
とudevadm
の複数のスレッドに続いて、いくつかのテストを行い、ホットプラグスクリプトを作成しました。しかし、問題はまだ解決されていません。結果は以下のように掲載されています。
マルハナバチの場合、2番目のモニターはホットプラグされていないときに正常に検出されるため、あまり調整しませんでした。
ホットプラグ関連の問題について。私は次のことをしました:
モニターが正常に動作している場合、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*
...
udevadm monitor --environment --udev
を開いた状態でDP2からモニターを取り外すと、収集される情報は次のとおりです。
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
はハードウェアを検出できるようです。そこで、xrandr
が新しいモニターを使用できるようにudevルールを設定しました。 /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
が切断されていることを示します。
私はあなたのコードを見つけて、それを機能させようと頑張った。いかなる条件下でも、「ifthen」パラダイムで動作させることはできません。 「xrandr | grep」は、udevトリガーとして実行すると常にtrueになりませんでしたが、手動で実行すると機能しました。私はそれを2つのスクリプトに分割することを余儀なくされました。
私のデバイスは異なりますが(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