Linuxでディスプレイ解像度を自動切替する方法

Linuxでディスプレイ解像度を自動で切り替える方法です.

  • ノートPCで外部モニタを使う場合
  • ノートPCでサスペンドから復帰後,解像度がおかしくなる場合
  • 画面切替機(キーボードスイッチャ,パソコン切替器)を使っている場合

などに,毎回解像度を手動で設定し直す必要がなくなります.便利です

設定方法

autorandr を使います.

インストールはaptが使える環境なら以下の通りです

$ sudo apt install autorandr

ソースコードGitHub で公開されています.
github.com
ubuntucentos などでもパッケージが標準で用意されているそうです.

使い方

  1. ディスプレイの設定を行います
  2. 設定が終わったら,設定をファイルに保存します.
  3. あとはホットプラグです
    • ディプレイを接続するなどしたら,そのタイミングで自動的に設定が切り替わります.

便利ですね

2.の設定保存の操作では,以下のコマンドを使います.

$ autorandr --save ”名前”

名前はそのまま設定ファイルの名前として流用されるので,半角英数が良いでしょう.

例えばデフォルト設定を保存する場合は

$ autorandr --save default

などとします.

保存した設定の一覧は以下のコマンドで確認できます

$ autorandr

autorandr の動作原理

autorandr には大きく二つの機能があります

画面設定の save と load

ディスプレイ設定を保存するには以下のコマンドを実行します

$ autorandr --save 名前

このコマンドを実行すると ~/.config/autorandr/名前/ と言うディレクトリが生成され,以下のファイルが生成されます

  • ~/.config/autorandr/名前/config
  • ~/.config/autorandr/名前/setup

~/.config/autorandr/名前/config には解像度などのディスプレイ設定が保存されています.X window system では,画面解像度などのディスプレイに関する設定やその変更方法は, RandR extension と言う仕様で管理されています.autorandr は RandR extensionを使って,解像度の設定などを調べて,その情報をファイルに保存します.

~/.config/autorandr/名前/setup にはハードウェア情報(接続されたディスプレイのEDIDなど)が保存されています

保存した設定の一覧は以下のコマンドで確認できます

$ autorandr

保存した設定を読み込んで,ディスプレイ設定を変更するには以下のコマンドを実行します

$ autorandr --load 名前
ホットプラグ

autorandr はホットプラグに対応しています.ディスプレイをつないだり,サスペンドから復帰すると,autorandr が自動で起動されます.

これは udev を使って実現されています.

ディスプレイが検出されると Linuxカーネルdrm サブシステムが反応します.そこで udev を使ってdrmサブシステムに変化があった場合は autorandr を実行します.

具体的には,debian の場合だと /lib/udev/rules.d/40-monitor-hotplug.rules が udev のルールになっています.

ACTION=="change", SUBSYSTEM=="drm", RUN+="/bin/systemctl start --no-block autorandr.service"

このルールでまず udev 経由で systemctl にジョブをキューイングします

autorandr.service は /lib/systemd/system/autorandr.service で定義されています

[Unit]
Description=autorandr execution hook
After=sleep.target
# Note: StartLimitInterval was renamed to StartLimitIntervalSec in systemd-230.
# See autorandr bug #69. Do not rename for now, as the old name is kept for
# compatibility.
StartLimitInterval=5
StartLimitBurst=1

[Service]
ExecStart=/usr/bin/autorandr --batch --change --default default
Type=oneshot
RemainAfterExit=false

[Install]
WantedBy=sleep.target

つまりディスプレイが接続されると,

/usr/bin/autorandr --batch --change --default default 

が一度だけ実行されます.

この際の /usr/bin/autorandr の挙動は以下の通りです.

  • 検出したディスプレイに対応する randr の設定があればそれを load
    • 細かく言うと,まず接続されたディスプレイのEDIDなどと ~/.config/autorandr/*/setup に保存された情報を照らし合わせて,対応するものが見つかれば その config をloadします.
  • 新しいディスプレイの場合は "default" をload
    • 細かく言うと,上記処理で対応する autorandr/*/setupが見つからない場合,となります.
    • "--default default"の設定で defaultを指定しているので, ~/.config/autorandr/default/config をloadします

と言うわけで,デフォルト設定が必要な場合は,設定を

$ autorandr --save default 

で保存しておくと良いかもしれません.