TL;DR
何が起きた:$ apt update
→ $ apt upgrade
してからlinuxPCを再起動したらXサーバーが立ち上がらなかった。
原因:カーネルのバージョンに対応したlinux-headersがインストールされていなかった。
対応方法:$ apt install linux-headers
を実行
環境
使用GPU:NVIDIA Corporation TU116 [GeForce GTX 1660 SUPER]
以下は問題解決の流れと思考をダラダラとまとめたもの。記念と備忘を兼ねて
問題解決の流れ
起動時のエラーを確認
そもそもエラーが発生しているのであれば、そのエラーを見に行かないのは怒られてしまうのでエラーを拝見しに行く。起動時のエラーってどうすれば見れるのかわからないのでググる。
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
コマンドで見つけられると思ったけど見つけられなかった。) - 記事を作成するときには色々と知見を盛り込みたくなるが、読みづらくなるのと自分の思考がとっちらかってしまうので必要なものを厳選したほうが良さそう。