
CentOS 8已经停止维护好几年了但服务器上还跑着它的人依然不少。最近帮朋友折腾一台CentOS 8机器装NVIDIA驱动从yum源失效到nouveau冲突再到Secure Boot拦路一路踩坑。想想这些经历值得整理一篇实操笔记。这篇东西主要面向两类人一是还在用CentOS 8、需要给机器装显卡驱动的运维和开发二是刚从Ubuntu切过来、对RHEL系安装驱动流程不熟的新手。内容以NVIDIA官方runfile安装为主线穿插ELRepo方案对比把安装前后的典型问题一并讲透。1. 动手之前先把硬件和系统底细摸清楚1.1 确认显卡型号与驱动支持边界装驱动不是拿个安装包一顿下一步就完事的。第一步永远是确认显卡型号。命令很简单lspci就能看出来lspci | grep -i nvidia如果输出类似“NVIDIA Corporation GA106 [GeForce RTX 3060 Lite Hash Rate]”说明系统已经识别到显卡接下来只需要装驱动。如果这条命令没输出先别急着装驱动检查显卡供电、PCIe插槽是否插好或者是不是板载显卡在输出画面。显卡型号确认之后还要确认驱动支持边界。NVIDIA对老卡有明确的legacy支持政策比如GTX 730、GTX 1050这类老卡新版驱动从某个版本开始就不再支持了。强行装新驱动轻则编译失败重则装完进不去桌面。我自己遇到过一台GTX 730的老机器装最新驱动直接报“unsupported GPU”错误换到470系legacy驱动才正常。所以装之前先去NVIDIA官网查一下显卡对应的驱动版本或者说查一下当前最新驱动是否还在支持列表里。反过来新卡也有新卡的麻烦。像RTX 4060这种新卡在CentOS 8上安装官方最新驱动基本没问题但装完之后显示分辨率一直1080p很多人会误以为是驱动问题。这个后面单独说很多时候问题根本不在驱动上。1.2 核对内核版本与编译工具链的匹配关系显卡驱动是以内核模块形式加载的编译这个模块需要内核头文件而且gcc版本必须和编译内核时的gcc版本一致或者至少兼容。这句话听起来简单实际装的时候最容易在这里翻车。进入系统后先执行uname -r rpm -q kernel-devel kernel-headers gcc makeCentOS 8默认内核一般是4.18.0开头的某个小版本。kernel-devel和kernel-headers的版本号必须和当前运行内核完全一致比如uname -r显示4.18.0-553.el8.x86_64那么kernel-devel也得是同一个版本。如果不一致NVIDIA安装脚本编译模块时会报找不到/lib/modules/$(uname -r)/build目录或者直接提示“Unable to find the kernel source tree”。gcc版本不一致的问题更隐蔽。系统默认gcc可能是8.x但如果这台机器之前有人装过DevToolSet或者手动编译过什么软件gcc可能已经切换到10.x甚至11.x。这时候装驱动会报版本差异警告编译出来的模块可能在加载时崩掉。最省事的办法就是老老实实用系统自带gcc安装脚本让你指定CC路径时就填/usr/bin/gcc。1.3 CentOS 8停止维护后yum源要先修复这是很多人在CentOS 8上装软件时的第一个坑和显卡驱动没有直接关系但不解决它你连依赖都装不上。CentOS 8的生命周期在2021年12月31日就正式结束了官方停止维护之后默认的mirrorlist源全部失效。如果你直接执行yum install会报一堆“Failed to download metadata for repo AppStream”之类的错误。解决办法是切换到vault源。操作方式是在/etc/yum.repos.d/目录下修改repo文件把mirrorlist行注释掉baseurl改成vault.centos.org的地址。以CentOS-8.repo为例改完大致是这样[baseos] nameCentOS Linux $releasever - BaseOS baseurlhttp://vault.centos.org/8.5.2111/BaseOS/$basearch/os/ gpgcheck1 enabled1注意这里写死了8.5.2111这个版本号。实际用的时候建议先把/etc/yum.repos.d/下的文件备份然后执行sed批量替换把CentOS-8.5.2111替换成你系统实际的版本或者直接用vault里最新的8.5.2111目录。替换后运行yum clean all yum makecache验证一下。这一步不处理好后面所有依赖安装都会卡住。2. 三套主流安装方案怎么选才不后悔2.1 ELRepo的kmod-nvidia运维最省心ELRepo是RHEL系一个第三方软件仓库里面维护了NVIDIA显卡的kmod包。装的时候只需要yum install epel-release rpm -Uvh https://www.elrepo.org/elrepo-release-8.3-1.el8.elrepo.noarch.rpm yum install kmod-nvidiaELRepo方案最大的优势是跟内核联动。系统更新内核后kmod-nvidia会自动针对新内核重新编译模块不需要手动干预。对于服务器场景只要不是追求最新驱动特性我一般首选这个方案。缺点也很明显ELRepo仓库里的驱动版本通常比NVIDIA官网滞后新显卡刚发布时可能还没有对应的kmod包。另外ELRepo的kmod包是针对特定内核版本编译的新内核出来之后仓库需要时间跟进所以如果你自己手动升级了内核反而可能因为版本不匹配装不上。2.2 NVIDIA官方runfile兼容性和可控性最强到NVIDIA官网下载对应型号的.run文件手动执行安装。这个方案的优点是版本最新、可控性最强显卡支持列表一目了然安装过程可以精细控制。缺点是每次内核更新后都要重新编译安装模块不像ELRepo那样自动联动。对于需要跑CUDA、PyTorch等深度学习框架的场景我基本上都用runfile方式。原因很简单CUDA Toolkit对驱动版本有明确要求ELRepo源里的驱动版本经常满足不了CUDA版本要求最后还得手动搞。与其来回折腾不如一开始就走runfile路线。2.3 CUDA仓库、Ubuntu和Windows驱动的思路对照除了上面两种方式CentOS 8上还可以直接用NVIDIA的CUDA仓库安装驱动。配置方式是把官方CUDA repo加入yum源然后执行yum install cuda-drivers。这个方案适合目标是CUDA开发环境的场景驱动版本和CUDA版本是配套发布的省去自己对齐版本的麻烦。顺便说一句很多网友拿Ubuntu的习惯来套CentOS。在Ubuntu上装NVIDIA驱动用的是apt install nvidia-driver-xxx卸载时用apt purge nvidia*而且Ubuntu经常因为nouveau没禁用导致装完黑屏需要在grub里加nomodeset参数。这些经验在CentOS上可以参考但命令完全不一样。CentOS卸载驱动时如果是runfile安装的直接执行nvidia-uninstall如果是ELRepo安装的用yum remove kmod-nvidia。Windows那边的DDU工具、代码39错误提示在Linux环境下对应的是内核模块加载失败或nvidia-smi报“couldnt communicate with the NVIDIA driver”排查思路完全不同别拿Windows的故障码往Linux上套。3. 用NVIDIA官方runfile完整走一遍安装流程3.1 禁用nouveau开源驱动防止安装时冲突nouveau是Linux内核自带的NVIDIA显卡开源驱动功能不完整性能也差。NVIDIA官方驱动的安装脚本会检测nouveau是否在加载状态如果发现加载了就会中止安装。所以安装前必须把它禁掉。最简单的做法是新建一个modprobe配置vim /etc/modprobe.d/blacklist-nouveau.conf写入两行blacklist nouveau options nouveau modeset0然后重建initramfs并重启mv /boot/initramfs-$(uname -r).img /boot/initramfs-$(uname -r).img.bak dracut /boot/initramfs-$(uname -r).img $(uname -r) reboot重启后执行lsmod | grep nouveau如果没有任何输出说明禁用成功。这个方法比手动改grub参数更干净因为它是持久生效的不会因为重启丢了配置。不过有个细节要注意dracut命令的括号是反引号不是普通括号很多新手在这里复制错命令重建出来的initramfs文件名就错了。3.2 安装编译依赖并做预检在跑runfile之前先把编译环境准备好。CentOS 8上需要的包主要有yum install -y gcc gcc-c make kernel-devel kernel-headers dkms elfutils-libelf-devel libglvnd-devellibglvnd-devel这个包很多人会漏。它是NVIDIA OpenGL转发机制的开发库runfile安装时如果不装安装脚本会警告说“Cannot find libglvnd”而且安装完OpenGL相关功能可能不正常。虽然可以加--no-opengl-files参数跳过但我建议还是装上避免后面写OpenGL程序时才发现少了东西。如果你用的是ELRepo方案预检命令是yum install -y epel-release modinfo nvidiamodinfo能输出模块信息就说明驱动已经就位。如果是runfile方案预检就是确认nouveau已禁用、内核头文件版本匹配、gcc可用。3.3 执行安装脚本交互选项怎么选从NVIDIA官网下载对应显卡型号的runfile文件名类似NVIDIA-Linux-x86_64-550.54.14.run。上传到服务器后chmod x NVIDIA-Linux-x86_64-550.54.14.run ./NVIDIA-Linux-x86_64-550.54.14.run安装脚本会进入交互界面几个关键问题要提前想好第一个问题问你是否安装NVIDIA 32位兼容库。如果你的机器只跑64位程序不需要装如果偶尔要跑Steam游戏或者某些32位商业软件选Yes。第二个问题是“Would you like to run nvidia-xconfig to update your X configuration file”一般选No。原因是通过nvidia-xconfig生成的xorg.conf有时过于简单反而会覆盖你原有的多显示器配置。第三个问题是关于DKMS的问你是否注册内核模块到DKMS里方便后续自动重建这个我强烈建议选Yes尤其是你计划以后通过yum升级内核的话。安装脚本执行过程中最常遇到的报错是“Unable to load the nvidia-drm kernel module”或“ERROR: An NVIDIA kernel module nvidia appears to already be loaded”。前者说明内核模块编译成功但加载失败多半是Secure Boot阻止了未签名模块加载后者说明nouveau或者旧驱动还残留在内存里需要重启后再装或者先执行nvidia-uninstall清理干净。安装完成后运行nvidia-smi如果能看到类似下面的输出就算成功----------------------------------------------------------------------------- | NVIDIA-SMI 550.54.14 Driver Version: 550.54.14 CUDA Version: 12.4 | -----------------------------------------------------------------------------4. 安装后迟早会遇上的问题和对症解法4.1 黑屏、登录界面循环和“无信号”排查装完驱动重启显示器黑屏或者一直卡在登录界面这是NVIDIA驱动安装最常见的翻车现场。排查思路要按顺序来先别急着重装。重启进入grub菜单时按e编辑启动项在linux那一行末尾加nomodeset再按CtrlX启动。如果能进系统说明显卡驱动有概率和图形界面冲突了。此时查看日志journalctl -xe | grep -i nvidia cat /var/log/Xorg.0.log | grep EE tail -n 100 /var/log/messagesXorg日志里如果出现“(EE) NVIDIA(0): Failed to initialize the NVIDIA kernel module”或者“(EE) No devices detected”说明驱动没有正确加载。这时候执行nvidia-smi看一下如果输出正常但图形界面黑屏问题多半出在Xorg配置上。备份现有xorg.conf后删掉/etc/X11/xorg.conf让Xorg自动检测一般能救回来。还有一种情况是显示器接口接在了主板上而输出画面的是NVIDIA显卡或者反过来。之前帮人排查一台双显卡机器的“黑屏”折腾半天发现显示器插在主板的HDMI口上系统默认用的是Intel核显NVIDIA驱动装得再好也不可能通过核显接口输出画面。这个检查花不了十秒钟但真的很容易被忽略。如果用GTX 730这种老卡装完驱动进图形界面直接黑屏大概率是驱动版本太新不支持老卡。换用470系legacy驱动基本能解决。NVIDIA对老卡的支持政策是进入legacy分支后不会再发布新功能驱动只提供安全修复所以别指望老卡能用上最新版驱动。4.2 Secure Boot和内核模块签名问题现在很多品牌机、工作站默认开启了Secure Boot。Secure Boot开启状态下Linux内核只加载由受信任密钥签名的模块。NVIDIA官方runfile编译出的内核模块没有签名加载时会被内核拒绝。表现就是安装脚本提示加载模块失败dmesg里能看到“locked down”或者“Module verification failed”类似的关键字。解决思路有三种。第一种最简单进BIOS关闭Secure Boot适合个人机器和测试环境。第二种是给模块做签名需要自己生成密钥、注册到MOKMachine Owner Key列表操作繁琐但保留了Secure Boot的安全特性。第三种是用ELRepo的驱动版本因为ELRepo仓库的kmod包是用系统内置密钥签名的可以通过Secure Boot校验。不巧的是很多人是在安装脚本走完、重启之后才发现问题。这时候grub菜单都进不去了怎么办还是编辑启动项加nomodeset或者rd.driver.blacklistnouveau参数先进系统然后根据上面三种思路选一种处理。这里补充一句就算你的系统已经加载了运行中的内核模块如果重启后Secure Boot仍然开着dracut重新生成initramfs时也会因为模块签名问题把驱动排除在外所以必须把签名问题彻底解决而不是绕开一次。4.3 分辨率锁定1080p调不到显示器原生分辨率RTX 4060这类新卡装完驱动后不少人遇到一个诡异的问题系统显示正常、nvidia-smi也正常但分辨率死活只有1080p显示器是2K甚至4K的怎么设置都上不去。很多人第一反应是驱动没装好重装了好几遍都没用。实际排查顺序应该是这样的先确认显示器接到的是独显输出口而不是主板集显输出口。然后看xrandr输出xrandr如果输出里只有1920x1080一个模式说明显示器的EDID信息没有被显卡正确读取。这时手动指定模式cvt 2560 1440 60 xrandr --newmode 2560x1440_60.00 312.25 2560 2752 3024 3488 1440 1443 1448 1493 -hsync vsync xrandr --addmode DP-0 2560x1440_60.00 xrandr --output DP-0 --mode 2560x1440_60.00如果手动指定模式后显示器正常显示说明是EDID读取的问题。一劳永逸的办法是在xorg.conf里通过Modeline强制指定分辨率。还有另一种更隐蔽的情况显示器支持高刷新率但默认输入信号走的是HDMI 1.4带宽不够比如某些4K 60Hz显示器用HDMI线只能跑到4K 30Hz而2K分辨率下只能用1080p信号输出这其实是线材或接口带宽的限制和驱动完全无关。顺带一提“显卡驱动代码39”这个Windows上的错误提示在Linux下对应的通常是模块加载失败或device handle获取不到。如果你在CentOS里看到类似的驱动异常别去搜Windows的解决方案直接用nvidia-smi和dmesg看内核报错更有效。4.4 内核更新后驱动失效要么DKMS要么重装用runfile方式装的驱动如果不注册DKMS每次内核更新后驱动就失效。CentOS 8的yum源里可能会自动更新kernel包更新完成后重启进新内核nvidia-smi就会报“cant open file /proc/driver/nvidia/version”或者直接找不到设备。避免这个问题的办法是养成看内核升级的习惯。装驱动时注册DKMS或者每次更新内核后重跑一遍.run文件。在安装脚本的交互界面里有一项就是“Install NVIDIAs 32-bit compatibility libraries”和“Register the kernel module with DKMS”。如果你选了YesDKMS会在每次内核变更后自动编译模块不需要手动干预。另一种思路是在yum配置里排除内核自动更新[main] excludekernel* centos-release*修改/etc/yum.conf加上这行。这样系统不会自动升级内核驱动也不会因为内核变化而失效。当然这个方案有取舍内核安全更新也无法通过yum自动安装了需要的时候手动解除排除再更新。4.5 计算卡没有显示输出不是故障特斯拉P100、V100这类计算卡本质上没有显示输出接口。装完驱动后用nvidia-smi能看到显卡信息但显示器不会亮因为计算卡本身就不输出画面。这是个很容易吓到新手的“伪故障”。这种场景下正确做法是用另一块显卡或板载核显输出画面计算卡专心跑CUDA计算。检查驱动是否正常直接看nvidia-smi输出就行nvidia-smi -q | grep -A 2 Product Name如果是P100输出里会有“Tesla P100-PCIE-16GB”字样。此时驱动加载正常但显示输出和这台卡无关。同理很多计算卡机器没有显示器直接headless使用这时候安装驱动时可以用./NVIDIA-Linux-x86_64-550.54.14.run --silent --no-x-check --no-nouveau-check--no-x-check参数跳过X Server运行状态的检测--no-nouveau-check跳过nouveau检测。这种方式装出来的驱动专门给无头服务器用不会碰图形界面配置。5. 常见问题速查表和排查小抄把这段时间遇到的、以及朋友那边反馈的问题整理成一个速查表大家可以当作排查手册用症状常见原因快速处理yum安装依赖时报错CentOS 8源失效切换到vault.centos.org源安装脚本提示nouveau冲突未禁用nouveau建blacklist-nouveau.conf并重启装完重启黑屏Xorg配置或驱动加载失败grub加nomodeset进系统查看Xorg日志nvidia-smi报找不到设备模块未加载或Secure Boot拦截检查dmesg关闭Secure Boot或模块签名双击.run没反应缺少执行权限chmod x后再执行编译模块报找不到内核头文件kernel-devel版本不匹配安装并与当前内核版本对齐装完驱动分辨率只有1080p接线接在集显口或EDID读取失败换独显输出口重查xrandr和线材内核更新后驱动失效runfile安装且未注册DKMS执行nvidia-uninstall后重装并启用DKMSWindows下的代码39错误不适用于Linux环境用dmesg和nvidia-smi查看Linux实际报错还有个容易被忽略的小细节很多生产环境服务器是远程SSH访问的根本没有接显示器。这时候装驱动千万别在runfile交互界面里乱按选项选错可能导致Xorg配置被改导致远程桌面或VNC起不来。建议直接用--silent参数静默安装配合--no-x-check跳过X检测装完靠nvidia-smi验证即可。另外如果你在网上搜“Ubuntu安装NVIDIA驱动黑屏”的帖子会发现很多解决方案是改grub的nomodeset参数。这个方法在CentOS 8上同样有效——编辑/etc/default/grub在GRUB_CMDLINE_LINUX里追加nomodeset然后grub2-mkconfig。如果你是在CentOS上装了驱动后黑屏可以先用这个方式救回图形界面但这只是临时方案根本解法还是看日志找到模块加载失败原因。至于“下载显卡驱动失败”的问题多数是官网那个几百MB的runfile下载中途断掉或者服务器iaas环境访问外网不稳定。最简单的方式是用wget -c断点续传wget -c https://us.download.nvidia.com/XFree86/Linux-x86_64/550.54.14/NVIDIA-Linux-x86_64-550.54.14.run也可以先在本地电脑下载好再scp上传到服务器这样更可控。回到文章开头那个“RTX 4060微星显卡总显示1080p”的案例最后排查下来其实是显示器被识别成了“Generic PnP Monitor”EDID信息没通过DP线传完整。强制指定2560x1440模式后一切正常。像这种问题和驱动安装本身没多大关系但如果你没有整套排查思路很容易卡在重装驱动上耗掉一整天。这正是我写这篇文章的初衷把从装驱动到排障的完整链路都走一遍让你在遇到任何一环出问题时能有条不紊地定位到真实原因。