apt upgradeしたらXseverが立ち上がらなくなった話

TL;DR

何が起きた:$ apt update$ apt upgradeしてからlinuxPCを再起動したらXサーバーが立ち上がらなかった。

原因:カーネルのバージョンに対応したlinux-headersがインストールされていなかった。 対応方法:$ apt install linux-headersを実行

環境

Debianバージョン:trixie/sid

使用GPU:NVIDIA Corporation TU116 [GeForce GTX 1660 SUPER]

linuxカーネル:6.7.9-amd64

以下は問題解決の流れと思考をダラダラとまとめたもの。記念と備忘を兼ねて

問題解決の流れ

起動時のエラーを確認

そもそもエラーが発生しているのであれば、そのエラーを見に行かないのは怒られてしまうのでエラーを拝見しに行く。起動時のエラーってどうすれば見れるのかわからないのでググるsystemctl --failedで見れるらしい(参照:systemd systemctlでデーモン起動しない場合のログ確認方法

というわけで得られたエラーの一覧

  UNIT                         LOAD   ACTIVE SUB    DESCRIPTION                                           
* nvidia-persistenced.service  loaded failed failed NVIDIA Persistence Daemon                             
* systemd-modules-load.service loaded failed failed Load Kernel Modules             

エラーの中身を見てみる

$ systemctl status nvidia-persistenced.service で1個目のエラーの中身を見てみる

❯ sudo systemctl status nvidia-persistenced.service                                                                
x nvidia-persistenced.service - NVIDIA Persistence Daemon
     Loaded: loaded (/usr/lib/systemd/system/nvidia-persistenced.service; enabled; preset: enabled)
     Active: failed (Result: exit-code) since Tue 2024-03-19 23:45:57 JST; 17min ago               
    Process: 737 ExecStart=/usr/bin/nvidia-persistenced --user nvpd (code=exited, status=1/FAILURE)
    Process: 785 ExecStopPost=/bin/rm -rf /var/run/nvidia-persistenced (code=exited, status=0/SUCCESS)
        CPU: 36ms                                                                                         
-----(中略)-------                         
Mar 19 23:45:57 debian nvidia-persistenced[779]: Failed to query NVIDIA devices. Please ensure that the NVIDIA devi
ce files (/dev/nvidia*) exist, and that user 101 has read and write permissions for those files.          
-----(後略)-------                         

ふーん。/dev/nvidia*が存在しないとな。ほんまかいなと実際/dev/に調べに行ってみる。

実際に存在しない。

おおこれが原因や!(嘘です違いました)

というわけで対処法をググる。 似た事例の記事を見つける(参考: NVIDIA device doesn't exist!) 大変浅はかで学習能力のない私は記事に紹介されている。 $ apt-get install --reinstall nvidia-driver を実行してみる(すでに同じことは実行しているのにも関わらず) →当然直らない。ので別の記事を探してみる。

そもそも/dev/について

 [SOLVED]Nvidia Persistence Daemon fails to start 上記の記事に

Also these files might miss if your kernel module doesn't load, check dmesg, maybe also post the pacman log of the problematic transaction.

と書いてある。 つまり、そもそもカーネルがデバイスをロードできててないのであれば、/dev/にファイルが存在しないのはあたりまえだろうということ。

というか私はlinux/dev/がデバイス用のディレクトリであることを知らなかった。(参照:https://qiita.com/kakkie/items/9dcf7462a0ba48d9d26f)

Linuxは、ハードウェアのアクセスを抽象化するデバイスファイルを持っている。全てのハードウェアはデバイスファイルとして表され、デバイスファイルの読み書きを通してハードウェアにアクセスできるように設計されている。

本当の原因

は多分、カーネルがデバイスをロードできなかったこと。 実際、systemctl --failedで得られていたsudo systemctl status systemd-modules-load.serviceでエラーを見てみると

x systemd-modules-load.service - Load Kernel Modules
     Loaded: loaded (/usr/lib/systemd/system/systemd-modules-load.service; static)
     Active: failed (Result: exit-code) since Sat 2024-03-23 22:13:20 JST; 14min ago
       Docs: man:systemd-modules-load.service(8)
             man:modules-load.d(5)
    Process: 724 ExecStart=/usr/lib/systemd/systemd-modules-load (code=exited, status=1/FAILURE)
   Main PID: 724 (code=exited, status=1/FAILURE)
        CPU: 38ms

Mar 23 22:13:20 debian systemd-modules-load[733]: modprobe: ERROR: could not insert 'nvidia': Invalid argument
Mar 23 22:13:20 debian systemd-modules-load[736]: modprobe: FATAL: Module nvidia-current-modeset not found in directory /lib/modules/6.7.9-amd64
Mar 23 22:13:20 debian systemd-modules-load[730]: modprobe: ERROR: ../libkmod/libkmod-module.c:1084 command_do() Error running install command 'modprobe nvidia ; modprobe -i nvidia-current-modeset ' for module nvidia_modeset: retcode 1
Mar 23 22:13:20 debian systemd-modules-load[730]: modprobe: ERROR: could not insert 'nvidia_modeset': Invalid argument
Mar 23 22:13:20 debian systemd-modules-load[737]: modprobe: FATAL: Module nvidia-current-drm not found in directory /lib/modules/6.7.9-amd64
Mar 23 22:13:20 debian systemd-modules-load[724]: Error running install command 'modprobe nvidia-modeset ; modprobe -i nvidia-current-drm ' for module nvidia_drm: retcode 1
Mar 23 22:13:20 debian systemd-modules-load[724]: Failed to insert module 'nvidia_drm': Invalid argument
Mar 23 22:13:20 debian systemd[1]: systemd-modules-load.service: Main process exited, code=exited, status=1/FAILURE
Mar 23 22:13:20 debian systemd[1]: systemd-modules-load.service: Failed with result 'exit-code'.
Mar 23 22:13:20 debian systemd[1]: Failed to start systemd-modules-load.service - Load Kernel Modules.

modrprobeというモジュールをロードするコマンドが失敗している。

というわけで、Error running install command 'modprobe nvidia-modeset ; modprobe -i nvidia-current-drm ' for module nvidia_drm: retcode 1の文言でググって対処法を探してみると、

記事 [solved] nVidia: modprobe fails with "Operation not permitted"

Hmm, could you check if the appropriate kernel headers are installed on your system?
'sudo dpkg -l linux-headers-amd64'

と言う記述を見かける。

というわけで確認。$ dpkg -l linux-headers-amd64を実行してみると、linux-headersのバージョンがuname -rで確認できるバージョンと異なっていることに気づいた。

$ apt install linux-headersを実行して解決

統括と学び

  • エラーを追っていくと結構システムの勉強になる(linuxのどういうプログラムが起動時に動いているのか、ログがどこにあるのかなど)
  • あと、記事作成用にログを参照しようとしたけど、記事作成しているときにはエラーが発生しなくなっていたので見つけられないものもあった。備忘のためにエラーが発生したときはscriptコマンドで残しておくのがいいかも(起動時のエラーを探したけどjournalctlコマンドで見つけられると思ったけど見つけられなかった。)
  • 記事を作成するときには色々と知見を盛り込みたくなるが、読みづらくなるのと自分の思考がとっちらかってしまうので必要なものを厳選したほうが良さそう。