ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

CentOS/RHEL安装NVIDIA显卡驱动全指南:内核、nouveau与Secure Boot

CentOS/RHEL安装NVIDIA显卡驱动全指南:内核、nouveau与Secure Boot Linux CentOS/RedHat 下装 NVIDIA 显卡驱动这事我一直觉得是最能体现 Linux 发行版性格差异的操作。Ubuntu 上一条 ubuntu-drivers autoinstall 就能收工到了 CentOS、RHEL 这边却要自己动手处理内核头文件、禁用 nouveau、选安装方式、应付 Secure Boot一套流程下来能把人折腾到怀疑人生。但只要你理解了整个安装链路背后的逻辑掌握了排错思路这件事其实非常稳定甚至可以做到百发百中。这篇文章就来把 CentOS/RHEL 上装 NVIDIA 驱动这件事掰开揉碎讲清楚包含我这些年踩过的坑、验证过的方法以及实测下来最省心的安装与维护方案。这篇内容主要面向三类人一是刚接触服务器或工作站、需要给机器配 GPU 做训练或推理的开发者二是帮实验室、公司批量部署多台 CentOS 机器的运维同学三是手头有老黄卡又想榨干性能、被迫从 Ubuntu 转到 RHEL 系的玩家。不管你属于哪种看完这篇都能少走不少弯路。1. 安装前的准备工作搞清你在装什么1.1 为什么 CentOS/RHEL 上装 NVIDIA 比 Ubuntu 麻烦NVIDIA 官方其实提供了非常完善的 Linux 驱动支持而且对 RHEL/CentOS 是老牌亲儿子为什么大家还是觉得难装核心原因有三个首先RHEL 系列默认自带并启用了开源的nouveau驱动模块它和 NVIDIA 官方闭源驱动不能共存你必须先把它拉黑其次RHEL/CentOS 的内核版本更新策略和 Ubuntu 不同头文件、gcc 工具链的版本不一定和驱动安装器预期的一致导致编译失败最后从 RHEL 7 开始 UEFI Secure Boot 成为标配驱动要用密钥签名才能加载这一步不处理装完重启就会看到模块加载失败的提示。很多人一上来就跑到官网下载最新的.run包然后在图形界面里无脑执行安装结果各种报错。这其实不是显卡的问题而是环境没准备好。我个人的习惯是安装任何闭源驱动之前先把系统环境摸清楚包括当前内核版本、是否启用了 Secure Boot、nouveau 是否占用 GPU 等。摸底花十分钟能帮你省下后面几个小时。具体操作上进系统后依次执行以下几个命令# 查看当前内核版本 uname -r # 检查系统发行版版本号 cat /etc/redhat-release # 检查 GPU 型号是否被系统正确识别 lspci | grep -i nvidia # 检查是否已加载 nouveau 内核模块 lsmod | grep nouveau # 检查是否已安装 NVIDIA 驱动相关的包 rpm -qa | grep -i nvidia如果你发现lspci输出的 NVIDIA 显卡信息前面带有VGA compatible controller一类的字样说明系统已经识别到了这块卡至少硬件层面没问题。如果lsmod里有 nouveau说明开源的模块占着显卡后面我们要把它禁用掉再装闭源驱动否则 NVIDIA 的安装脚本会直接中断并提示冲突。如果rpm -qa里已经装了旧版驱动建议先卸载干净避免版本冲突。1.2 硬件与系统环境摸底这里说的硬件摸底不只是看显卡型号还要看机器是物理机还是虚拟机。如果是虚拟机比如 VMware 或 KVM 里做了 GPU 直通那还涉及 vGPU 或 SR-IOV 等不同方案如果是物理机需要确认显卡是通过 PCIe 直连还是经过转接卡。大多数情况下物理机 直连是最省心的。实战中我遇到过一个很容易被忽略的点部分 NVIDIA 专业卡如 Tesla 系列在服务器上可能没有任何显示输出系统把它当成计算设备而不是显示设备。你在lspci里可能看到的不是VGA compatible controller而是3D controller或Display controller。这种卡在安装驱动时参数略有不同安装完成后通常也没有图形界面输出但 nvidia-smi 能正常识别。如果你在给这类机器装驱动别等到最后一步才怀疑是驱动没装上。另一个重要信息是 BIOS 模式。老一点的 CentOS 6/7 可能还在用传统 Legacy BIOS新一些的 CentOS 8/9 和 RHEL 7.6 以上的机器基本都是 UEFI。可以通过下面方式确认# 如果有 /sys/firmware/efi 目录说明是 UEFI 模式 [ -d /sys/firmware/efi ] echo UEFI || echo Legacy # 或者看启动方式 efibootmgr 2/dev/null || echo No EFI boot manager这个信息决定了后面对 Secure Boot 的处理方式。如果你发现是 UEFI 且 Secure Boot 处于开启状态mokutil --sb-state可查看那么后面安装驱动时要么用 DKMS MOK 签名的方案要么在 BIOS 里临时关掉 Secure Boot装完驱动后再决定是否重新打开。我建议生产环境使用签名方案个人折腾可以先关闭。1.3 内核版本、头文件和 gcc 依赖NVIDIA 驱动在安装时会把内核模块编译进当前运行的内核所以系统必须有对应的内核头文件和完整编译工具链。很多人忽略这一点装到一半看到类似Unable to find the kernel source tree for the currently running kernel的报错就懵了。这其实完全是环境依赖的问题跟显卡本身一点关系都没有。以 CentOS 7 为例你需要提前装好以下基础包yum install -y gcc kernel-devel-$(uname -r) kernel-headers-$(uname -r) epel-release这里有个细节kernel-devel-$(uname -r)里用了命令替换确保安装的 devel 包版本和当前内核完全一致。有些同学图省事直接yum install kernel-devel系统可能会拉取仓库里最新内核的 devel 包而当前跑的还是旧内核版本对不上编译照样失败。所以必须带上-$(uname -r)精确指定版本。如果当前内核的 devel 包在官方仓库里已经下架了比如 CentOS 7 某些内核版本非常老这时可以去 vault.centos.org 找到对应版本的 kernel-devel 包手动安装。对于 RHEL 9 和 CentOS Stream 9包管理器是 dnf等价包名不变但可能需要启用 CRBCodeReady Builder仓库才能拿到部分编译依赖。另外gcc 版本和内核编译时的 gcc 版本不一致也可能导致问题。比如内核是用 gcc 10 编译的系统现在只有 gcc 8编译出的模块可能报version magic不匹配。遇到这种情况最直接的办法是安装多个 gcc 版本或者用CC环境变量指定编译器。不过在实践中CentOS/RHEL 官方源的 gcc 版本通常和内核匹配只要不自己安装第三方 gcc 一般不会踩雷。2. 三种主流安装方式怎么选2.1 官方 run 包最通用但最容易翻车NVIDIA 官网提供的.run安装包是跨所有发行版通用的安装器会自己检测系统环境、编译模块、配置 X。它的优势是版本最新、可控性强支持很多安装参数比如--no-opengl-files、--silent适合需要定制化安装的场景。缺点也很明显它会在运行时修改系统配置卸载、回滚不够系统化而且每次内核升级后必须手动重新安装或配合 DKMS 使用。我自己在服务器上的经验是如果只是装一块计算卡跑 CUDA.run包反而很干净因为它不依赖发行版源也不会有仓库里多出来的 20 多个依赖包。但如果你要兼顾桌面显示、双显卡切换.run包的参数就要琢磨清楚一旦选错了 OpenGL 库的位置可能直接把系统的 Mesa 库覆盖掉导致图形界面无法启动。2.2 RPMFusion 与 elrepo 源CentOS/RHEL 还有一个路线是使用第三方源安装预编译的 RPM 包。常见的是 RPMFusion 的nvidia-driver包以及 ELRepo 社区的nvidia-driver包。这些仓库把 NVIDIA 驱动打包成 RPM和系统的包管理机制无缝集成安装、卸载、更新都很方便。配合 DKMS 后内核升级会自动重建模块对 CentOS 这种更新节奏偏保守的系统来说非常省心。但 RPMFusion 也需要一些条件比如 CentOS 9 上需要先启用 EPEL 和 CRB部分包的 nvidia-driver 可能会和你系统里已有的 CUDA 版本产生冲突。用 RPMFusion 装出来的驱动版本通常比 NVIDIA 官方最新的要旧一点因为打包需要时间。如果你的目的主要是跑 PyTorch、TensorFlow 这类主流框架旧一两个版本完全没影响不建议追新。2.3 决策矩阵哪种场景用哪种方案我根据自己的经验整理了一个简单的决策表供你参考场景推荐方案理由企业服务器跑 CUDA 计算任务NVIDIA 官方.run DKMS可控性强版本明确不污染系统个人工作站需要图形界面 计算RPMFusion 的 RPM 包与桌面系统集成好卸载干净批量部署多台同配置机器.run包配合--silent 配置文件可脚本化安装完成后用 nvidia-smi 统一验证老系统如 CentOS 6 / RHEL 6官方.run老版本驱动新驱动不支持老内核官方兼容性列表最准需要最新特性和新显卡支持官方.run最新版第三方源打包有延迟需要强调的是无论选哪种方案提前备份系统或至少备份内核配置都是好习惯。服务器上如果装完驱动重启进不去有个 grub 命令行救急的能力会从容很多。3. 手把手拆解 .run 官方驱动的完整流程3.1 下载与校验我选择的是官网.run包路线原因很简单场景以计算服务器为主不需要桌面特性.run安装最直观遇到问题时排错链路最短。第一步去 NVIDIA 官方驱动下载页面根据显卡型号选择对应驱动。你可以用以下命令从命令行自动查询推荐版本# 先安装 pciutils确保 lspci 可用 yum install -y pciutils # 查询显卡设备 ID lspci -nn | grep -i nvidia得到类似10de:1e07的编码后可以在 NVIDIA 官网驱动搜索页对照查询。不过大多数情况官网首页驱动的自动检测并不是很准我更喜欢直接用型号搜比如RTX 3090 Linux x86_64在结果页点开.run下载链接复制地址后用 wget 下载到 /root 目录。cd /root wget https://us.download.nvidia.com/XFree86/Linux-x86_64/550.54.14/NVIDIA-Linux-x86_64-550.54.14.run chmod x NVIDIA-Linux-x86_64-*.run下载完成后用sha256sum和官网页面上提供的校验值比对防止文件损坏或下载不完整。这一步虽然很少有人做但我建议养成习惯尤其在内网代理或断点续传场景下损坏的安装包会出现各种莫名奇妙的报错。3.2 禁用 nouveau 和进入 runlevel 3安装 NVIDIA 官方驱动前需要做的关键操作是把开源的 nouveau 模块禁用掉否则 NVIDIA 安装脚本会直接拒绝继续。禁用的思路很简单在 grub 内核启动参数里加上nouveau.modeset0或者把 nouveau 模块加入黑名单然后重新生成 initramfs。我推荐的稳妥做法是两者同时做因为不同版本的 RHEL/CentOS 对黑名单的处理有细微差异。先写黑名单文件cat /etc/modprobe.d/blacklist-nouveau.conf EOF blacklist nouveau options nouveau modeset0 EOF然后备份并重建 initramfs。这一步在 CentOS 6 / RHEL 6 和 CentOS 7 之间命令不同# CentOS 7 / RHEL 7 及以上 mv /boot/initramfs-$(uname -r).img /boot/initramfs-$(uname -r).img.bak dracut /boot/initramfs-$(uname -r).img $(uname -r) # CentOS 6 / RHEL 6 mv /boot/initramfs-$(uname -r).img /boot/initramfs-$(uname -r).img.bak mkinitrd /boot/initramfs-$(uname -r).img $(uname -r)接着修改 grub 配置。如果你的机器是 UEFI grub2CentOS 7默认编辑/etc/default/grub找到GRUB_CMDLINE_LINUX这行在双引号里追加nouveau.modeset0 rd.driver.blacklistnouveau然后重新生成配置grub2-mkconfig -o /boot/grub2/grub.cfg # UEFI 机器用下面这行 grub2-mkconfig -o /boot/efi/EFI/centos/grub.cfg做完这些重启系统。这一步必须重启而且重启后确定 nouveau 没有加载后再继续。验证命令lsmod | grep nouveau # 空输出说明禁用成功如果重启后仍然能看到 nouveau八成是你生成的 grub.cfg 平台不对或者 UEFI 下系统实际读取的是另一个位置的 grub.cfg。排查方式用grub2-editenv list或用cat /proc/cmdline查看实际传参确认nouveau.modeset0是否真的在运行中的内核命令行里。接下来进入命令行模式安装。图形界面GNOME/KDE会占用显卡安装时容易干扰所以我一般用systemctl isolate multi-user.target直接切到字符终端或者直接在 grub 启动参数里加3进入 runlevel 3。注意用 root 登录后再进行安装不要在 SSH 会话里半吊子地安装因为安装途中网络断开或会话结束可能导致安装状态不一致。3.3 安装与安装参数说明到了关键环节执行安装脚本前请仔细看一下可用参数。很多人不查参数就执行结果装出来的东西不是自己想要的还不好清理。我平时最常用的参数组合是./NVIDIA-Linux-x86_64-*.run --silent --no-opengl-files解释一下每个参数的意义--silent让安装脚本不交互全程自动选择默认选项适合后台执行或脚本化部署--no-opengl-files表示不安装 NVIDIA 的 OpenGL 库文件这对仅需要计算功能的服务器很重要因为覆盖系统 Mesa 的 OpenGL 库很容易搞挂图形界面除非你确实需要纯 NVIDIA 驱动的 OpenGL那就去掉这个参数。如果是桌面工作站希望驱动提供完整的图形加速和 OpenGL 支持可以不用--no-opengl-files但建议先记录原系统的 Mesa 文件以便出问题时恢复。也可以先用默认参数跑一次安装器会问几个问题比如Would you like to run nvidia-xconfig?——如果你不需要自动生成 X 配置文件选 No。安装过程中如果网络状况不佳官方安装器会从网上下载预编译的模块包但大多数情况下都会选择本地编译。编译过程需要几分钟时间日志默认输出到/var/log/nvidia-installer.log。如果安装失败第一件事就是看这个日志通常最后几十行就是真正的失败原因。常见的情况包括缺少 kernel-devel、gcc 不存在、Secure Boot 拦截签名等。安装成功后会看到类似Installation of the NVIDIA Accelerated Graphics Driver for Linux-x86_64 (version: 550.54.14) is now complete.的提示。这时别急着重启先检查一下驱动的内核模块是否已经生成modinfo nvidia | head -n 5如果有输出且路径指向/lib/modules/$(uname -r)/extra/nvidia.ko.xz之类的位置说明模块编译成功。如果这里什么都没有就算安装脚本说complete也要打一个大大的问号。3.4 恢复图形界面与验证安装完成后重启系统reboot重启后如果一切正常在命令行输入nvidia-smi这回你应该能看到类似下面的输出显卡型号、驱动版本、CUDA 版本、显存占用和进程列表。能看到这张表驱动就算装上了。如果是在跑深度学习的服务器上我还会额外验证一次 CUDA 可用性python3 -c import torch; print(torch.cuda.is_available(), torch.cuda.device_count(), torch.cuda.get_device_name(0))对于桌面图形界面场景重启后能正常进入 GNOME 且分辨率正常基本就没问题。可以用glxinfo | grep -i nvidia确认 OpenGL 渲染是否走了 NVIDIA。如果桌面进不去或者黑屏别慌按 CtrlAltF2 切到字符终端先查/var/log/Xorg.0.log中的(EE)错误行再决定是重新调整 X 配置还是卸载驱动回退。这里补充一个我常用的验证技巧通过nvidia-smi -q -d PERFORMANCE查看显卡电源状态和时钟频率判断驱动是否正确给显卡解除了限制。如果安装前 GPU 被 nouveau 占用性能表现很惨装好闭源驱动后满载频率才能跑上去。4. 稳如老狗的运维配置4.1 DKMS 与内核升级服务器不可能永远不升级内核。CentOS 的生命周期里安全更新是必须的而内核一更新NVIDIA 驱动模块就得重新编译。如果你用的是.run方式安装且没配 DKMS那么内核升级后必须手动重新执行一遍安装脚本用--dkms参数可帮你在未来内核升级时自动重建模块。我强烈建议你在安装时直接启用 DKMS./NVIDIA-Linux-x86_64-*.run --silent --dkms如果当初没用 DKMS也可以事后手动安装 DKMS 并重新跑一次安装命令。装好 DKMS 后系统里会多出/var/lib/dkms/nvidia/目录内核升级后 DKMS 会自动为新内核编译驱动模块省心很多。但要注意启用 DKMS 后每次内核大版本变化比如从 5.14 升级到 6.1可能需要重新安装匹配的 kernel-devel 和 kernel-headers否则 DKMS 编译时找不到头文件照样失败。你可以在/var/lib/dkms/nvidia/下的 build 日志里看到具体报错。4.2 CUDA 与 nvidia-smi 等驱动装好后nvidia-smi 是日常最常用的工具。几个实用命令我列一下# 实时查看 GPU 状态类似 top nvidia-smi dmon # 每 2 秒刷新一次显存和利用率 watch -n 2 nvidia-smi # 设置显卡持久化模式避免每次访问都重新初始化 nvidia-smi -pm 1 # 设置显卡锁定在最高性能模式计算场景常用 nvidia-smi -lgc 1590关于持久化模式Persistence Mode我特别想强调一下。服务器上如果只做训练不设置的话每访问一次 GPU 都要重新唤醒会增加几百毫秒延迟并可能影响并发效率设置成 1 后驱动会常驻。不过在某些多显卡或有 MIG 场景持久化模式可能和一些虚拟化方案冲突需要根据具体场景取舍。在安装 CUDA 工具包时需要注意版本匹配。NVIDIA 驱动是向下兼容的比如 550 版本的驱动可以支持 CUDA 12.4 及更早版本。你可以下载对应版本的 cuda-toolkit 安装或者用 pip 直接装 PyTorch 这种自带 CUDA runtime 的框架后者更省事装的不是完整 CUDA 工具链但对大多数推理和训练任务已经够用。4.3 开机自启与显卡切换对双显卡笔记本如果是装了 CentOS/RHEL 的笔记本电脑特别是 NVIDIA Optimus 双显卡机型情况会更复杂。安装驱动后默认可能会直接用独显输出电池续航大幅下降或者默认用核显独显不工作。这部分我单独讲一下。在 RHEL 系上没有像 Ubuntu 的 prime-select 这样开箱即用的切换工具但可以手动通过 X 配置文件指定显卡。简单场景下如果你的笔记本支持在 BIOS 里切换独立显卡模式直接切到独显模式后用.run安装反而最省事如果必须在双显卡环境下跑我建议使用 NVIDIA 的 PRIME Render Offload。Xorg 配置文件里需要加入类似这样的段Section Device Identifier Device0 Driver nvidia VendorName NVIDIA Corporation BusID PCI:1:0:0 Option AllowEmptyInitialConfiguration true EndSectionBusID需要替换成你lspci | grep -i nvidia看到的实际 PCI 地址。这个操作比较依赖具体机器我的经验是不要期待一次成功多试几次不同的 BusID 和 Option配合 Xorg.0.log 排查。5. 常见故障排查装完驱动后的 4 个经典坑5.1 开机黑屏或分辨率异常这是新手最容易遇到的情况。装完驱动重启登录界面卡死或黑屏最常见的元凶是 Xorg 配置或 nouveau 没有被彻底禁用。排查步骤# 在 grub 菜单按 e 进入编辑在 linux 行末尾加一个空格和 3进入文本模式 # 或者启动后按 CtrlAltF2 或 F3 进入 tty进入文本模式后先确认驱动模块状态lsmod | grep nvidia dmesg | grep -i nvidia如果模块已加载但黑屏多半是 Xorg 配置问题。备份当前的 xorg.conf然后用 nvidia-xconfig 重新生成mv /etc/X11/xorg.conf /etc/X11/xorg.conf.bak nvidia-xconfig如果模块都没加载dmesg里有No such device或权限报错重点排查是否被 Secure Boot 拦截。此时建议先去 BIOS 关掉 Secure Boot或者按第 5.2 节的方法用 MOK 工具签名模块。分辨率异常比如只有 1024x768通常和驱动无关更多出现在显示器 EDID 识别问题上。可以尝试在 xorg.conf 里手动指定HorizSync和VertRefresh范围也可以检查线材和接口是否接在主板上核显而不是独显上——这种乌龙我见过太多次独显驱动装好了显示器却插在主板 HDMI 上导致系统看到的输出来自核显。5.2 模块签名与 Secure Boot 问题UEFI Secure Boot 环境下内核只加载有有效签名的模块。NVIDIA 官方.run安装器无法直接生成被 Secure Boot 信任的模块签名所以安装后重启会看到类似这样的报错NVRM: The NVIDIA probe function was not called for one or more devices NVRM: This can occur when a driver such as nouveau is already registered实际上更直接的是dmesg中会有Lockdown: insmod: unsigned module loading is restricted的提示。解决办法有两种。第一种简单粗暴去 BIOS 关闭 Secure Boot。大多数开发机和服务器可以这么做但一些企业安全策略要求必须开启。第二种规范做法使用 DKMS MOK 签名。流程如下# 安装 mokutil 和 dkms yum install -y mokutil dkms # 通过 DKMS 构建模块假设驱动已经安装 dkms add -m nvidia -v 版本号 dkms build -m nvidia -v 版本号 dkms install -m nvidia -v 版本号 # 为内核模块创建签名密钥 mokutil --generate-key # 按照提示创建密码重启系统后会进入 MOK 管理界面选择 Enroll key输入刚才设置的密码把新生成的公钥加入信任列表。再重启后模块就有签名了。步骤并不复杂但操作时机要留意最好在安装驱动之前就搞掂密钥否则驱动模块编译完还要再签一次名来回折腾。5.3 nvidia-smi 报错 NVIDIA-SMI has failed because it couldnt communicate with the NVIDIA driver这条报错在论坛和群里被问得最多。它的直接含义是 nvidia-smi 工具存在但内核模块没有生效。可能的原因有很多我按出现频率排序驱动内核模块根本没有安装成功——modinfo nvidia返回空模块已安装但加载失败——dmesg | grep -i nvidia里有Module is signed with invalid key或Unknown symbol模块被加载但和当前内核版本不匹配——比如用 DKMS 安装后内核升级但没重新构建多个驱动版本残留新旧模块冲突——lsmod | grep nvidia能同时看到 nvidia_uvm、nvidia_drm、nvidia_modeset 多个模块且版本混乱。排查时我一般按这个顺序执行# 1. 查看当前内核 uname -r # 2. 查看模块是否已加载 lsmod | grep nvidia # 3. 尝试手动加载模块看报错 modprobe nvidia # 4. 查看内核消息 dmesg | tail -50解决措施通常是对症下药如果是模块未加载用modprobe nvidia测试确认没问题再echo nvidia /etc/modules-load.d/nvidia.conf设置开机加载如果是签名问题按第 5.2 节处理如果版本混乱最彻底的办法是卸载全部 NVIDIA 相关文件后重新安装一次干净驱动。卸载.run安装的驱动可以用./NVIDIA-Linux-x86_64-*.run --uninstall或者直接用 nvidia-uninstall 命令。卸载完记得再执行一遍dracut -f重建 initramfs把可能在旧 initramfs 里残留的 nvidia 库文件清理掉。5.4 驱动装好后 CPU 占用高或 GPU 利用率上不去驱动能识别、nvidia-smi 也正常但训练时 GPU 利用率只有 30%~50% 甚至更低。这种问题原因不在驱动安装本身但装完驱动后大家第一个怀疑的就是驱动所以我也列进来。首先检查显卡是否工作在正确的带宽模式上用lspci -vvv | grep -i LnkCap\|LnkSta查看 PCIe 链路状态如果是LnkSta: Speed 2.5GT/s, Width x1这类低配状态说明板卡没有跑在应有的 PCIe 带宽上可能是插槽选错了、转接线有问题或者 PCIe 链路降级了。物理机常见坑是插在了 x16 物理槽位但实际走的是 x4 带宽专卡小数据量的任务感知不明显大数据传输时差距巨大。其次是检查 CUDA 环境是否正确加载python3 -c import torch; print(torch.cuda.get_device_properties(0))。如果显示总内存和频率正常但利用率上不去问题大概率在数据加载管线和 CPU 瓶颈上跟驱动无关。这种场景建议用nvidia-smi dmon配合 CPU 监控一起看别被 GPU 驱动背了锅。6. 安装过程中的其他注意事项6.1 做一次快照或备份无论用哪种方式装驱动我都会在安装前给系统做一次可回滚的快照虚拟机直接打快照物理机至少备份 /boot 分区、/etc/X11、/etc/modprobe.d 和 grub 配置。驱动安装本质上是给内核打补丁而内核模块一旦加载失败最轻的症状是开机报错最重的情况是启动卡死或者直接 kernel panic。有回滚点才能大胆操作。物理机没有快照的话最少也要把原 initramfs 文件的备份保留好例如前面把 initramfs-$(uname -r).img 重命名为 .bak这就是一条生命线。万一新生成的 initramfs 有问题你可以进入 rescue 模式把它改回来。6.2 安装参数梳理为方便参考我把.run安装器的常用参数整理成表参数功能适用场景--silent静默安装不提问脚本化、批量部署--no-opengl-files不安装 OpenGL 库纯计算服务器--dkms启用 DKMS 模块管理需要经常升级内核--no-cc-version-check跳过 gcc 版本检查内核和 gcc 版本不一致时应急--no-nouveau-check跳过 nouveau 检查确认模块已不占用时使用--no-x-check跳过 X server 检查在图形界面下强制安装不建议--uninstall卸载已安装驱动清理或回退版本--uinone无界面模式老系统或纯命令行如果你因为 gcc 版本问题被迫使用--no-cc-version-check请记住这只是临时规避编译出来的模块可能面临version magic问题。能用 DKMS 或安装匹配编译器解决的尽量不用这个参数。6.3 安装过程中的日志与纪律最后说一个经常被忽略的软经验安装过程中保持操作记录。我在每次装驱动时都会开一个 session 日志script 命令把安装输出完整保存下来。出问题时日志就是推理的依据。另外尽量一次只做一个变更不要装驱动的同时去更新内核、升级 gcc 或调整 grub把变量减少到最小排错就会快得多。结尾一点个人心得装 NVIDIA 驱动这个事做得多了你就会发现它真正考验的不是命令敲得溜不溜而是你有没有耐心把环境搞清楚。我在 CentOS 7 和 RHEL 8 上各踩过一轮坑之后现在养成了一套固定动作先查内核版本、查 Secure Boot、查 nouveau 占用然后禁用 nouveau、重建 initramfs、重启、切到命令行、安装、再重启、验证。这套流程走下来成功率基本是百分之百。最后再分享一个小技巧如果你同时管理多台机器建议把驱动安装包和对应的校验值提前下载好放在内网仓库批量部署时用脚本统一安装。CentOS 7 的机器跑老版本驱动、CentOS 9 的机器跑新版本把版本和参数固化到脚本里就不会出现这台装得上一台装不上的玄学问题。毕竟Linux 下只要环境一致结果就应该是一致的——如果结果不一致说明环境里还有你没发现的变量那也正是排查的乐趣所在。
返回列表