Kernelも定期的にアップデートし，メンテナンスすべし

GPUサーバーマシンとして利用しているデスクトップPCのOSとしてUbuntu20.04を利用しています．UbuntuというLinuxのディストリビューションのバージョンは気に掛けることが多いですが，Kernelは守備範囲外だった筆者ですが，今回Kernelのアップデートに挑戦することに．切っ掛けは以下の様な顛末です．

# 突然動かなくなったGPU
先日久し振りにUbuntuのアップグレードを実施したところ，大量のアップグレードがインストールされました．アップグレード後にnvidia-smiコマンドを実行した所，`NVIDIA-SMI has failed because it couldn't communicate with the NVIDIA driver. Make sure that the latest NVIDIA driver is installed and running.`というエラーメッセージが出力されました．色々調査した所，このエラーメッセージはOSアップグレード後にしばしばNVIDIAドライバーとの相性の問題で出ることが有るとのことです．対処方法として見つかったのは．．．
* ドライバーの再インストール
* BIOSアップデートが実行され，セキュアブートが有効化されている場合は無効化
* グラフィックデバイスはCPU内蔵では無く，ビデオカードを優先させる(ＢＩＯＳの設定)
* 最悪はリカバリー(OSの入れ直し)

筆者は全てを試しましたが，事態は改善せず．．．リカバリーは少なくとも3回は実施しました．GPUが正常に動いている気配が無く，特にファンが動いておらず冷却されないため，電源OFF後ビデオカードが触れないほどの高温になってしまう現象に見舞われました．

# 気になる投稿を発見
ネットで気になる投稿を発見しました．Linuxカーネルの5.13とNVIDIAドライバーの相性が悪い．．．因みに筆者のマシーンのUbuntu20.04のデフォルトのKernelも5.13でした．．．:scream: :scream_cat:

https://forums.developer.nvidia.com/t/ubuntu-20-04-with-kernel-5-13-0-30-generic-doesnt-recognize-rtx-3080-ti-laptop-gpu/204433/5

# Kernelのアップデート
Kernelとの相性が悪い可能性が浮上しましたが，筆者はLinux Kernelについては寡聞にして詳しく無いため，対処方法が分からず，途方に暮れていた所に，以下の様な記事を発見しました．LTS版のKernelをインストールする方法の記事です．

https://hnakamur.github.io/blog/2021/06/28/use-long-term-support-linux-kernel-on-ubuntu/

以降は上記の記事を参考に解説します．Kernelのアップデートのために，以下のコマンドを実行します．上記記事のコマンドをそのまま実行すると，5.14.0がインストールされます．5.14.0は実はLTS版ではありません．試しに5.10.xや5.15.xを試してみたのですが，NIVIDIAドライバーとの相性が悪く起動出来なくなってしまったため，今回は5.14.0を利用することとしました．

```bash:インストールコマンド
sudo apt install -y linux-image-oem-20.04b
```

* 参考

https://en.wikipedia.org/wiki/Linux_kernel_version_history

https://www.kernel.org/category/releases.html

完了後，デフォルトで起動するKernelのバージョンを変更します．Grub2(ブートローダー)の設定を変更することで可能です．

:warning: 以降の設定は失敗すると，最悪OSが起動出来なくなります．十分注意をして実施して下さい．

インストール済のKernelの一覧を出力します．Grubメニューに登録されているKernelの一覧から取得します．取得方法は以下のコマンドを実行します．

```bash:Kernel一覧を出力
$ grep -A100 submenu /boot/grub/grub.cfg | grep menuentry
submenu 'Advanced options for Ubuntu' $menuentry_id_option 'gnulinux-advanced-74416a76-9f47-4342-b02e-3e5162d506c1' {
	menuentry 'Ubuntu, with Linux 5.15.0-1003-intel-iotg' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-5.15.0-1003-intel-iotg-advanced-74416a76-9f47-4342-b02e-3e5162d506c1' {
	menuentry 'Ubuntu, with Linux 5.15.0-1003-intel-iotg (recovery mode)' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-5.15.0-1003-intel-iotg-recovery-74416a76-9f47-4342-b02e-3e5162d506c1' {
	menuentry 'Ubuntu, with Linux 5.14.0-1036-oem' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-5.14.0-1036-oem-advanced-74416a76-9f47-4342-b02e-3e5162d506c1' {
	menuentry 'Ubuntu, with Linux 5.14.0-1036-oem (recovery mode)' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-5.14.0-1036-oem-recovery-74416a76-9f47-4342-b02e-3e5162d506c1' {
	menuentry 'Ubuntu, with Linux 5.13.0-41-generic' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-5.13.0-41-generic-advanced-74416a76-9f47-4342-b02e-3e5162d506c1' {
	menuentry 'Ubuntu, with Linux 5.13.0-41-generic (recovery mode)' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-5.13.0-41-generic-recovery-74416a76-9f47-4342-b02e-3e5162d506c1' {
```

