i3でマルチモニタをしようとしてハマった話

i3-wm

今まで xfce を使ってきて i3 に乗り換えた(前の記事を参照)

マルチモニタ環境でうまくやるために i3-workscreen を入れたわけだが、たまに i3-workscreen の起動と同時に画面が落ちるようになった。

この問題の解決方法とたどり着くまでの道筋を記録する。

要約

xrandr だけで制御するのは難しそうなので xorg.conf を併用する。

道筋

最終的にこのようにつなぎたかった。

モニタの並べ方

まず、問題の切り分けをした。

  • xfce で動くか
     問題なく 3 枚がつながるので i3 で動いている何かが問題
  • 直接 xrandr を実行しても画面が落ちるか
     一気に 3 枚つなごうとすると落ちる
  • 1 つずつつなぐとどうなるか
    DP2-2 はつながるが、DP2-1 をつなごうとすると Xrandr: Configure crtc 1 failed が出てきてつながらない
    ただし、画面は落ちない

画面が落ちるのに関しては ctrl alt F3 で tty3 が起動し、startx が実行できることから x server が落ちていることがわかった。

eDP を off にしたりすると DP2-1 もつながったりしたが、いまいち再現性がないので別の方策を探すことにした。

xrandr 3 monitorsと検索するとこの記事が一番上に来る(DackDackGo の場合)。
xrandr three monitors

この記事にはこう書かれている。

I'm not very familiar with xrandr that's why I usually would start with a simple fixed setup in /etc/X11/xorg.conf, like this for your case:

どうやら xorg.conf でもマルチディスプレイの設定ができるらしい。

arch Wiki にも同様のことが書かれている。

マルチディスプレイ - ArchWiki

これを設定すると lightdm の起動時(正しくは xserver の起動時)にディスプレイを検知する。

適用されると、lightdm のログイン画面の時点で 3 枚のモニタが別々に認識されている。

3 枚が認識されている状態 xrandri3-workscreen を実行すると希望通りの動作をする。

ついでなので接続が切れたりした時にもうまく動くようにする

teratail で上記の問題を質問したところ、udev でモニタの切断・接続のイベントに応じてコマンドが発行できることを知った。

よく見ると i3-workscreen にも同様のことが書かれている。

なので設定する。

SUBSYSTEM=="drm" ACTION=="change", RUN+="i3-workscreen"

これで動くはず。