kirintropのブログ

はるか遠いミニマリストへの道です。

Linuxで4Kマルチディスプレイを「挿すだけ」で完璧に配置する最強の設定術 (autorandr + xrandr)の話。

Linuxで4Kマルチディスプレイを「挿すだけ」で完璧に配置する最強の設定術 (autorandr + xrandr)

4Kモニター(3840x2400など)を2枚繋いだ瞬間に、ノートPCの画面が豆粒みたいに小さくなったり、X11がクラッシュして強制ログアウトされたりしたことはありませんか?
さらに「蓋を閉めたら外部モニターだけにしたい」「外部1枚ならノートPCと併用したい」といった細かい要望を、抜き差しのたびに手動で設定するのは苦行です。

今回は、`autorandr`と独自の`postswitch`スクリプトを組み合わせて、これらをすべて自動化する方法をまとめました。

1. 必要なツールをインストール

まずは、ディスプレイプロファイルを管理する`autorandr`をインストールします。

sudo apt install autorandr
|<

** 2. 基本的なプロファイルの保存
まずは、自分が使いたい画面構成(解像度、リフレッシュレート、配置)を`xrandr`で整えます。

>|bash|
# 例:外部2枚を横に並べ、ノートPC(eDP-1)をオフにする
xrandr --output eDP-1 --off \
       --output DisplayPort-1-2 --mode 3840x2400 --primary \
       --output DP-2 --mode 3840x2560 --right-of DisplayPort-1-2 --rate 30.00
|<

整ったら、その状態を保存します。
>|bash|
autorandr --save docked --force
|<

** 3. 「最強の自動配置」スクリプトの作成
`autorandr`には、設定が切り替わった直後に実行される`postswitch`というフックがあります。これを利用して、蓋の開閉状態や接続台数に応じた「微調整」を強制的に行います。

ここが今回のキモです。`~/.config/autorandr/postswitch` に以下の内容を書き込みます。

>|bash|
#!/bin/bash
# 接続されている外部モニターの名前をすべて取得する(eDP-1以外)
EXT_MONITORS=$(xrandr --query | grep " connected" | grep -v "eDP-1" | cut -d" " -f1)
EXT_COUNT=$(echo "$EXT_MONITORS" | grep -v "^$" | wc -l)

# 蓋の状態を取得(open または closed)
LID_STATE=$(cat /proc/acpi/button/lid/LID*/state | awk '{print $2}')

if [ "$EXT_COUNT" -eq 2 ]; then
    # 【外部2台接続時】蓋が開いていても閉じていても、ノートPCはオフにして外部2枚を優先!
    MON1=$(echo "$EXT_MONITORS" | sed -n '1p')
    MON2=$(echo "$EXT_MONITORS" | sed -n '2p')
    xrandr --output eDP-1 --off \
           --output "$MON1" --auto --primary \
           --output "$MON2" --auto --right-of "$MON1"

elif [ "$EXT_COUNT" -eq 1 ]; then
    MON=$(echo "$EXT_MONITORS" | sed -n '1p')
    if [ "$LID_STATE" = "open" ]; then
        # 【外部1台+蓋開】ノートPCをメインに、外部を右側に配置してデュアル化!
        xrandr --output eDP-1 --auto --primary \
               --output "$MON" --auto --right-of eDP-1
    else
        # 【外部1台+蓋閉】外部モニター1枚のみをメインにする
        xrandr --output eDP-1 --off \
               --output "$MON" --auto --primary
    fi

else
    # 【外部なし】ノートPC単体に戻す
    xrandr --output eDP-1 --auto --primary
fi
|<

保存したら実行権限を与えます。
>|bash|
chmod +x ~/.config/autorandr/postswitch
|<

** 4. なぜこれで解決するのか? (Tips)
- **豆粒現象の回避**: OSが「とりあえず映る解像度」を選んでしまう前に、スクリプトが明示的に `primary` と `auto`(または特定の解像度)を上書きするため、UIスケーリングが崩れにくくなります。
- **クラッシュ対策**: 4Kモニター2枚の急激な切り替えでXサーバーがパニックになるのを、スクリプトによる一連の制御で「順序立てて」設定することで安定させています。
- **蓋を閉めてもスリープさせない**: 
  `/etc/systemd/logind.conf` の `HandleLidSwitch=ignore` 設定も併用すると、蓋を閉じたまま外部モニターで作業する「クラムシェルモード」が安定します。

これで、モニターを挿せば勝手に理想の配置になり、抜けばノートPCに戻る、魔法のような環境の完成です!
kirintropは、Amazon.co.jpを宣伝しリンクすることによって
サイトが紹介料を獲得できる手段を提供することを目的に設定された
アフィリエイトプログラムである、Amazonアソシエイト・プログラムの参加者です。