尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

CentOS 7.9安装NVIDIA显卡驱动:从内核兼容到Nouveau禁用全流程

CentOS 7.9安装NVIDIA显卡驱动:从内核兼容到Nouveau禁用全流程 1. 为什么在 CentOS 7.9 上装NVIDIA显卡驱动会这么折腾先弄明白它的兼容性逻辑我猜你多半不是闲得没事拿生产服务器折腾显卡而是搞AI推理、跑深度学习、做视频硬编解码或者至少是打算让CUDA生态在这台机器上真正工作起来。CentOS 7.9在服务器领域的覆盖面太广了不少存量业务还稳稳跑在上面所以“CentOS 7.9 安装NVIDIA显卡驱动”这个问题几乎每隔一段时间就会有人重新问一遍。先说一句大实话这个系统装NVIDIA驱动的难度比Ubuntu要高半个档次。原因倒不复杂——CentOS 7.9的内核停留在3.10.x这个内核版本太老了而NVIDIA官方驱动迭代得非常快新驱动对老内核的兼容性并不总是那么完美。你会发现同样一张显卡在Ubuntu 22.04上装驱动可能一条命令就完事在CentOS 7.9上却会碰到内核模块编译失败、nouveau驱动干扰、源码包和内核头文件版本对不上等等一系列问题。所以这篇东西不会只丢给你一句“去官网下载.run文件然后运行”而是把整个安装链路拆开讲清楚包括前置判断、环境准备、Nouveau屏蔽、安装参数、报错排查以及装完之后如何长期维护。这样你即使换一张卡、换一个驱动版本也能自己推演出来该怎么办。1.1 一切问题的根源EL7内核与显卡驱动更新之间的“错位”CentOS 7.9属于RHEL 7系内核主线是3.10.0-1160这是Red Hat长期维护的内核分支。NVIDIA官方驱动在发布时会针对主流发行版做预编译支持但CentOS 7.9不在那个“主流”列表里所以多数情况下驱动是以源码包的形式安装安装时动态编译内核模块nvidia.ko和nouveau的替代模块。这带来两个直接后果。第一你机器上必须有完整的编译工具链包括gcc、make、kernel-devel、kernel-headers而且kernel-devel的版本必须和你当前运行的内核版本完全一致。版本对不上编译出来的模块根本加载不进去系统会直接报Invalid module format。第二NVIDIA驱动的版本选择非常讲究。太新的驱动分支比如最新的生产分支往往在编译阶段就对内核版本、GCC版本有更高要求放在CentOS 7.9的老内核上可能要打补丁或者直接编译失败。太老的驱动分支又不支持新出的显卡。你需要找到一个“显卡型号 内核版本 驱动版本”的交叉点这个交叉点通常不一定是官网默认推荐的那个版本。1.2 先确认自己的显卡型号和驱动分支别急着下载很多人一上来就跑到NVIDIA官网搜索驱动下载输入显卡型号下载一个最新版然后安装接着报错再到处找解决办法。这是典型的“用手干活不用脑干活”。正确姿势是先在系统里确认显卡型号用这条命令lspci | grep -i nvidia输出里会显示类似NVIDIA Corporation GA102 [GeForce RTX 3080]这样的信息。记住完整的设备ID和显卡型号去NVIDIA官网驱动搜索页对照。如果没有lspci先安装yum install -y pciutils确定显卡型号之后再判断驱动分支。NVIDIA Linux驱动的命名逻辑大概是这样的Tesla分支主要面向数据中心、计算卡比如Tesla T4、A100、V100强调长期稳定。Data Center Driver分支就是Telsa驱动的新叫法适合纯计算场景。GeForce分支面向消费级显卡比如RTX 30系、40系也包含CUDA支持。Quadro/NVIDIA RTX分支面向专业图形卡。如果你拿一张GeForce显卡去做深度学习装GeForce分支驱动完全没问题但如果你拿的是Tesla卡就不要装GeForce分支。反过来也成立。1.3 明确需求你安装驱动是为了什么这里要插一句判断逻辑你到底需不需要装完整驱动如果你的场景只是跑CUDA程序那么通常只需要nvidia-driver和CUDA Toolkit如果你还要用OpenGL硬件加速、X11显示输出甚至做3D渲染那么还需要考虑OpenGL库和Xorg的配合。这个问题的意义在于它决定了你安装时的命令行参数。比如服务器上只有一块计算卡根本没有接显示器那么装驱动时可以考虑用--no-opengl-files跳过OpenGL相关文件——倒不是省那点空间而是减少OpenGL库覆盖系统自带库带来的风险。很多老教程会建议加--no-opengl-files但在某些桌面应用场景下这会导致OpenGL渲染失败所以一定要根据需求来不要照搬。2. 动手前的环境准备内核、编译工具、残留旧驱动一环都不能漏这一节其实就是网上各种“NVIDIA安装教程”里最容易被忽略的部分也是大多数人翻车的起点。我见过太多人直接下载.run文件就开始跑结果编译阶段报一堆错又回去补环境来回折腾。2.1 查看当前内核版本和发行版信息先确认系统基本状态cat /etc/redhat-release uname -r正常情况下你看到的是类似CentOS Linux release 7.9.2009 (Core)以及3.10.0-1160.el7.x86_64这样的输出。把这个内核版本记下来备用。接着安装必要的基础工具一条命令带上yum install -y gcc make kernel-devel kernel-headers epel-release dkms这里有两个非常容易踩的坑。第一kernel-devel装出来的版本可能和当前运行内核不一致。CentOS 7.9的Yum源里有个默认的内核版本但你系统启动的可能是后来yum update升上去的新内核。用下面的命令查一下rpm -qa | grep kernel-devel rpm -qa | grep kernel-headers如果版本号和uname -r对不上你需要手动指定版本安装yum install -y kernel-devel-$(uname -r) kernel-headers-$(uname -r)第二dkms这个包在CentOS 7.9上通常需要先启用EPEL源才装得上。如果你在公司内网环境不方便开EPELGCC和make在系统自带源里就有但dkms可能要自己想办法或者放弃dkms、改用NVIDIA安装脚本自带的模块管理机制。2.2 准备编译环境和DKMSDKMS是什么我简单解释一下。NVIDIA驱动安装时会把内核模块编译好直接塞进/lib/modules/$(uname -r)/kernel/drivers/video/nvidia/。这样做的缺点是一旦你更新内核模块文件就和新内核不匹配了必须重新编译驱动安装。DKMS的作用相当于给内核模块加了个“自动重建”机制。每次内核更新DKMS会检测到新内核并自动用当前内核头文件重新编译NVIDIA模块。在服务器这种需要长期稳定运行的场景里装了DKMS能省掉大量后期维护成本。不过注意一个细节CentOS 7.9默认的yum update可能会把内核从3.10.0-1160升级到3.10.0-1160.el7.x86_64的新补丁版本如果装了DKMS重启后一般能自动把nvidia.ko重新编译好。如果不装DKMS每次内核更新后你都得手动重跑一遍安装脚本很烦。2.3 处理历史上可能残留的NVIDIA驱动如果这台机器以前装过NVIDIA驱动或者你之前手动装过一半没装完千万别直接覆盖安装。残留的旧模块、旧的Xorg配置和冲突的库文件会让新驱动安装时产生一些莫名其妙的问题。先把旧的痕迹扫一遍find /lib/modules -name *nvidia* -type f如果有输出说明老模块还留在系统里。最稳妥的办法是先用NVIDIA卸载脚本或yum remove把旧驱动清一遍。如果你是那种.run安装的可以进入.run文件目录执行sh NVIDIA-Linux-x86_64-xxx.xx.run --uninstall如果是yum之前装过别的显卡相关包也一起清掉yum remove -y *nvidia*清完之后重启一次避免残留的内核模块还在内存里。2.4 安全启动状态下需要提前做的判断CentOS 7.9默认可能开启Secure Boot尤其是一些大厂品牌机的预装系统。如果开了Secure BootNVIDIA内核模块由于没有经过签名内核会拒绝加载安装完驱动后重启你会直接进不了图形界面或者nvidia-smi报Failed to initialize NVML: Driver/library version mismatch。判断是否开启了Secure Boot可以用mokutil --sb-state如果输出SecureBoot enabled那你接下来有两种选择要么进BIOS关掉Secure Boot要么在安装驱动后注册MOKMachine Owner Key。对于服务器场景绝大多数人选择直接关掉Secure Boot因为关掉它影响不大而且省事。如果出于安全合规要求必须开着那在第一次重启机器时会出现蓝色MOK管理界面需要按提示选“Enroll MOK”输入你设置的密钥密码确认后再重启。这个流程不复杂但第一次遇到容易懵后面会专门讲。3. 下载适配的NVIDIA驱动文件选版本、校验、放到本地环境准备好之后才轮到“下载驱动”这步。3.1 官方驱动搜索页怎么用NVIDIA官方驱动下载页面支持按产品类型、系列、操作系统筛选。操作系统选择Linux 64-bit产品系列根据你的显卡选对应的系列。关键是不要无脑选“最新生产版本”要注意看驱动发布说明里标注的支持内核范围。根据我的经验在CentOS 7.9上很多用户最终选择的驱动版本集中在470系、535系和550系。470系是最后支持部分老显卡的分支535系在兼容性和性能之间比较均衡550系则对较新显卡支持更好。如果你拿不准可以先用nvidia-detect这类工具辅助判断yum install -y nvidia-detect nvidia-detect它会读你显卡的设备ID然后推荐一个驱动版本包。虽然这个工具主要服务于ELRepo源的方式但给出的版本参考价值很高。3.2 下载后的完整性校验NVIDIA官方下载页面同时提供SHA256校验码下载完驱动后务必校验不要跳过。这一步不是防病毒而是怕你下载了损坏的安装包导致后面安装到一半出怪问题。sha256sum NVIDIA-Linux-x86_64-535.154.05.run把输出值和官网给出的哈希值比对一致再继续。不一致就重新下载。另外建议把.run文件放在/root或者/tmp下并且给执行权限chmod x NVIDIA-Linux-x86_64-535.154.05.run注意最好不要把.run文件放在挂载了noexec选项的分区上否则你执行时会直接报Permission denied。3.3 值得记住的几个关键安装参数NVIDIA官方的.run安装脚本支持一系列参数这里罗列一下最常用的后面会用到--no-opengl-files不安装OpenGL相关文件。--no-x-check安装时不检测X Server是否在运行。--no-nouveau-check安装时不检测Nouveau驱动是否已加载。--dkms启用DKMS管理内核模块。-s静默安装无交互提示适合脚本化部署。--silent等同于-s。--no-kernel-module只安装用户态文件不编译内核模块一般用不上。看到这些参数你就明白真正的安装过程是有很多交互提示的这也是为什么很多人装到一半卡住。在线下手动安装时我喜欢这样组合使用sh NVIDIA-Linux-x86_64-535.154.05.run --dkms --no-questions --uinone--no-questions是跳过所有问题提示--uinone是不显示图形界面直接走命令行交互。这样装出来的驱动很干净不容易在交互环节出岔子。4. 停用Nouveau开源驱动所有安装步骤里最容易被跳过的一步如果你问那些“NVIDIA驱动安装失败”日志里最常出现的特征ERROR: The Nouveau kernel driver is currently in use by your system绝对排第一。Nouveau是Linux内核自带的NVIDIA显卡开源驱动虽然性能不咋地但它是默认加载的。4.1 为什么要停用NouveauNVIDIA官方驱动和Nouveau驱动的内核模块名称都有nvidia字样两者互不兼容。如果在Nouveau已经加载的情况下强行安装NVIDIA官方驱动最常见的后果是安装时提示Uninstall Nouveau但你选择忽略继续装完之后重启系统加载新驱动时和Nouveau打架直接导致无法进入图形界面、nvidia-smi不工作。正确的流程是在安装NVIDIA驱动之前先把Nouveau彻底禁用掉重启确认Nouveau没有加载然后才去安装。4.2 通过GRUB参数停用Nouveau第一步编辑GRUB配置文件vi /etc/default/grub找到GRUB_CMDLINE_LINUX那一行在双引号内追加以下参数rd.driver.blacklistnouveau nouveau.modeset0rd.driver.blacklistnouveau是让内核在启动早期阶段就把Nouveau拉进黑名单nouveau.modeset0是禁用Nouveau的内核模式设置。之所以两个一起加是为了覆盖不同类型的加载路径。然后重新生成GRUB配置grub2-mkconfig -o /boot/grub2/grub.cfg如果你是UEFI引导的机器可能还需要grub2-mkconfig -o /boot/efi/EFI/centos/grub.cfg具体路径要看你的引导方式可以用ls /boot/efi/EFI/确认一下。4.3 通过modprobe配置再加一道保险光改GRUB有时还不够特别是在某些deployment镜像里Nouveau可能被内置到initramfs里启动的时候依然会被加载。所以还要再建一个黑名单配置vi /etc/modprobe.d/blacklist-nouveau.conf写入两行blacklist nouveau options nouveau modeset0这样一层GRUB参数、一层modprobe配置双保险能拦住绝大多数情况下的Nouveau加载。4.4 重建initramfs并确认Nouveau已失效修改完配置之后必须重建initramfs否则当前内核的initramfs里可能还包含nouveau模块mv /boot/initramfs-$(uname -r).img /boot/initramfs-$(uname -r).img.bak dracut /boot/initramfs-$(uname -r).img $(uname -r)dracut会基于当前内核重新生成initramfs在这个过程中它会读取/etc/modprobe.d/blacklist-nouveau.conf把Nouveau排除在外。然后重启reboot重启以后用下面命令确认Nouveau是否真的没了lsmod | grep nouveau没有任何输出说明黑名单生效。另外可以顺便看一眼lsmod | grep nvidia如果你以前装过NVIDIA驱动这里会看到nvidia相关的模块如果之前没装过那就干干净净准备进入新驱动安装环节。这一步搞定之前先别急着下一步。很多人看到这里觉得啰嗦直接跳过后面大概率哭着回来。5. 运行NVIDIA官方安装程序交互流程与踩坑此时系统已经处于“裸奔”状态Nouveau已禁用内核模块目录里没有nvidia残留编译工具齐全内核头文件版本匹配。接下来就是真正安装驱动。5.1 关闭图形环境如果这台机器当前跑着图形界面必须先进入多用户模式把X Server停掉systemctl get-default如果输出是graphical.target改成命令行模式systemctl set-default multi-user.target reboot有人可能会说“我装的时候可以不重启直接停X”但我的建议是直接用多用户模式重启干净。因为很多显示管理器会在后台自动拉起X Server你以为停了实际上进程还挂着安装脚本的--no-x-check虽然能跳过检测但安装完测试时还是会出问题。5.2 安装过程中会遇到什么进入命令行模式后登录root账户或者用sudo注意NVIDIA安装脚本要求root权限进入.run文件所在目录执行sh NVIDIA-Linux-x86_64-535.154.05.run --dkms安装脚本会做几件事检查内核头文件、检测编译器版本、检测Nouveau驱动、解压驱动文件、编译内核模块、复制用户态文件、配置Xorg。这个过程通常需要几分钟取决于机器性能和内核编译开销。正常情况下你会看到类似这样的输出Installing NVIDIA Accelerated Graphics Driver for Linux-x86_64 535.154.05 ... Installing kernel module, please wait...然后就结束了。这里有一个容易让人慌的提示安装快结束时脚本会问你是否要运行nvidia-xconfig来更新Xorg配置。对于服务器场景我一般选No因为不接显示器不需要更新Xorg配置即便要接显示器很多现代桌面环境会自动识别NVIDIA驱动不一定需要手动生成配置。还有一次安装脚本问我“Would you like to register the kernel module sources with DKMS? This will allow DKMS to automatically build a new module, if you install a different kernel later.”——因为我加了--dkms参数它会直接默认注册但如果你手动安装时没加--dkms启动脚本会蹦出这个交互问题要确保你选Yes。安装完成后先不急着重启这时可以先手动加载内核模块测试一下modprobe nvidia如果这条命令没有任何输出说明模块编译成功且能正常加载。如果有报错比如Required key not available说明Secure Boot的坑还是踩上了回到之前说的MOK注册流程。确认模块加载成功之后再reboot。5.3 安装完成后的快速验证重启回来验证手段分三层。第一层确认内核模块已经加载lsmod | grep nvidia第二层确认显卡设备节点已经创建ls -l /dev/nvidia*正常情况下你会看到/dev/nvidia0、/dev/nvidiactl和/dev/nvidia-uvm这几个设备文件。没有这些文件说明内核模块虽然编译了但没被正确加载。第三层也是最重要的验证nvidia-smi如果输出类似下面这样的表格说明驱动已经正常工作----------------------------------------------------------------------------- | NVIDIA-SMI 535.154.05 Driver Version: 535.154.05 CUDA Version: 12.2 | |---------------------------------------------------------------------------看到Driver Version和CUDA Version这块显卡在CentOS 7.9上的安装就算大功告成。6. 安装过程中最常见报错排查从日志到解决方案这部分是重头戏。即使你按部就班走了上面的流程还是会因为各种环境差异遇到报错。下面几类是我在实操中见过最多的情况分别拆开讲。6.1 “nvidia-smi has failed because it couldnt communicate with the nvidia driver”这个报错几乎可以称为“NVIDIA驱动安装失败的第一大症状”。它本身不是根因而是结果的体现。出现这个报错说明nvidia-smi工具能执行但和内核模块通信失败。排查顺序如下第一步看模块是否加载lsmod | grep nvidia如果没有输出说明模块根本没加载。那就手动加载试试modprobe nvidia如果modprobe报错比如Required key not available基本可以确定是Secure Boot问题如果报错Unknown symbol in module多半是内核头文件版本和当前内核匹配有问题。第二步看消息日志journalctl -k | grep nvidia tail -n 100 /var/log/messages dmesg | grep -i nvidia重点找类似NVRM: failed to copy vbios to system memory、NVRM: unable to load the driver、nvidia.ko: disagrees about version of symbol module_layout这样的关键行。第三类我最见得多disagrees about version of symbol module_layout。它的意思是编译nvidia.ko时用的内核源码版本和当前运行内核版本不一致。虽然uname -r看起来一样但内核源码的编译配置可能不同比如kernel-devel装的不是当前内核对应的包。解决办法不是重新下载驱动而是检查kernel-develrpm -V kernel-devel-$(uname -r)如果它报缺失文件大概率是内核头文件没装全重装一遍就行。6.2 内核模块编译失败的常见原因编译失败时的报错五花八门常见的有unable to find kernel headersconftest: errorfatal error: openssl/opensslv.h: No such file or directoryGCC version mismatch先说找不到内核头文件。NVIDIA安装脚本会从/usr/src/linux-$(uname -r)或者/lib/modules/$(uname -r)/build目录找内核头文件。如果这个目录是个断掉的符号链接或者指向不存在的路径就会报这个错。检查一下ls -l /lib/modules/$(uname -r)/build如果输出类似/lib/modules/3.10.0-1160.el7.x86_64/build - /usr/src/kernels/3.10.0-1160.el7.x86_64看右边路径是否存在。不存在就重装kernel-devel。再说GCC版本问题。CentOS 7.9系统自带GCC 4.8.5这个版本也能编译NVIDIA模块但如果你系统里装了devtoolset里更新版本的GCC并且环境变量CC指向了新版GCC那编译时可能产生和内核实际编译所用GCC版本不匹配的问题。解决方法是统一编译器版本yum install -y gcc export CC/usr/bin/gcc然后重跑安装脚本。6.3 DKMS让我从“重装恐惧症”里解脱前面反复强调DKMS这里说一个具体场景。假设你安装了NVIDIA驱动后某天yum update把内核从3.10.0-1160.90.1更新到了3.10.0-1160.95.1。重启后发现nvidia-smi报驱动找不到如果你没装DKMS这时候就要去翻之前下载的.run文件重新跑一遍安装。装了DKMS的话重启后DKMS会自动检测到新内核自动调用NVIDIA的编译脚本重新生成模块。整个过程不需要你干预。看它有没有生效可以查dkms status正常会显示类似nvidia/535.154.05, 3.10.0-1160.95.1.el7.x86_64, x86_64: installed这样的信息。所以我的建议是在CentOS 7.9上安装驱动时能用DKMS就一定用DKMS。如果你装的时候忘了加--dkms其实还有补救办法sh NVIDIA-Linux-x86_64-535.154.05.run --dkms再次运行安装脚本时它会把老模块卸载再重新以DKMS方式注册。6.4 无论如何都进不了系统的应变方案假设你在安装过程中把系统搞到起不来最常见的是启动时卡在登录界面或者直接黑屏。这是因为NVIDIA驱动加载失败而X Server初始化崩溃。我的常规恢复流程是开机进GRUB菜单时按e编辑启动项在linux开头的那一行末尾追加single或者3进入单用户/多用户命令行模式然后按Ctrl X启动。这样就能跳过图形界面进系统把NVIDIA驱动卸掉。卸驱动sh NVIDIA-Linux-x86_64-535.154.05.run --uninstall如果找不到.run文件也可以直接删模块文件rm -rf /lib/modules/$(uname -r)/kernel/drivers/video/nvidia* rm -rf /usr/src/nvidia-*然后重建initramfsdracut -f重启后一般能恢复到安装前的状态。这套应急方法建议收藏真的用得上。7. 终局心得从“装了能跑”到“长期稳定”还有哪些细节要留意驱动装完、nvidia-smi能输出之后很多人就认为“搞定了”。但服务器上挂着一块NVIDIA显卡三天两头出问题的场景我见过太多了。结合CentOS 7.9本身的特性最后分享几条实践心得。7.1 妥善保存驱动安装包和版本记录建议把下载好的.run安装包放到/srv/installers/这类固定目录别放在/tmp下——某些服务器会定期清理/tmp文件。然后在目录里写一个简单的README记录安装日期、驱动版本、对应显卡型号、用的安装参数。这波操作的触发点是某次我需要在另一台型号完全一样的服务器上复现环境但忘了当初用的驱动版本是哪个结果只能重新查兼容性列表浪费了不少时间。现在我把驱动包和说明放在一起几分钟就能复现一次安装。7.2 注意CUDA Toolkit和驱动版本的匹配关系很多人在驱动装好之后接着装CUDA Toolkit然后发现程序跑不起来。原因往往不是驱动的问题而是CUDA Toolkit要求的驱动版本和当前装的驱动版本不匹配。比如CUDA 12.2要求驱动版本不低于525.60.13CUDA 11.8要求驱动版本不低于520.61.05。装上驱动后可以用nvidia-smi看到当前驱动对应的最大CUDA版本支持范围。安装CUDA Toolkit之前务必确认这个对应关系。一个比较省心的策略是先确定你要用的CUDA版本再反查它要求的驱动版本下限然后去NVIDIA官网下载一个“不低于下限且不是过分压倒”的驱动版本。不要一下装最新版驱动因为老内核上最新驱动未必听话。7.3 CentOS 7.9退场后的长期维护思路CentOS 7.9已经进入生命周期末期Yum源地址都变了部分软件仓库已经停止服务但这些并不影响现有机器上NVIDIA驱动的正常运行。需要注意的是当你后续想yum安装新的软件包或更新内核时可能会遭遇源失效问题所以建议提前把kernel-devel、kernel-headers、gcc、dkms这几个核心包备份好或者离线rpm包留存。真到了需要重建环境的时候不依赖外部网络也能把这套NVIDIA驱动环境复制出来。另外如果你打算后续迁移到Rocky Linux 9.x或Ubuntu 22.04/24.04显卡驱动的安装方式其实会变得更简单但原理和这里讲的一致确认内核头文件、禁用冲突驱动、匹配驱动版本、设置模块自动重建。理解这套逻辑之后不管系统怎么换你都能很快上手。最后再补一个小技巧装完驱动之后做一次系统镜像快照如果你用虚拟机或者云主机的话。有了快照后续无论是更新内核、升级CUDA、还是误操作删配置都能快速回滚比任何应急流程都省心。
返回列表