備忘記録として
1. 障害概要
メインラインカーネル(7.3.0-rc2)環境下において、NVIDIAプロプライエタリドライバ(580.173.02)のDKMSビルドおよび自動インストールが失敗する事象が発生。根本原因は、カーネルヘッダのクリーンアップに伴う暗黙的な <linux/string.h> インクルードの廃止であり、C標準関数 strncpy の未定義エラー(implicit-function-declaration)がドライバソース内の複数ファイルで連鎖的に発生したことによる。
2. 環境情報
| 項目 | 詳細 |
|---|---|
| 対象ホスト | alislidelle (Ryzen 5 5500 / Tesla V100 / RTX 2070S) |
| ターゲットカーネル | 7.3.0-rc2-for-alicelidelle-zen3-build-20260913+ |
| NVIDIA ドライババージョン | nvidia-srv/580.173.02 |
| 安定稼働カーネル (フォールバック先) | 6.8.0-139-generic |
3. 事象の詳細と原因分析
3.1. 初期事象: GPIO警告の誤認
DKMSビルド失敗時の末尾ログに gpio_device_get_chip に関連する未使用変数警告(unused variable 'chip')が出力されていたため、当初は CONFIG_GPIOLIB=n による依存関係の欠如が疑われた。しかし、カーネルコンフィグ上では CONFIG_GPIOLIB=y が設定済み(No change to .config)であり、これはコンパイルを停止させる致命的エラー(Fatal Error)ではないことが判明した。
3.2. 真の要因: strncpy の未定義エラー
ビルドログ全体から error: を抽出(grep -i -C 3 "error:")した結果、以下のエラーが確認された。
nvidia/os-interface.c:732:5: error: implicit declaration of function ‘strncpy’ [-Werror=implicit-function-declaration]`
nvidia/os-interface.c:39:1: note: ‘strncpy’ is defined in header ‘<string.h>’; did you forget to ‘#include <string.h>’?
Kernel 7.3系列でのヘッダ構造の整理により、これまで暗黙的に読み込まれていた <linux/string.h> が読み込まれなくなり、NVIDIAドライバコード内の strncpy 呼び出しが未定義関数として扱われ、-Werror フラグによりビルドが停止した。
4. 適用したワークアラウンド(memcpy への直接置換)
#include <linux/string.h> をファイルの先頭に挿入する対応を試行したが、マクロ展開順序や別ヘッダへの影響により完全な解決に至らなかった。そのため、バッファが事前に memset によってゼロクリアされている安全性を担保した上で、ヘッダ依存に影響されない memcpy 関数へ直接置換するアプローチを採用した。
- 対象ファイル1: os-interface.c
- 対象ファイル2: linux_nvswitch.c
# os-interface.c の修正
sed -i 's/strncpy(buf, current->comm, len - 1);/memcpy(buf, current->comm, len - 1);/' /var/lib/dkms/nvidia-srv/580.173.02/source/nvidia/os-interface.c`
# linux_nvswitch.c の修正`
sed -i 's/strncpy(regkey_val, regkey_val_start, regkey_val_len);/memcpy(regkey_val, regkey_val_start, regkey_val_len);/' /var/lib/dkms/nvidia-srv/580.173.02/source/nvidia/linux_nvswitch.c`
※上記置換後も、linux_nvswitch.c 内の別関数(2396行目等)にて同様のエラーが散発する「モグラ叩き」状態となったため、本ドライババージョンのまま場当たり的なパッチを当てることは運用リスクが高いと判断した。
5. 最終判断とロールバック(安全化)手順
ドライバソースの広範な改修が必要となることから、現行の 580.xx ドライバと Kernel 7.3.0-rc2 の組み合わせでの運用は一時保留(フォールバック)とした。システムを安定稼働させるため、GRUBのデフォルト起動設定を旧カーネル(6.8.0-139-generic)へ固定するロールバックを実施した。
# GRUBデフォルトカーネルの固定
sudo sed -i 's/^GRUB_DEFAULT=.*/GRUB_DEFAULT="Advanced options for Ubuntu>Ubuntu, with Linux 6.8.0-139-generic"/' /etc/default/grub`
# GRUB設定の反映と再起動
sudo update-grub
sudo reboot
6. 今後の展望・推奨事項
- ドライバのアップデート待機: NVIDIA公式から Kernel 7.3 系に対応した次期バージョンのドライバがリリースされるのを待つ。
- カーネルバージョンの選定: 安定した AI エッジ/推論運用(Tesla V100 / RTX 2070Sの利用)を優先する場合、現時点では 6.x 系(6.8 〜 6.12等)の長期サポート/安定板カーネル環境を採用することを強く推奨する。
※やりたかったこと
- Kernelをnative 環境ビルド(Zen3オプティマイズビルド)したかっただけなのですが、NVIDIAのプロプライエタリドライバが牙をむきました。素直に6.xにしておきましょう、ですね。
- strncpy を memcpyで置き換えでビルドは通ったのですが、実際にちゃんと動くかというとまた別の話だとおもいますので、にわか知識でソースコード改変しまくるのはやめましょう、ですね……
では。