Arch Linuxを入れて動かしているラップトップを起動してログインしようとすると、突然X11がエラーになってデスクトップができない状態になってしまった。
画面のエラーメッセージに促されて、/var/log/Xorg.0.log
を見ると以下のエラーが。どうもintelのgraphicドライバがうまく読み込めていない模様。
[ 8.631] (EE) AIGLX error: dlopen of /usr/lib/dri/i965_dri.so failed (/usr/lib/dri/i965_dri.so: cannot open shared object file: No such file or directory)
[ 8.631] (EE) AIGLX error: unable to load driver i965
[ 8.655] (EE)
[ 8.655] (EE) Backtrace:
[ 8.655] (EE) 0: /usr/lib/Xorg (xorg_backtrace+0x2dd) [0x55727cd48c5d]
[ 8.656] (EE) 1: /usr/lib/libc.so.6 (__sigaction+0x50) [0x7f8f10447710]
[ 8.656] (EE) 2: ? (?+0x0) [0x55727da2f240]
[ 8.656] (EE)
[ 8.656] (EE) Segmentation fault at address 0x55727da2f240
[ 8.656] (EE)
Fatal server error:
[ 8.656] (EE) Caught signal 11 (Segmentation fault). Server aborting
[ 8.656] (EE)
[ 8.656] (EE)
Please consult the The X.Org Foundation support
at http://wiki.x.org
for help.
[ 8.656] (EE) Please also check the log file at "/var/log/Xorg.0.log" for additional information.
[ 8.656] (EE)
[ 8.690] (EE) Server terminated with error (1). Closing log file.
本当は急にドライバを見つけてくれなくなった原因を探るべきなのだと思うが、Arch Linuxのドキュメントを見るとどうやら自分が使っていた xf86-video-intel
パッケージは非推奨になっていた模様。
https://wiki.archlinux.jp/index.php/Intel_graphics#.E3.82.A4.E3.83.B3.E3.82.B9.E3.83.88.E3.83.BC.E3.83.AB
まずはとにかく復旧させたかったので、推奨されている xorg-server
のmodesettingドライバを使う形にすることに。
まずは xf86-video-intel
をアンインストールする。
$ pacman -Rs xf86-video-intel
ドキュメント見る限り特に追加で設定は必要なさそうで、これだけでmodesettingドライバが使われるはず。
……なんだけど、まだ回復せず。だが、エラーの内容が以下と同様の no screens found(EE)
に変わった。
https://forums.freebsd.org/threads/startx-fails-with-no-screens-found.90472/
どうもどこかに Driver "intel"
の設定が残っていそう。grepして探してみると、/etc/X11/xorg.conf
に設定が残っているのを発見。
$ grep -r intel /etc/X11/xorg.conf* /usr/share/X11/xorg.conf*
当該の設定をコメントアウトすると無事X11が起動するように。
ついでに、なんとなくディスプレイマネージャーもLightDMからLyに変えてよい感じになりました。
https://github.com/fairyglade/ly
2024/01/02追記
modesettingに変えていくつか振る舞いが変わっているようで追加で設定が必要そうだったのでメモ
あと、外部ディスプレイへの出力についてはそもそもディスプレイの識別子をベタ書きしてたのが良くなかったと思ったので、動的に取得するよう書き換えた。こんな感じで。
#!/usr/bin/env bash
set -uex
MAIN=$(xrandr | awk '$3=="primary" {print $1}')
CONNECTED_DISPLAYS=$(xrandr | awk '$2=="connected" && $3!="primary" {print $1}')
DICSONNECTED_DISPLAYS=$(xrandr | awk '$2=="disconnected" && $3!="primary" {print $1}')
for CONNECTED in $CONNECTED_DISPLAYS; do
[[ $CONNECTED == DP* ]] && xrandr --output $MAIN --primary --output $CONNECTED --auto --right-of $MAIN
[[ $CONNECTED == HDMI* ]] && xrandr --output $MAIN --primary --output $CONNECTED --set audio on --auto --right-of $MAIN
done
for DISCONNECTED in $DICSONNECTED_DISPLAYS; do
xrandr --output $DISCONNECTED --off
done