ノート PC をドッキング ステーションに接続すると外部ディスプレイが自動的にセットアップされる、初めての udev ルールを作成しました。しかし、うまくいきませんでした (驚きです)。まず最初に、外部ディスプレイをドッキング ステーションから取り外したり接続したりするときに送信されるイベントを確認しました (外部ディスプレイが接続されたノート PC からドッキング ステーション自体を接続または切断すると、同じイベントが発生します)。以下は、* からの出力です。udevadm モニター:
### CONNECTING EXTERNAL DISPLAY ###
KERNEL[12586.516063] change /devices/pci0000:00/0000:00:01.1/0000:01:00.0/drm/card1 (drm)
UDEV [12586.520032] change /devices/pci0000:00/0000:00:01.1/0000:01:00.0/drm/card1 (drm)
KERNEL[12588.090123] change /devices/pci0000:00/0000:00:01.1/0000:01:00.0/drm/card1 (drm)
UDEV [12588.094088] change /devices/pci0000:00/0000:00:01.1/0000:01:00.0/drm/card1 (drm)
### DISCONNECTING EXTERNAL DISPLAY ###
KERNEL[12577.885860] change /devices/pci0000:00/0000:00:01.1/0000:01:00.0/drm/card1 (drm)
KERNEL[12577.885951] change /devices/pci0000:00/0000:00:01.1/0000:01:00.0/drm/card1 (drm)
UDEV [12577.894562] change /devices/pci0000:00/0000:00:01.1/0000:01:00.0/drm/card1 (drm)
UDEV [12577.900236] change /devices/pci0000:00/0000:00:01.1/0000:01:00.0/drm/card1 (drm)
これが私の udev ルールです:
KERNEL=="card1", SUBSYSTEM=="drm", ACTION=="change", RUN+="su vllblvck -c /usr/bin/setup-ext-display.sh"
実行されるスクリプトは次のとおりです。
#!/bin/sh
# PLACE THIS SCRIPT INSIDE /usr/bin
# Automatically setup external monitor
xrandr_command="/usr/bin/xrandr"
sed_command="/bin/sed"
is_hdmi_connected=`DISPLAY=:0 $xrandr_command | $sed_command -n '/DP-1-2.3 connected/p'`
echo is_hdmi_connected: $is_hdmi_connected
if [ -n "$is_hdmi_connected" ]; then
DISPLAY=:0 xrandr --output DP-1-2.3 --auto --right-of eDP-1
echo connecting
else
DISPLAY=:0 $xrandr_command --output DP-1-2.3 --off
echo disconnecting
fi
スクリプト自体は問題なく動作し、私が望んでいたことを実行しました。ルートユーザーに切り替えて確認してみましたが、su vllblvck -c一部は正常に動作しており、その通りです。ルールが実行されるかどうかを確認するために以下のコマンドを実行しましたが、実行されるはずでしたが、実際には実行されなかったり、何らかの不具合が発生したりして、外部ディスプレイが設定されませんでした。
udevadm test --action="change" /devices/pci0000:00/0000:00:01.1/0000:01:00.0/drm/card1
udev ルールのトピックは私にとって新しく、アイデアも Google 検索も尽きてしまったので、これを修正したり、さらにデバッグしたりする方法についてのヒントがあればありがたいです。そして、それがここで重要であれば、私は 5.14.14-arch1-1 カーネルで ArcoLinux を実行しています。
答え1
何度も試した後、 udev ルールを修正することができました。これが機能するルールです:
KERNEL=="card1", SUBSYSTEM=="drm", ENV{DISPLAY}=":0", ENV{XAUTHORITY}="/home/vllblvck/.Xauthority", RUN+="/usr/bin/setup-ext-display.sh"
なぜこれが機能し、以前のものが機能しないのかは、私には全く分からないので、聞かないでください。udev ルールに詳しい人なら、教えてくれるかもしれません。