Tech Nuggets (15)

NVIDIA: KMS を無効化することで起動時のハングを解消した

Posted:

Arch Linux で、システムのアップデートを機にブートプロセスがハングする問題が生じた。 NVIDIA の純正ドライバをカーネル空間で読み込もうとするとハングするので、KMS を無効化して解消した。

tl;dr

カーネルパラメータを変更し、initramfs を作り直して解消した。

  1. カーネルパラメータの変更
    1. KMS を 有効化 するためのパラメータ nvidia_drm.modeset=1 を削除する
    2. KMS を 無効化 するためのパラメータ nomodeset を追加する
  2. 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.confMODULES=() を確認する。

- MODULES=(nvidia nvidia_modeset nvidia_uvm nvidia_drm)
+ MODULES=()

雑記

起動時のログを確認しても、NVIDIA が、KMS が原因であることはわからなかった。 systemd の不具合を疑って、systemd-networkdsystemd-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.

NVIDIA/Troubleshooting - ArchWiki

これで初めて KMS が問題になることを知った。