ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

麒麟V10海光平台安装NVIDIA驱动全实录:避坑指南与实操步骤

2026/10/1 23:46:40 拓冰建站 浏览量
麒麟V10海光平台安装NVIDIA驱动全实录:避坑指南与实操步骤 直接装机翻车的事情我干过不止一次了。这次是在一台海光CPU的服务器上系统是麒麟V10 SP3折腾NVIDIA显卡驱动。网上资料零散有说直接apt装的有说必须编译的还有说海光平台驱动装不上的。我实测下来这条路能走通但过程里确实有几个坑不写出来对不住后来的兄弟。这篇文章就把整个安装过程从环境勘查到最后验证完整记录一遍包括我踩过的坑和对应的排查思路希望能帮你少走弯路。先说结论麒麟V10海光装NVIDIA驱动完全可行但不能直接用发行版源里的通用驱动包推荐用NVIDIA官网的runfile安装包在纯命令行模式下手动安装配合DKMS管理内核模块。整个过程核心就三件事搞定内核头文件、禁用nouveau、让驱动安装程序能找到正确的编译环境。1. 环境勘查动手之前先把家底盘清楚1.1 识别系统版本与CPU架构我在实际操作中第一步永远是确认系统到底是什么版本。麒麟V10的版本号比较碎有SP1、SP2、SP3还有桌面版和服务器版的区别而不同小版本对应的内核版本差异很大直接影响驱动兼容性。cat /etc/os-release uname -a lscpu我这次的环境是这样的系统Kylin Linux Advanced Server V10 SP3 内核4.19.90-52.26.0.13.x86_64 CPUHygon C86 7285海光 GPUNVIDIA Tesla T4需要注意海光的CPU在lscpu里会显示为Hygon或者Hygon C86这是正常的因为海光处理器本身就是x86_64架构指令集和Intel/AMD的x86_64基本兼容所以驱动安装流程和普通x86服务器是类似的只是个别依赖包名称会有差异。不要看到Hygon就慌当作普通x86_64的Linux服务器处理即可但前提是要装对CPU对应的内核版本。另外关于版本麒麟V10的服务器版还有一个特殊的lance版本这是针对特定硬件平台做了适配的。如果你手里的是lance版本镜像建议确认一下/etc/os-release里的VERSION_ID不同微版本的软件源地址不同后面装上对应内核头文件时会影响能否直接yum install提前看清楚能省不少事。1.2 确认内核版本与头文件是否配对NVIDIA驱动安装程序在编译内核模块时必须要找到与当前内核完全一致的内核头文件。这里的一致性指的是版本号要一字不差。在麒麟V10上我遇到的第一道坎就是内核头文件。系统默认的源里如果没配置好你直接执行yum install kernel-devel kernel-headers装出来的版本很可能和当前内核不一样。比如当前内核是4.19.90-52.26.0.13但源里默认的kernel-devel是4.19.90-52.20那编译时就会报找不到/lib/modules/$(uname -r)/build目录。检查头文件是否配对可以这样ls -la /lib/modules/$(uname -r)/build rpm -qa | grep kernel-devel rpm -qa | grep kernel-headers如果build目录存在且指向了正确的源码目录说明头文件就绪。如果rpm -qa输出的版本号和uname -r不一致问题就来了。我还遇到过一种情况麒麟系统本身已经内置了kernel-devel但是目录权限不对。印象很深的一次/usr/src/kernels下只有一个类似4.19.90-52.26.0.13.x86_64的目录但是缺少build软链接导致NVIDIA安装程序找不到源码路径。这种时候手动重建软链接就行ln -s /usr/src/kernels/4.19.90-52.26.0.13.x86_64 /lib/modules/4.19.90-52.26.0.13.x86_64/build所以环境准备阶段最重要的一件事就是让/lib/modules/$(uname -r)/build指向一个真实存在的内核源码目录并且版本要和uname -r完全匹配。这一步没做好的话后期驱动编译100%会失败而且报错信息非常让人抓狂它会提示一堆找不到头文件的问题但实际根源可能就只是软链接不对。1.3 基础依赖gcc、make与编译环境NVIDIA驱动本质上是一堆内核模块加用户态库安装时要现场编译内核模块所以编译工具链不能少。麒麟V10一般自带gcc但版本和完整性需要确认gcc --version make --version ld --version另外NVIDIA驱动还会调用libelf、libglvnd这些库。如果缺失安装程序会在预检查阶段提示你。麒麟的软件源里这些包基本都有直接yum install -y gcc make kernel-devel kernel-headers libglvnd-devel pkgconfig这里有个细节安装libglvnd-devel的目的是为了让NVIDIA驱动支持GLVNDGL Vendor-Neutral Dispatch否则在部分桌面应用下OpenGL库的加载会有问题。如果是纯服务器跑计算任务这个依赖不是必需但建议装上一次性解决潜在的兼容性问题。我在海光平台上还遇到过gcc版本过老导致编译失败的情况。海光CPU本身没问题但如果系统比较老、内核对新的编译选项不兼容可能报unknown option之类的错。这通常可以通过升级gcc解决麒麟V10 SP3默认的gcc版本是7.3.0实测编译NVIDIA 470.xx、535.xx系列驱动没问题不需要刻意升级。2. 驱动选型下载前先用数学题确定版本号2.1 不要乱装新版旧版有时更稳很多人上来就下载NVIDIA官网最新的驱动这个做法在国产平台上不一定是好事。因为麒麟V10的内核是4.19相对较老而新版驱动比如550系列以后往往对较新内核的适配更好对老内核反而开始逐步放弃支持编译报错的概率高不说有些驱动还会对glibc版本有要求。我的建议是先确定你需要的CUDA版本再反推驱动版本。比如你想用CUDA 12.2那对应驱动最低是535.104.05想用CUDA 11.8对应驱动最低是520.61.05。NVIDIA官方有一张驱动与CUDA版本对应表可以直接参考。另外如果是老内核建议优先选470.xx或者535.xx这些LTS分支的驱动。470.xx对老内核的支持特别好很多工业场景现在还停在470版本上。我这个环境最终选择的是NVIDIA-Linux-x86_64-535.154.05.run原因很简单Turing架构的T4卡在535.154.05下兼容性最好而且这个驱动是2024年初发布的对4.19内核适配做得不错能正确识别海光平台。如果是在桌面版麒麟V10上装驱动还得多留一个心眼。桌面环境下NVIDIA驱动安装时会自动配置Xorg的GLX模块而麒麟桌面基于UKUI默认的Xorg版本可能与驱动内置的libglxserver_nvidia.so不兼容。这种场景下我建议装完驱动后手动配置一下Xorg不要省事跳过GLX配置否则重启后极大概率会卡在登录界面循环。2.2 离线环境下的驱动包准备生产服务器往往是不连外网的或者外网速度感人。所以驱动安装包要提前下载好传到目标机器上。下载地址就是NVIDIA官网的驱动下载页按显卡型号和操作系统筛选。下载完之后强烈建议校验一下MD5或SHA256。我就遇到过下载传输出错导致安装程序解压阶段直接报corrupted的情况浪费了半天时间。md5sum NVIDIA-Linux-x86_64-535.154.05.run官方页面上会给出SHA256值用sha256sum核对一遍确保文件完好。这个习惯值得养成尤其是离线环境下传文件出错的概率比想象中高。3. 安装前准备三个步骤缺一不可3.1 禁用nouveau开源驱动这是装NVIDIA驱动最经典的一步。nouveau是Linux内核自带的NVIDIA显卡开源驱动它在内核层占用设备并且不兼容NVIDIA闭源驱动。如果不禁用它NVIDIA驱动安装程序会在预检查阶段直接拒绝安装提示nouveau已被加载或者说You appear to be running an X server但实际和X无关。禁用方法是在内核启动参数里加modprobe.blacklistnouveau同时在/etc/modprobe.d/下建一个黑名单文件cat /etc/modprobe.d/blacklist-nouveau.conf EOF blacklist nouveau options nouveau modeset0 EOF然后重建initramfsmv /boot/initramfs-$(uname -r).img /boot/initramfs-$(uname -r).img.bak dracut --force /boot/initramfs-$(uname -r).img $(uname -r)麒麟系统默认使用dracut作为initramfs生成工具。注意有些教程会写update-initramfs -u那是Debian/Ubuntu系的命令在麒麟上不适用。另外如果服务器上开着X server光禁用nouveau还不够你还需要在安装驱动前把图形界面停掉否则X server会占着显卡设备NVIDIA驱动装不上或者在加载时和X冲突。3.2 关闭安全启动Secure Boot这个坑在国产平台上比普通服务器更隐蔽。现在的服务器主板默认开启UEFI安全启动。而NVIDIA驱动是第三方签名模块如果主板固件里没有导入NVIDIA的签名公钥内核会拒绝加载这个模块。解决方式有两种一是进BIOS直接关掉Secure Boot最省事二是在NVIDIA驱动安装时选择生成签名密钥然后把公钥通过mokutil --import导入系统。如果你不想每次升级内核都重复导一遍直接关Secure Boot是效率最高的。在麒麟系统上可以通过以下命令确认Secure Boot状态mokutil --sb-state如果返回SecureBoot enabled要么去BIOS关掉要么导入密钥。实际操作中我发现有些海光平台的主板BIOS菜单是中文的找Secure Boot的位置要花点心思一般在Security或Boot菜单下项目名称可能是“安全启动”或“Secure Boot”。注意NVIDIA驱动在全新安装时如果你用的驱动版本较新它可能会主动询问是否要注册DKMS并处理Secure Boot签名交互界面有几个选项。但如果驱动没提示而你又开着Secure Boot那重启后模块加载会失败报Required key not available。这个错误信息挺好记的遇到就明白是Secure Boot的问题了。3.3 切入文本模式停掉图形界面如果这台机器是桌面版麒麟或者装了图形界面那么安装驱动前需要切换到纯文本模式。原因是NVIDIA驱动的安装程序会检测是否有X server在运行如果有它不会让你继续安装。systemctl set-default multi-user.target reboot重启后进入的是命令行登录界面这个时候nouveau已经被黑名单禁掉了系统会使用VESA或基本显示驱动来输出画面这不影响我们进行终端操作。如果是远程通过SSH操作这个步骤对当前会话没影响专注执行安装程序即可。4. 驱动安装实操从预检查到编译完成的完整记录4.1 安装命令与参数选择切换到纯命令行后给安装包加执行权限直接运行chmod x NVIDIA-Linux-x86_64-535.154.05.run ./NVIDIA-Linux-x86_64-535.154.05.run --dkms这里--dkms是我特别强调的参数。DKMSDynamic Kernel Module Support能帮你在内核升级后自动重新编译NVIDIA模块省得每次升级内核都要手动重装驱动。在麒麟这种经常打安全补丁更新内核的发行版上加上--dkms真的能少折腾很多。安装程序会先做一个预检查它会检测nouveau是否加载、内核头文件是否匹配、gcc是否存在、还有X server状态。如果预检查没过它会提示你具体的失败项。注意看清楚预检查的每一项不要直接选continue往下走。比如内核头文件不匹配的问题即使你continue后面编译也会挂。预检查通过后安装程序会问你要不要安装32位兼容库OpenGL等。如果你的机器上有32位程序用OpenGL比如有些老工业软件就选yes如果纯64位环境选No即可。然后是DKMS注册确认。如果之前加了--dkms这里会提示注册模块到DKMS选yes。之后就是源码编译环节这个过程通常在2到5分钟之间。编译时会输出大量的cc1和make日志如果日志最后停在某个错误上比如找不到linux/version.h那就是内核头文件的问题。如果一切顺利安装程序会提示Installation successful。4.2 处理GLX与OpenGL库的常见报错有一个细节需要单独拿出来说就是GLX库的报错。很多人在安装过程中看到这样的日志(EE) NVIDIA: Failed to load module glxserver_nvidia (module does not exist, 0)这个报错很多人会在网上搜到但原因其实分两种情况。一种是在安装驱动的时候OpenGL安装选项被跳过了导致GLX模块缺失另一种是Xorg在启动时才尝试加载GLX但模块路径没配置正确。如果是在安装阶段就出现这个通常是你之前系统里残留了另一个版本的NVIDIA驱动或者安转时选了不安装OpenGL库。解决办法很简单在驱动安装交互界面里确保OpenGL相关的选项全部选Yes。如果安装已经完成了但X启动时还报这个错那多半是Xorg的配置里多了一行加载GLX的指令而驱动模块并没在那个路径下。解决方法是删除或注释掉/etc/X11/xorg.conf中相关加载行Section Module Load glx EndSection删除这个Section后保存X重启会自动通过GLVND机制来加载NVIDIA的GLX实现。4.3 安装程序与Xorg配置的联动安装完成后NVIDIA安装程序一般会自动生成/etc/X11/xorg.conf写入nvidia驱动以及一些总线ID信息。如果检查后发现没有生成可以手动执行nvidia-xconfig这个命令会生成一个基础的xorg.conf其中指明了使用NVIDIA驱动。对于桌面版麒麟这一步很关键否则重启后X无法识别显卡可能会退回vesa驱动导致分辨率异常或者黑屏。我在自己机器上遇到过的情况是nvidia-xconfig生成的文件里默认把BlankTime和OffTime都设为0这个其实无所谓。真正需要注意的是如果你之后调整了显卡插槽比如把显卡从PCIe_0换到PCIe_1那xorg.conf里的BusID可能需要手动改否则X会报No devices detected。5. 踩坑与排查让驱动从“装上”到“真正能用”5.1 nvidia-smi报错couldn‘t communicate with the nvidia driver安装成功之后我习惯先跑一下nvidia-smi结果第一次就撞上了经典报错NVIDIA-SMI has failed because it couldnt communicate with the NVIDIA driver. Make sure that the latest NVIDIA driver is installed and running.这个报错在麒麟V10上很常见但根治方式因人而异。先说排查思路。第一步先确认模块有没有load上lsmod | grep nvidia如果输出为空说明模块没加载。再去看内核日志dmesg | grep -i nvidia如果日志里有Unknown symbol或者Required key not available那就是模块和内核不配套或者Secure Boot签名问题。前者需要确认/lib/modules/$(uname -r)/updates下是否有NVIDIA的ko文件后者已经说过关Secure Boot或导入密钥。还有一种常见情况模块加载了但nvidia-smi还是报这个错。这种时候大概率是用户态驱动库和内核模块版本不一致。比如你用runfile装了535.154.05但系统里还有残留的旧版库文件在/usr/lib64下它们之间版本对不上就会通信失败。处理方式是彻底清理旧版驱动然后重装nvidia-uninstall yum remove -y nvidia-* rm -rf /usr/lib64/libnvidia* rm -rf /usr/lib64/libcuda*清理完之后再重新执行runfile安装包。这个过程中重装前一定要重新校验内核头文件因为如果内核有更新老的模块就作废了。5.2 安装时提示kernel source目录找不到这个问题我在另一台机器上遇到得很典型。执行runfile后预检查一切正常但编译刚开始就报The kernel source directory: /lib/modules/4.19.90-52.26.0.13.x86_64/build does not existbuild目录不存在要么是kernel-devel没装要么是装了但路径不对。在麒麟系统上有时候kernel-devel装完并不会自动建立/lib/modules/$(uname -r)/build的符号链接需要手动指定。在NVIDIA驱动的安装选项中有一个--kernel-source-path参数可以显式指到源码目录./NVIDIA-Linux-x86_64-535.154.05.run --kernel-source-path/usr/src/kernels/4.19.90-52.26.0.13.x86_64但更根本的方式还是把/lib/modules/$(uname -r)/build软链接搞对。如果/usr/src/kernels下根本没有当前内核的源码目录那就得去软件源里找到对应的kernel-devel包来装。麒麟的源里一般是有的只需要确保源配置正确yum list available | grep kernel-devel如果源里没有就得挂载对应的安装光盘或镜像或者找管理员拿到匹配的rpm包。总体思路是源码路径必须存在并且就是当前内核的版本。5.3 驱动装了但开机不生效如果你用的是DKMS方式安装正常来说每次内核更新后模块会自动重建。但我在麒麟V10 SP3上遇到过一次内核从4.19.90-52.26升到4.19.90-52.27后DKMS没有自动触发重编译。排查步骤是dkms status如果输出的状态里没有对应内核版本的记录说明DKMS没有为这个新内核构建模块。手动强制重建dkms build -m nvidia -v 535.154.05 -k 4.19.90-52.27.x86_64 dkms install -m nvidia -v 535.154.05 -k 4.19.90-52.27.x86_64然后重新生成initramfsdracut --force重启后lsmod | grep nvidia如果模块正常加载才能说明开机自启的问题解决了。5.4 常见问题速查表我整理了一个排查表方便大家直接对照问题去找方向现象可能原因解决方式nvidia-smi提示couldnt communicate模块未加载或版本不匹配检查lsmod与dmesg重装驱动并确认内核头文件编译时报build目录不存在kernel-devel未安装或软链接缺失安装对应版本的kernel-devel手动建立软链接安装时提示nouveau已加载未正确禁用或initramfs未重建写入blacklist配置dracut --force并重启开机X启动报GLX模块加载失败安装时未装OpenGL库或xorg.conf冲突重装驱动时选OpenGL选项删除冲突Section内核升级后模块丢失DKMS未自动重建dkms build install再dracut --force模块加载报Required key not availableSecure Boot开启关闭Secure Boot或导入签名密钥这张表是我这段时间踩坑最集中的几个方向覆盖了绝大部分麒麟V10海光平台装NVIDIA驱动会遇到的典型问题。6. 安装后验证与专项配置让GPU真正跑起来6.1 冒烟测试nvidia-smi与nvtop驱动装好、模块加载成功后第一个验证指令nvidia-smi正常输出会给出显卡型号、驱动版本、CUDA版本、显存使用率、当前功耗等。我这次输出的是----------------------------------------------------------------------------- | NVIDIA-SMI 535.154.05 Driver Version: 535.154.05 CUDA Version: 12.2 | |--------------------------------------------------------------------------- | GPU Name Persistence-M | Bus-Id Disp.A | Volatile Uncorr. ECC | | 0 Tesla T4 On | 00000000:01:00.0 Off | 0 |看到CUDA Version: 12.2说明驱动把用户态CUDA运行时也一起装好了。这时候如果你想再验证一下计算能力可以用nvidia-smi dmon看一下实时状态或者装个nvtop看看进程级利用率。还有一个小细节Persistence-M如果显示是Off我建议开启持久化模式nvidia-smi -pm 1开启后GPU会保持在初始化状态降低首次调用时的延迟对服务器上跑AI推理有实际收益。这个命令可以写进rc.local或者systemd服务里否则重启后又会变回Off。6.2 配置系统识别GPU设备udev规则多卡服务器需要注意设备节点权限。如果你用非root用户跑GPU程序会提示/dev/nvidia0权限不足或者设备节点不存在。这是因为NVIDIA设备节点是驱动加载时动态创建的需要给普通用户放权。建立一个udev规则文件cat /etc/udev/rules.d/80-nvidia.rules EOF KERNELnvidia*, RUN/bin/bash -c /usr/bin/nvidia-smi -L /dev/null 21 KERNELnvidia*, OWNERroot KERNELnvidia*, GROUPvideo KERNELnvidia*, MODE0666 EOF然后重载udev规则udevadm control --reload-rules udevadm trigger这个规则能让/dev/nvidia*设备节点自动创建且普通用户可访问。如果不做这步容器或普通用户调用GPU时经常会报couldnt find libcuda.so或者cannot open /dev/nvidia0。6.3 容器场景下的驱动配置如果你打算在这台机器上用NVIDIA容器来跑深度学习任务需要装nvidia-container-toolkit。安装完成后容器的--gpus参数才能正常工作。麒麟V10的源里没有这个包需要从NVIDIA的yum源安装或者下载rpm包离线安装。装完后重启容器服务systemctl restart docker然后测试docker run --rm --gpus all nvidia/cuda:11.8.0-base-ubuntu20.04 nvidia-smi这里要提醒一下国产平台的容器镜像建议直接用NVIDIA官方镜像不要自己从零构建。因为CUDA镜像里的工具链和驱动库是经过官方验证的能减少很多意想不到的问题。6.4 CUDA安装与版本匹配建议驱动装好之后很多人的下一步是装CUDA Toolkit。这里有一个容易混淆的概念nvidia-smi显示的CUDA Version是驱动支持的最高CUDA运行时版本并不代表你已经装好了CUDA Toolkit。要编译CUDA程序需要单独安装Toolkit。驱动版本和CUDA版本的匹配关系前面已经提过直接参考官方对应表。在装CUDA Toolkit时记得用runfile方式不要用deb方式因为deb方式在麒麟上经常因为发行版标识不兼容而失败。安装完成后配置环境变量export PATH/usr/local/cuda/bin:$PATH export LD_LIBRARY_PATH/usr/local/cuda/lib64:$LD_LIBRARY_PATH然后运行nvcc --version确认CUDA编译器可以正常工作。6.5 开机自启与持久化服务的配置驱动装好后还有一个很容易被忽略的点nvidia-persistenced服务。这个服务的作用是让GPU在空闲时保持初始化状态而不是每次有任务时才初始化。在数据中心场景下这个服务能显著降低GPU任务首次调用的延迟。NVIDIA驱动安装时runfile会在/usr/bin下生成nvidia-persistenced但一般不会自动创建对应的systemd服务文件。手动创建cat /etc/systemd/system/nvidia-persistenced.service EOF [Unit] DescriptionNVIDIA Persistence Daemon Wantssyslog.target [Service] Typeforking ExecStart/usr/bin/nvidia-persistenced --user nvidia-persistenced ExecStopPost/bin/rm -rf /var/run/nvidia-persistenced [Install] WantedBymulti-user.target EOF还需要创建对应的用户useradd -M -s /sbin/nologin nvidia-persistenced systemctl daemon-reload systemctl enable nvidia-persistenced --now这样配置以后GPU的Persistence Mode可以保持开启并且开机自动生效不用每次手工执行nvidia-smi -pm 1。写在最后麒麟V10海光平台安装NVIDIA驱动这条路确实比普通Ubuntu服务器要多花一些耐心。核心难点其实不在驱动本身而是国产平台的生态适配还处于完善期系统源、内核头文件、Secure Boot这些问题叠加在一起容易让人陷入“装上了又不生效”的循环。我个人在实际操作中最深的体会是装驱动之前一定先把内核头文件确认到一字不差禁用nouveau之后记得重建initramfs能加--dkms就一定加。这三个动作做到位后面的每个环节都会顺利很多。遇到报错也不要慌dmesg和DKMS status是两个最可靠的排查入口比在网上盲搜有效得多。另外如果你在生产服务器上操作我建议装完驱动后不要急着删安装包留在/root下方便内核升级后随时用dkms方式重建模块。驱动这东西装一次不算完能跟内核和平共处才叫真的装好了。