今回利用するのは以下の2つの項目です．(値は筆者の環境の場合)

* `submenu 'Advanced options for Ubuntu' $menuentry_id_option`
    * gnulinux-advanced-74416a76-9f47-4342-b02e-3e5162d506c1
* `menuentry 'Ubuntu, with Linux 5.14.0-1036-oem'`の`$menuentry_id_option`
    * gnulinux-5.14.0-1036-oem-advanced-74416a76-9f47-4342-b02e-3e5162d506c1

この2つの値を`>`で繋いだ以下をこの後用います．
* `gnulinux-advanced-74416a76-9f47-4342-b02e-3e5162d506c1>gnulinux-5.15.0-1003-intel-iotg-advanced-74416a76-9f47-4342-b02e-3e5162d506c1`

Grub2の設定を変更します．まず，`/etc/default/grub`を開きます．

```bash
sudo vim /etc/default/grub
```

設定内容を以下の様に変更します．変更後の値は上記の値(筆者の環境の場合)を設定しています．

```diff:/etc/default/grub(一部抜粋)
- GRUB_DEFAULT=0
+ GRUB_DEFAULT="gnulinux-advanced-74416a76-9f47-4342-b02e-3e5162d506c1>gnulinux-5.14.0-1036-oem-advanced-74416a76-9f47-4342-b02e-3e5162d506c1"
GRUB_TIMEOUT_STYLE=hidden
GRUB_TIMEOUT=0
GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian`
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
GRUB_CMDLINE_LINUX=""
```

編集後，Grub2に設定を反映させるため，update-grubコマンドを実行し，PCを再起動します．

```bash
sudo update-grub
sudo reboot
```

再起動後，設定が反映されているか確認します．

```bash:カーネルバージョンを確認
$ uname -r
5.14.0-1036-oem
```

合わせてnvidia-smiコマンドを実行します．無事GPUが正しく認識されています．因みに再起動時にGPUのファンが回り始めました．(独特の唸るようなファンの音が発生するため直ぐに分かります．)

```bash:GPUの状態を確認
$ nvidia-smi 
Tue May 24 00:03:54 2022       
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 510.73.05    Driver Version: 510.73.05    CUDA Version: 11.6     |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|                               |                      |               MIG M. |
|===============================+======================+======================|
|   0  NVIDIA GeForce ...  Off  | 00000000:01:00.0 Off |                  N/A |
|  0%   49C    P8    18W / 250W |     15MiB /  8192MiB |      0%      Default |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------+
                                                                               
+-----------------------------------------------------------------------------+
| Processes:                                                                  |
|  GPU   GI   CI        PID   Type   Process name                  GPU Memory |
|        ID   ID                                                   Usage      |
|=============================================================================|
|    0   N/A  N/A      1213      G   /usr/lib/xorg/Xorg                  9MiB |
|    0   N/A  N/A      1411      G   /usr/bin/gnome-shell                3MiB |
+-----------------------------------------------------------------------------+
```

参考にした記事では，不要なKernelを削除して，`GRUB_DEFAULT=0`に再設定する行程が有りますが，当面LTS版の5.14.0を利用する予定のため，このままにしておくことにします．(アップグレートを実行時にNVIDIAドライバーと相性の悪いバージョンに置き換わる可能性が有るため)

# まとめ
ＧＰＵマシーンの復旧に丸々1週間程掛かりました．NVIDIAドライバー関連のトラブルは今まで何度か見舞われたことが有りますが，ここまで復旧に時間を要したのは久し振りでした．同様の症状に見舞われている方の助けとなれば幸いです．