Arch Linux で、システムのアップデートを機にブートプロセスがハングする問題が生じた。 NVIDIA の純正ドライバをカーネル空間で読み込もうとするとハングするので、KMS を無効化して解消した。
tl;dr
カーネルパラメータを変更し、initramfs
を作り直して解消した。
- カーネルパラメータの変更
- KMS を 有効化 するためのパラメータ
nvidia_drm.modeset=1
を削除する - KMS を 無効化 するためのパラメータ
nomodeset
を追加する
- KMS を 有効化 するためのパラメータ
- initramfs から NVIDIA 関連のモジュールを削除
(1.1) のパラメータはハイフンを使って nvidia-drm.modeset=1
と表記することもできる。
Kernel Mode Setting (KMS) とは
KMS は、ディスプレイの モード (解像度、色深度、リフレッシュレート) をカーネルで設定することを指す。 対してユーザー空間で設定することは User-space Mode Setting (UMS) と呼ぶ。
詳しくは以下を参照して欲しい:
KMS を無効化する
カーネルパラメータの変更
ブートローダーに systemd-boot
を使っているため、カーネルパラメータは /boot/loader/entries/arch.conf
内の options
で指定している。
- options root=/path/to/root rw nvidia_drm.modeset=1
+ options root=/path/to/root rw nomodeset
GRUB を使っている場合には /boot/grub/grub.cfg
あるいは /etc/default/grub
を編集れば良い。 詳しくは ArchWiki - Kernel Parameters を参照。
initramfs
から NVIDIA 関連のモジュールを削除
initramfs
の生成時に NVIDIA 関連のモジュールを 含まない ようにしたい。 mkinitcpio
を利用しているならば、その設定ファイル /etc/mkinitcpio.conf
の MODULES=()
を確認する。
- MODULES=(nvidia nvidia_modeset nvidia_uvm nvidia_drm)
+ MODULES=()
雑記
起動時のログを確認しても、NVIDIA が、KMS が原因であることはわからなかった。 systemd
の不具合を疑って、systemd-networkd
や systemd-timedated
を無効化したり、dm-crypt
を疑って /etc/crypttab
や /etc/fstab
の設定を見直したりした。 最後に思いついたのが NVIDIA で、試しに Nouveau を使ってみたところ起動に成功した。 いっそ Nouveau を使おうかとも思ったが、デュアルモニタの設定がうまくいかず、また CUDA も利用できない。 そんなときにやっと以下の記述に行き当たる:
1.1 System will not boot after driver was installed
If after installing the NVIDIA driver your system becomes stuck before reaching the display manager, try to disable kernel mode setting.
これで初めて KMS が問題になることを知った。