X11が起動できなくなった

1/1/2024, 5:12:06 PM
a thumbnail

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] (EEFatal server error:
[     8.656] (EE) Caught signal 11 (Segmentation fault). Server aborting
[     8.656] (EE) 
[     8.656] (EEPlease 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-servermodesettingドライバを使う形にすることに。

まずは 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


Unsplash66 northが撮影した写真をサムネに使わせてもらいました。