当前位置: 首页 > java >正文

NVIDIA 驱动安装失败问题排查与解决(含离线 GCC 工具链安装全过程)

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)
    

三、初步分析

从日志来看,驱动安装失败的主要原因集中在以下几点:

  1. 缺少编译工具链:驱动需要编译内核模块,但系统缺少 gcc, g++, make 等工具;
  2. 缺少编译依赖库:驱动安装脚本提示找不到 libglx.so 等文件;
  3. 内核模块加载失败:日志中出现 __asan_version_mismatched__tsan_func_entry 错误,表明缺少 libasan8libtsan2
  4. 系统环境不一致:早期可以正常使用 nvidia-smi,怀疑是某次系统升级后未重建驱动模块。

四、进一步排查

1. 检查当前系统是否已安装 gccg++

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. 检查系统中是否安装了 libasanlibtsan

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 gccsudo 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++ 版本
系统升级后驱动失效未重新编译驱动手动重新安装驱动

七、扩展建议

✅ 对于运维人员的建议

  1. 定期检查驱动版本与内核兼容性
  2. 使用 dkms 安装 NVIDIA 驱动,实现自动适配新内核;
  3. 在无网络环境中,提前打包好依赖包
  4. 编写自动化安装脚本,便于快速恢复环境;
  5. 保留系统日志和驱动安装日志,便于后续排查。

八、附录:完整依赖包清单(Ubuntu 22.04 x86_64)

包名说明
cpp-12_12.3.0-1ubuntu1~22.04_amd64.debC 预处理器
libasan8_12.3.0-1ubuntu1~22.04_amd64.debAddressSanitizer 库
libtsan2_12.3.0-1ubuntu1~22.04_amd64.debThreadSanitizer 库
libgcc-12-dev_12.3.0-1ubuntu1~22.04_amd64.debGCC 支持库开发文件
gcc-12_12.3.0-1ubuntu1~22.04_amd64.debGCC C 编译器
libstdc++-12-dev_12.3.0-1ubuntu1~22.04_amd64.debC++ 标准库开发文件
g++-12_12.3.0-1ubuntu1~22.04_amd64.debGCC C++ 编译器
http://www.xdnf.cn/news/15623.html

相关文章:

  • 如何防止GitHub上的敏感信息被泄漏?
  • Visual Studio C++编译器优化等级详解:配置、原理与编码实践
  • imx6ull UI开发
  • 20250718-1-Kubernetes 应用程序生命周期管理-应用部署、升级、弹性_笔记
  • 短视频矩阵的时代结束了吗?
  • 【推理的思想】程序正确性证明(一):演绎推理基础知识
  • 网络编程(modbus,3握4挥)
  • 代码随想录算法训练营第二十四天
  • 包管理工具npm cnpm yarn的使用
  • 【47】MFC入门到精通——MFC编辑框 按回车键 程序闪退问题 ,关闭 ESC程序退出 问题
  • LVS集群
  • Python编程进阶知识之第二课学习网络爬虫(requests)
  • java-字符串和集合
  • JAVA中的Map集合
  • wireshark的常用用法
  • c#笔记之方法的形参列表以及方法重载
  • 测试学习之——Pytest Day3
  • 支付宝智能助理用户会话实时统计:Flink定时器与状态管理实战解析
  • Adam优化器
  • IMU噪声模型
  • 【数据结构】链表(linked list)
  • PostgreSQL 中的 pg_trgm 扩展详解
  • 命名实体识别15年研究全景:从规则到机器学习的演进(1991-2006)
  • Python 基础语法与数据类型(十三) - 实例方法、类方法、静态方法
  • SAP-ABAP:SAP的‘cl_http_utility=>escape_url‘对URL进行安全编码方法详解
  • Linux Swap区深度解析:为何禁用?何时需要?
  • 【程序地址空间】虚拟地址与页表转化
  • 基于Rust游戏引擎实践(Game)
  • 线上项目https看不了http的图片解决
  • 在分布式系统中,如何保证缓存与数据库的数据一致性?