海光平台双A6000装NVIDIA驱动DP黑屏排查与解决

📅 发布时间:2026/10/19 12:47:00
海光平台双A6000装NVIDIA驱动DP黑屏排查与解决
上个月在机房里折腾一台海光处理器的双卡服务器配置是两块 RTX A6000、Ubuntu 22.04本来以为就是“装个驱动跑起来”的常规活儿结果从内核模块编译到 DP 黑屏整整耗了我大半天。最坑的不是驱动装不上而是驱动明明加载成功、nvidia-smi 也正常显示器却一直黑着怎么切都切不出画面。这篇文章我把完整过程拆开讲清楚海光这种国产 x86 平台装 NVIDIA 驱动有哪些隐藏的坑DP 黑屏的根因到底在哪以及我当时用哪几条命令解决掉的。如果你也在海光或类似国产平台上带双 A6000直接按这个路径走能省掉不少弯路。1. 海光平台装 NVIDIA 驱动前先把这个平台的“脾气”摸清楚1.1 海光 CPU 在 Linux 里被识别成什么先说结论海光 CPU 基于 x86_64 架构在 Linux 下跟 AMD 的兼容性很高但它的 vendor 字符串比较特殊。我在终端里执行lscpu看到的 Vendor ID 是HygonGenuine不是GenuineIntel也不是AuthenticAMD。这意味着绝大多数普通软件都能直接跑但少数对 CPU 厂商做强判断的工具会把它当成“未知处理器”然后在功能检测上做出保守行为甚至直接报错。NVIDIA 驱动不太一样它不关心你的 CPU 是谁家只看是不是 x86_64、内核头文件是否齐全、PCIe 设备是否正常枚举。所以理论上在海光平台上装 NVIDIA 驱动比某些网卡、虚拟化软件的兼容性坑要少得多。但这不代表没有坑后面会说驱动安装环节真正麻烦的是内核模块编译和固件层面的显示接管问题。如果你用的是默认发行版内核比如 5.15.0-xxx-generic基本都能正常匹配。如果升级到了 HWE 内核5.19 或 6.x 系列那就要格外注意显示输出架构的变化DP 黑屏的很多坑都从这里冒出来的。我这次用的就是 5.15 默认内核但因为双卡插法比较特殊最终还是绕了一圈。1.2 双 A6000 的初始硬件识别开机进系统第一件事就是用lspci确认两张卡都被系统看到了命令是lspci | grep -i nvidia正常会看到两条设备的记录比如01:00.0 3D controller: NVIDIA Corporation GA102GL [RTX A6000] (rev a1) 02:00.0 3D controller: NVIDIA Corporation GA102GL [RTX A6000] (rev a1)如果这里只看到一张卡先别急着装驱动多半是硬件层面的问题。海光服务器的 BIOS 设置里有几个选项必须留意Above 4G Decoding 要开启Resizable BAR 视情况开启。这两个选项在国产服务器固件里可能叫法不一样有的是“Above 4G MMIO”有的是“PCIe BAR”。如果不打开某些主板的地址空间分配会出问题导致第二张 A6000 要么识别不到要么跑在 x8 甚至 x4 速率上。另外就是启动模式强烈建议直接用 UEFI 模式不要开 CSM。CSM 开启时BIOS 的显示初始化和 UEFI 帧缓冲会走一套比较老旧的逻辑很容易让显示器输出落在板载 VGA 上而 A6000 的 DP 口在启动阶段根本不会被点亮。后面讲 DP 黑屏和这里是有直接关系的。插槽位置也值得说一句。两块 A6000 是 300W 功耗的涡轮卡如果板子上 PCIe 插槽分布比较远两张卡的散热会好一些。安装前最好确认两个插槽都是 CPU 直出的 PCIe x16避免走 PCH 通道否则带宽会限制很多。2. 驱动安装别一上来就 apt install先想清楚三条路线2.1 为什么 apt 源方案在国产平台上容易翻车Ubuntu 装 NVIDIA 驱动最常见的姿势是sudo ubuntu-drivers devices sudo apt install nvidia-driver-550在普通 Intel/AMD 主板上这招通常很顺系统会拉对应版本的驱动包然后通过 DKMS 自动编译内核模块。但在海光平台上我遇到过几次坑第一DKMS 编译依赖内核头文件。如果系统里没有安装linux-headers-$(uname -r)编译会直接失败报错信息是“unable to find kernel headers”。这个在国产平台上尤其容易发生因为有些精简安装镜像默认不带头文件。第二即使装了头文件如果当前 gcc 默认版本跟内核编译时用的不一致也有概率报编译错误。报错往往比较抽象比如某个头文件里的符号找不到很容易让人误以为是平台不支持。实际上底层就是编译器版本不匹配。第三Secure Boot。如果服务器开了 Secure BootDKMS 编译出来的 nvidia.ko 没有经过签名系统启动时内核会拒绝加载这个模块表现就是装完驱动重启后 nvidia-smi 说找不到设备。海光服务器默认一般是关掉 Secure Boot 的但如果机器是其他同事帮忙装的系统这一步就必须检查mokutil --sb-state如果是 SecureBoot enabled要么在 BIOS 里关掉要么走 MOK 签名流程。我这次的机器是关着的所以没这层麻烦但检查一下总不亏。2.2 官网 .run 包安装的完整流程考虑到上面这些坑我在海光平台上更推荐用 NVIDIA 官网下载的 .run 安装包。它的可控性最高能明确看到编译日志、驱动版本、是否装 DKMS出问题也好排查。具体步骤我列一下# 1. 如果有旧驱动先清理干净 sudo apt remove --purge ^nvidia-.* sudo apt autoremove # 2. 安装基础编译环境和当前内核头文件 sudo apt update sudo apt install build-essential dkms linux-headers-$(uname -r) # 3. 下载 .run 包这里以 550 系列为例 wget https://us.download.nvidia.com/XFree86/Linux-x86_64/550.120/NVIDIA-Linux-x86_64-550.120.run chmod x NVIDIA-Linux-x86_64-550.120.run # 4. 先切到纯命令行卸载桌面环境占用 sudo systemctl isolate multi-user.target # 5. 执行安装 sudo ./NVIDIA-Linux-x86_64-550.120.run运行第 5 步时安装程序会问几个问题我的建议是是否安装 32 位兼容库如果是纯计算服务器不跑 32 位 OpenGL 程序可以选 No省点磁盘空间。但如果你不确定选 Yes 也没坏处。是否自动更新 Xorg 配置选 Yes。后面我们可能会再手工写一份更精确的 xorg.conf但先让它自动生成一份兜底。是否用 DKMS 方式注册内核模块建议选 Yes。这样以后内核小版本更新时驱动模块能自动重编不用每次手动跑一遍 .run。安装过程如果看到编译日志卡住大概率还是头文件或 gcc 的问题。这时候可以追加参数强制跳过编译器版本检查试一下sudo ./NVIDIA-Linux-x86_64-550.120.run --no-cc-version-check但要注意这只是绕过检查不代表编译错误消失最终还是要看日志里缺失的是哪个头文件。安装完成后重启执行nvidia-smi如果能看到两张 A6000并且 Driver Version、CUDA Version 显示正常那这步就算过了。2.3 驱动加载顺序和模块检查有时候nvidia-smi报错“NVIDIA-SMI has failed because it couldnt communicate with the NVIDIA driver”不一定是驱动没装上而是内核模块没被自动加载。可以手动加载并检查sudo modprobe nvidia sudo modprobe nvidia_modeset sudo modprobe nvidia_drm sudo modprobe nvidia_uvm然后看lsmod | grep nvidia正常情况下能看到上面四个模块都在。如果nvidia_drm加载时报参数错误多半是 GRUB 里没开nvidia-drm.modeset1这个参数对 DP 黑屏影响很大下一节详细说。3. DP 黑屏问题现象、初判和最终定位3.1 最磨人的症状系统活着显示器没信号驱动装完重启心里想着这下该出登录界面了结果显示屏从 GRUB 界面过去之后直接黑屏显示器的信号灯开始闪烁最后提示“无信号”。关键现象是键盘灯还能切换SSH 也能连上机器nvidia-smi在 SSH 里执行完全正常GPU 占用率 0%温度也很健康。也就是说系统本身完全没问题只是图形界面没有输出到这台显示器上。这时候我先怀疑的是接线问题比如 DP 线没插紧或者转接头兼容性差。于是我把线重新拔插显示器换了一个 DP 口还是黑屏。又把线接到另一张 A6000 上依然黑屏。最后我把显示器接到了服务器主板的 VGA 口板载 ASPEED 显卡输出居然能正常显示登录界面。这说明问题不是线材也不是显示器而是 NVIDIA 卡上的 DP 输出没有被 Linux 的图形栈接管。3.2 顺着 dmesg 找元凶simpledrm 和 framebuffer图形界面起不来第一步永远是看日志。我通过 SSH 执行了这几条journalctl -b | grep -i drm journalctl -b | grep -i nvidia journalctl -b | grep -i framebuffer日志里出现了几个关键角色efi-framebuffer、simpledrm、nvidia-drm。它们在 Ubuntu 22.04 里各自代表一套显示接管机制系统启动早期UEFI 固件主板 BIOS会初始化一块线性帧缓冲对应efi-framebuffer。内核接着把这个帧缓冲注册成simpledrm设备提供一个最简单的显示输出用来显示启动日志、plymouth 开机画面。NVIDIA 专有驱动加载后会注册自己的nvidia-drm设备负责管理 A6000 上的 DP 输出。台式机或者普通工作站上这三者往往顺理成章地切换simpledrm 完成历史使命后被禁用图形界面交给 nvidia-drm。但在这种带板载显卡的双卡服务器上顺序会乱。内核可能把 simpledrm 绑定到了主板板载 VGA 的帧缓冲上也可能绑定到某一张 A6000 的 GOP 输出上而 GDM 启动时选择了错误的 DRM 设备作为主输出显示器那头自然就黑屏了。3.3 为什么双 A6000 加大了这个概率单卡机器很少出这种黑屏最直接的原因是系统里只有一张 NVIDIA 卡GOP framebuffer 和 nvidia-drm 指向的是同一张卡切换时很容易对上。双卡机器就麻烦了BIOS 在 POST 阶段可能只初始化靠近第一根 PCIe 插槽的那张卡把 UEFI 帧缓冲绑在 01:00.0 上而操作员的显示器却接在 02:00.0 那张卡上。等到 GDM 起来它按 DRM 设备的注册顺序选主输出选了 simpledrm 或者 01:00.0但物理显示器在 02:00.0于是两边“对不上”。另一个常见情况是 Wayland 会话。Ubuntu 22.04 默认 GDM 可能尝试走 WaylandNVIDIA 驱动配合 Wayland 必须开启 modeset 且显示设备枚举正确否则很容易黑屏。很多服务器用户最终切回 Xorg 反而稳定不是没有原因的。所以DP 黑屏不要简单归因于“驱动没装好”。更合理的定位思路是先确认系统活着再确认日志里有 simpledrm/nvidia-drm 两类设备最后检查显示输出到底绑定在哪张卡上。4. 让 DP 正常输出的三次关键调整4.1 从 GRUB 层面把 simpledrm 请出去我的第一个动作是修改 GRUB 启动参数让内核在早期就不要把 UEFI framebuffer 注册成 simpledrm免得它长期占着 DRM 设备序号扰乱 GDM 的显卡选择。编辑/etc/default/grub把这一行改成GRUB_CMDLINE_LINUX_DEFAULTquiet splash nvidia-drm.modeset1 nvidia-drm.fbdev1 rd.driver.blacklistsimpledrm逐个解释作用nvidia-drm.modeset1告诉 nvidia-drm 驱动启用内核模式设置这是图形界面正确输出的前提Wayland 尤其依赖它。nvidia-drm.fbdev1让 NVIDIA 驱动提供一层 framebuffer 设备承担早期控制台输出把显示从板载 VGA 拉回 A6000。rd.driver.blacklistsimpledrm在 initramfs 阶段就把 simpledrm 驱动拉黑不让它注册平台设备。改完执行sudo update-grub sudo reboot重启之后显示器虽然没有马上亮起登录界面但至少系统日志里已经看不到 simpledrm 设备了。这一步的关键是不要在这组参数里加 nomodeset。很多网上的教程让你黑屏就加nomodeset但在 NVIDIA 专有驱动场景下它会禁用 modeset结果是驱动能加载、分辨率却卡在 BIOS 初始状态GDM 反而更容易起不来。我可以明确说这个坑我踩过加 nomodeset 后登录界面照样黑而且日志里多了一堆 modeset 错误。如果 GRUB 里的 blacklist 参数没生效还可以写一个 modprobe 配置echo blacklist simpledrm | sudo tee /etc/modprobe.d/blacklist-simpledrm.conf sudo update-initramfs -u然后再重启。这两个动作保险起见可以一起做一个管启动参数一个管 initramfs 里的模块加载。4.2 让 Xorg 和 GDM 选对显卡BusID 绑定simpledrm 移除后黑屏问题解决了 80%但双卡环境下 GDM 仍然可能默认选择第一张卡输出。如果你的显示器恰好接在第二张卡上还是黑。这时候唯一的正解是显式告诉 Xorg用哪张卡作为输出设备。先通过 PCI 地址算 BusIDlspci | grep -i nvidia如果第二张卡的地址是02:00.0在 Xorg 配置里要写成十进制BusID PCI:2:0:0因为lspci显示的是十六进制这里的 02:00.0 刚好等于十进制 2:0:0大多数情况下数字不变但如果是0a:00.0写 Xorg 时要换算成PCI:10:0:0。然后创建/etc/X11/xorg.conf.d/10-nvidia-output.confSection Device Identifier nvidia-gpu-second Driver nvidia BusID PCI:2:0:0 Option AllowEmptyInitialConfiguration EndSectionAllowEmptyInitialConfiguration在有显示器之前就允许显卡初始化一个空白画面某些情况下不加这个选项Xorg 会因为“没有连接显示器”而拒绝启动。多卡服务器建议无脑加上。做了这个配置重启 GDMsudo systemctl restart gdm3正常情况下接在第二张 A6000 DP 口上的显示器就能出现登录界面了。如果你想让 GDM 走 Xorg 而不是 Wayland也可以编辑/etc/gdm3/custom.conf把WaylandEnablefalse那行的注释去掉。我在排查时就是这么干的因为 Wayland 在双 NVIDIA 卡的海光平台上选择输出设备的策略更难控制切到 Xorg 可以少很多折腾。4.3 为什么我不建议“治标式”关掉显卡排查过程中我看到网上有人建议直接禁用一个 GPU只留一张卡或者把 A6000 的显示输出当作不存在靠板载 VGA 看桌面。这些方案在纯计算服务器上确实能凑合但会白白牺牲一张 A6000 的算力或者让管理界面长期走 VGADP 口浪费掉。我的处理原则是A6000 本身就是带显示输出的专业卡让它的 DP 口正常工作是硬件原本就该有的能力。simpledrm 移除加 BusID 绑定这两步合起来并不复杂却能把两张卡的显示和计算都保留。实际跑了一个月没有再出现过 DP 黑屏每次重启都能正常进入登录界面。5. 双 A6000 安装完成后的验证与运行备忘5.1 确认两张卡都被 CUDA 正常调度显示器点亮之后先别急着跑大任务我通常会做一轮基础验证nvidia-smi确认两张卡的名称、显存、驱动版本、温度、风扇转速都在合理范围。然后看 PCIe 链路速率nvidia-smi -q -d PCIE正常应该显示Current Link Speed为 16 GT/sPCIe Gen4 x16。如果显示 8 GT/s 或 x8检查是不是插到了 PCH 通道或者 BIOS 里把插槽拆分成了 x8x8。这个不一定是故障但训练任务里数据搬运带宽影响挺明显值得提前发现。如果机器里装了 CUDA toolkit可以跑一下官方 sample 里的 deviceQuery/usr/local/cuda/samples/bin/x86_64/linux/release/deviceQuery或者更直观一点用 Python 环境里已有的深度学习框架验证import torch print(torch.cuda.device_count()) print(torch.cuda.get_device_name(0)) print(torch.cuda.get_device_name(1))能输出两张 A6000 的名字就说明 CUDA 层面两张卡都可见。5.2 功耗、散热和 Persistence Mode双 A6000 满载功耗大概在 600W 左右加上两颗海光 CPU、内存、硬盘整机峰值功耗会到 1000W 以上。电源建议留足 1600W 以上冗余不要卡着 1200W 来不然高负载训练时可能会触发整机掉电。这个我深有体会之前在别的机器上为了省预算用 1200W 电源跑起来直接重启查半天发现是电源过载。散热方面A6000 是涡轮风扇热量直接排出机箱外所以对机箱风道没有普通显卡那么挑但进风口的灰尘过滤不能省。我在机房里见过 GPU 温度正常但显存温度偏高的情况多半是机箱风道里堵了毛絮。日常使用可以开启 Persistence Mode减少任务间隙驱动反复卸载加载的延迟sudo nvidia-smi -pm 1另外驱动在系统内核升级后容易失效。如果某天重启后发现 nvidia-smi 报错先跑一下uname -r和dkms status看是不是内核悄悄换了版本。安装 .run 包时如果选了 DKMS大部分情况下能自动适配但遇到跨大版本的内核更新还是建议重跑一次安装程序并确认头文件已经提前装好。5.3 关于 open kernel module 和 MIG 的一个提醒Ampere 架构的 A6000 在较新驱动里支持 open kernel module 选项但我在海光平台上不建议尝鲜。专有闭源模块在海光这种非 AMD/Intel 标准平台上经过的验证更多稳定性更好。open module 在部分国产平台上有概率在负载较高时出现 DMA 相关错误虽然复现率不高但对于服务器来说稳定比“开箱即用”更值钱。MIG 默认不开启如果要用确认两张卡的 memory 划分是你预期的样子。这个功能更多是给 A100 这类卡用的A6000 上用 MIG 反而会限制单实例显存除非你有明确的多租户需求否则保持默认整卡模式就好。最后分享一个排查技巧遇到黑屏时把显示器临时接到服务器板载 VGA 口上通过 BIOS 旁路画面确认系统正常再通过 SSH 看 dmesg 和 Xorg 日志比在纯黑屏状态下瞎猜要高效得多。这套“先旁路、再查日志、最后改配置”的流程在国产服务器平台上尤其好用因为很多固件层面的显示初始化和品牌工作站不一样不要默认它一定能把 DP 口点亮。