NVIDIA 驱动安装失败问题排查与解决(含离线 GCC 工具链安装全过程)
一、问题背景
在某台 无网络访问能力的 Ubuntu 22.04 服务器(型号为 xxxxx G5500 V7)上,尝试安装 NVIDIA 官方驱动(NVIDIA-Linux-x86_64-570.124.04.run
)时,安装过程报错,无法完成驱动安装,且 nvidia-smi
命令提示找不到。
二、问题现象
-
执行
nvidia-smi
提示命令不存在; -
执行驱动安装脚本时提示:
ERROR: Unable to load the kernel module 'nvidia.ko'. This happens most frequently when the kernel module was built against the wrong or improperly configured kernel sources
-
查看
/var/log/nvidia-installer.log
日志,发现以下关键错误:ERROR: The kernel module failed to load. Please check the output of `dmesg | grep nvidia` for more information.
ERROR: unable to find the kernel source tree for the currently running kernel.
ERROR: unable to determine the path to install the libglx.so module
-
查看
dmesg | grep nvidia
,发现如下信息:nvidia: module verification failed: signature and/or required key missing - tainting kernel. nvidia: Unknown symbol __asan_version_mismatched (err -2) nvidia: Unknown symbol __tsan_func_entry (err -2)
三、初步分析
从日志来看,驱动安装失败的主要原因集中在以下几点:
- 缺少编译工具链:驱动需要编译内核模块,但系统缺少
gcc
,g++
,make
等工具; - 缺少编译依赖库:驱动安装脚本提示找不到
libglx.so
等文件; - 内核模块加载失败:日志中出现
__asan_version_mismatched
和__tsan_func_entry
错误,表明缺少libasan8
和libtsan2
; - 系统环境不一致:早期可以正常使用
nvidia-smi
,怀疑是某次系统升级后未重建驱动模块。
四、进一步排查
1. 检查当前系统是否已安装 gcc
和 g++
gcc --version
g++ --version
输出为:
gcc (Ubuntu 11.4.0-1ubuntu1~22.04) 11.4.0
说明系统中已有 gcc
,但版本较低,且未安装 g++
。
2. 查看当前驱动安装日志
查看 /var/log/nvidia-installer.log
,发现如下关键信息:
Using: nvidia-installer ncurses user interface
-> Installing NVIDIA driver version 570.124.04.
-> Detected 128 CPUs online; setting concurrency level to 128.
-> No precompiled kernel interface was found to match your kernel; this means that the installer will need to compile a new kernel interface.
ERROR: Unable to find the kernel source tree for the currently running kernel.
提示:驱动需要编译内核模块,但系统中缺少必要的编译工具和依赖。
3. 检查系统中是否安装了 libasan
和 libtsan
ldconfig -p | grep libasan
ldconfig -p | grep libtsan
无输出,说明这两个库未安装。
五、解决方案
✅ 1. 在有网络的 Ubuntu 22.04 环境下载依赖包
在一台有网络连接的 Ubuntu 22.04 环境中,执行以下命令:
apt-get update
apt-get download cpp-12 libasan8 libtsan2 libgcc-12-dev gcc-12 libstdc++-12-dev g++-12
将所有下载的 .deb
文件打包,拷贝到目标服务器的目录中(如 ~/software_backup/gcc12/
)。
✅ 2. 在无网络服务器上安装依赖包(顺序不能乱)
sudo dpkg -i cpp-12_12.3.0-1ubuntu1~22.04_amd64.deb
sudo dpkg -i libasan8_12.3.0-1ubuntu1~22.04_amd64.deb
sudo dpkg -i libtsan2_12.3.0-1ubuntu1~22.04_amd64.deb
sudo dpkg -i libgcc-12-dev_12.3.0-1ubuntu1~22.04_amd64.deb
sudo dpkg -i gcc-12_12.3.0-1ubuntu1~22.04_amd64.deb
sudo dpkg -i libstdc++-12-dev_12.3.0-1ubuntu1~22.04_amd64.deb
sudo dpkg -i g++-12_12.3.0-1ubuntu1~22.04_amd64.deb
⚠️ 注意:如果安装失败,提示依赖缺失,请使用
dpkg -I <包名>
查看依赖关系,并手动补充安装。
✅ 3. 设置默认编译器版本(使用 update-alternatives
)
sudo update-alternatives --remove-all gcc
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-12 60 \
--slave /usr/bin/g++ g++ /usr/bin/g++-12 \
--slave /usr/bin/gcc-ar gcc-ar /usr/bin/gcc-ar-12 \
--slave /usr/bin/gcc-nm gcc-nm /usr/bin/gcc-nm-12 \
--slave /usr/bin/gcc-ranlib gcc-ranlib /usr/bin/gcc-ranlib-12
验证:
gcc --version
g++ --version
输出应为:
gcc (Ubuntu 12.3.0-1ubuntu1~22.04) 12.3.0
g++ (Ubuntu 12.3.0-1ubuntu1~22.04) 12.3.0
✅ 4. 安装 NVIDIA 驱动
进入驱动安装包所在目录,执行:
sudo ./NVIDIA-Linux-x86_64-570.124.04.run
如之前安装失败过,建议先卸载:
sudo ./NVIDIA-Linux-x86_64-570.124.04.run --uninstall || true
sudo rmmod nvidia || true
✅ 5. 验证驱动是否安装成功
nvidia-smi
输出如下内容,表示驱动安装成功:
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 570.124.04 Driver Version: 570.124.04 CUDA Version: 12.4 |
|-------------------------------+----------------------+----------------------+
| GPU Name Persistence-M| BusId Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |
|===============================+======================+======================|
| 0 NVIDIA A100 ... On | 00000000:00:04.0 Off | 0 |
| N/A 38C P0 42W / 400W | 0MiB / 40960MiB | 0% Default |
+-------------------------------+----------------------+----------------------+
六、问题总结与分析
问题点 | 原因分析 | 解决方案 |
---|---|---|
nvidia-smi 找不到 | 驱动未正确安装 | 成功安装驱动后恢复 |
驱动安装失败 | 缺少编译工具链 | 安装完整 GCC 工具链 |
__asan_version_mismatched 报错 | 缺少 libasan8 | 安装 libasan8 |
__tsan_func_entry 报错 | 缺少 libtsan2 | 安装 libtsan2 |
内核模块加载失败 | 编译环境不一致 | 设置默认 gcc/g++ 版本 |
系统升级后驱动失效 | 未重新编译驱动 | 手动重新安装驱动 |
七、扩展建议
✅ 对于运维人员的建议
- 定期检查驱动版本与内核兼容性;
- 使用
dkms
安装 NVIDIA 驱动,实现自动适配新内核; - 在无网络环境中,提前打包好依赖包;
- 编写自动化安装脚本,便于快速恢复环境;
- 保留系统日志和驱动安装日志,便于后续排查。
八、附录:完整依赖包清单(Ubuntu 22.04 x86_64)
包名 | 说明 |
---|---|
cpp-12_12.3.0-1ubuntu1~22.04_amd64.deb | C 预处理器 |
libasan8_12.3.0-1ubuntu1~22.04_amd64.deb | AddressSanitizer 库 |
libtsan2_12.3.0-1ubuntu1~22.04_amd64.deb | ThreadSanitizer 库 |
libgcc-12-dev_12.3.0-1ubuntu1~22.04_amd64.deb | GCC 支持库开发文件 |
gcc-12_12.3.0-1ubuntu1~22.04_amd64.deb | GCC C 编译器 |
libstdc++-12-dev_12.3.0-1ubuntu1~22.04_amd64.deb | C++ 标准库开发文件 |
g++-12_12.3.0-1ubuntu1~22.04_amd64.deb | GCC C++ 编译器 |