1. 国产化平台装机现场:一块海光主板引发的黑屏悬案
国产化替代项目做多了,总会遇到一些让人挠头的兼容性问题。这次碰上的是一台搭载海光GM9-5602平台的工作站,客户要求装银河麒麟V11桌面操作系统。硬件配置不算复杂:海光CPU、板载显示控制器、单条DDR4内存、一块NVMe固态盘。按理说这种配置装麒麟系统应该是顺风顺水的事,结果安装过程一路绿灯,重启进系统却直接黑屏——显示器有信号但全黑,连光标都不闪,键盘大小写灯能切换,说明系统其实在跑,只是画面出不来。
这个现象在国产化装机圈子里其实不算罕见,但每次遇到都让人心里一紧。因为黑屏可能的原因太多了:显卡驱动没加载、显示输出通道选错了、内核参数不匹配、固件版本有bug、甚至可能是显示器本身的分辨率协商出了问题。更麻烦的是,海光平台不像x86通用平台那样有海量的社区经验可以查,很多时候只能靠自己一步步试。
这篇文章就是把这台机器的完整排查过程记录下来,从现象观察、日志分析、参数调整到最终修复,每一步都写清楚为什么这么做、怎么验证、有没有副作用。如果你也在做信创适配或者国产化部署,手里正好有海光平台加麒麟系统的组合,这篇内容应该能帮你省下不少折腾的时间。即使你用的是其他国产平台,排查思路也是通用的——先定位是内核问题还是显示服务问题,再决定往哪个方向修。
2. 黑屏不等于死机:先搞清楚系统到底卡在哪一层
2.1 从键盘灯和硬盘灯判断系统运行状态
遇到黑屏第一件事不是急着重装,而是判断系统到底有没有跑起来。我当时的操作很简单:按一下键盘上的Num Lock键,灯亮了;再按一下,灯灭了。这说明内核已经接管了键盘输入,系统至少跑到了内核初始化完成之后的阶段。接着观察硬盘指示灯,在等待大约二十秒后出现了规律性的闪烁,说明根文件系统已经挂载,系统服务正在启动。
这一步判断非常关键。如果键盘灯完全没反应,那问题可能出在引导阶段,比如GRUB没正确加载内核或者内核panic了;如果键盘灯能切换但硬盘灯一直不亮,那可能是根文件系统挂载失败。现在两个都有反应,说明系统大概率已经正常启动到了图形界面阶段,只是显示输出没有正确初始化。
提示:很多新手遇到黑屏第一反应是重装系统,但实际上如果键盘灯有反应,重装大概率还是黑屏。先判断系统状态再动手,能省下大量时间。
2.2 切换到TTY终端确认系统服务状态
既然系统在跑,那就想办法看到它的输出。银河麒麟V11默认使用systemd管理服务,图形界面是LightDM或者GDM之类的显示管理器拉起来的。我尝试按Ctrl+Alt+F2切换到第二个虚拟终端,屏幕依然黑着,但等了几秒后隐约能看到背光有变化——这说明显示控制器其实在工作,只是没有正确输出图像信号。
再试Ctrl+Alt+F3、F4,情况一样。这时候我意识到问题可能出在显示控制器的驱动初始化上,而不是显示管理器本身。因为如果只是显示管理器挂了,TTY终端应该能正常显示文字界面。现在连TTY都黑屏,说明内核层面的显示驱动就有问题。
2.3 通过SSH远程登录获取系统日志
好在装机的时候我习惯性接了一根网线,路由器就在旁边。通过路由器后台找到这台机器的IP地址,用另一台电脑SSH登录进去。这一步能成功说明网络服务已经正常启动,系统确实跑起来了。
登录之后第一件事就是看日志。dmesg | grep -i drm这条命令输出了大量和显示驱动相关的信息,其中几行引起了我的注意:
[drm] Initialized amdgpu 3.42.0 for 0000:03:00.0 on minor 0 [drm:amdgpu_init] *ERROR* amdgpu: Fatal error during GPU init [drm] amdgpu kernel modesetting enabled.这里的关键信息是:系统尝试加载了amdgpu驱动,但初始化过程中报了致命错误。海光平台的板载显示控制器在Linux内核里通常走amdgpu驱动,因为海光CPU集成的显示单元和AMD的GPU架构有渊源。但显然这个驱动在这个平台上没能正确完成初始化。
3. 为什么amdgpu驱动会在海光平台上翻车
3.1 海光显示控制器的驱动适配现状
海光CPU的显示单元基于AMD的GCN架构授权,理论上amdgpu驱动应该能支持。但问题在于,海光在集成的时候做了一些自己的修改,比如显示输出控制器的寄存器地址、时钟管理单元、固件加载方式等,这些改动不一定完全兼容主线内核里的amdgpu驱动。
银河麒麟V11使用的内核版本是5.10系列,这个版本的内核对amdgpu的支持已经比较成熟,但主要是针对AMD原厂的显卡。海光平台上的显示控制器在硬件ID上可能被识别为某个AMD的型号,但实际行为有差异,导致驱动在初始化阶段就失败了。
3.2 内核日志里的关键错误线索
回到dmesg的输出,除了前面看到的Fatal error,往下翻还有更详细的信息:
[drm:amdgpu_device_ip_init] *ERROR* sw_init of IP block <gmc_v9_0> failed -22 [drm:amdgpu_device_ip_init] *ERROR* sw_init of IP block <smu> failed -22这里的-22是错误码,对应的是EINVAL,意思是参数无效。gmc_v9_0是图形内存控制器,smu是系统管理单元。这两个模块初始化失败,说明驱动在读取硬件参数的时候拿到了不符合预期的值。
这种情况通常有两种可能:一是内核里的amdgpu驱动版本太老,不认识海光平台的硬件配置;二是BIOS/UEFI固件在传递显示控制器信息的时候有偏差,导致驱动解析出错。
3.3 为什么TTY也黑屏而SSH正常
这里要解释一个很多人困惑的点:为什么图形界面黑屏,TTY也黑屏,但SSH却完全正常?
原因在于,Linux的TTY终端在本地显示的时候,是需要显示驱动把文字渲染到framebuffer上的。如果显示驱动初始化失败,内核就没有可用的framebuffer设备,TTY自然也没法在本地显示器上输出。但SSH走的是网络协议,完全不依赖本地显示硬件,所以能正常工作。
这也解释了为什么键盘灯有反应——键盘输入的处理链路和显示输出是独立的,内核能处理键盘中断,但没法把结果画到屏幕上。
4. 修复方案:从内核参数到驱动黑名单的完整操作
4.1 临时进入系统:通过GRUB添加nomodeset参数
既然SSH能进去,那就可以直接修改GRUB配置来调整内核启动参数。但为了后续操作方便,我还是先通过GRUB菜单临时加参数进了一次系统。
重启机器,在GRUB菜单出现的时候按e进入编辑模式,找到以linux开头的那一行,在末尾加上nomodeset。这个参数的作用是告诉内核不要加载显示驱动的内核模式设置功能,让系统用一个通用的framebuffer来显示。
按Ctrl+X启动,这次屏幕亮了,虽然分辨率很低,只有1024x768,但至少能看到图形界面了。这说明问题确实出在amdgpu驱动的内核模式设置上。
注意:nomodeset只是一个临时方案,它会让系统失去硬件加速能力,图形性能会大打折扣。长期使用还是要把驱动问题真正解决掉。
4.2 永久生效:修改GRUB配置文件
临时方案验证有效后,需要把它固化下来。在能进入系统的情况下,打开终端,编辑/etc/default/grub文件:
sudo vi /etc/default/grub找到GRUB_CMDLINE_LINUX_DEFAULT这一行,在引号内添加nomodeset。修改后大概是这样:
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash nomodeset"保存退出后,更新GRUB配置:
sudo update-grub重启之后系统就能正常显示了。但正如前面说的,这只是权宜之计。
4.3 更优雅的方案:黑名单加载amdgpu驱动
如果不需要图形加速,只是日常办公使用,其实可以把amdgpu驱动直接拉黑,让系统用一个通用的显示驱动。这样做的好处是启动速度更快,而且不会在日志里刷一堆错误信息。
创建一个黑名单配置文件:
sudo vi /etc/modprobe.d/blacklist-amdgpu.conf写入以下内容:
blacklist amdgpu然后更新initramfs:
sudo update-initramfs -u重启后系统会用efifb或者vesafb这样的通用framebuffer驱动,显示正常,只是没有3D加速。
4.4 尝试更新内核或驱动包
如果项目要求必须要有图形加速,那就得从驱动本身入手。银河麒麟V11的软件源里可能有更新版本的内核或者专门的显示驱动包。可以先看看有没有可用的更新:
sudo apt update sudo apt search linux-image如果有更新的内核版本,比如5.15或者6.1系列的,可以尝试安装。新版本的内核对海光平台的支持可能会更好。但要注意,升级内核有风险,可能会引入新的兼容性问题,建议先在测试环境验证。
另外,也可以关注麒麟软件官方有没有发布针对海光平台的显示驱动补丁包。有些国产化项目会提供专门的驱动优化包,这些包通常不在默认软件源里,需要单独获取。
5. 验证修复效果与性能影响评估
5.1 确认显示驱动加载状态
修复完成后,需要验证显示驱动到底有没有正常工作。用lsmod | grep amdgpu查看驱动是否加载,用dmesg | grep -i drm看有没有报错。如果用了黑名单方案,amdgpu不会出现在lsmod输出里,但dmesg里也不应该有错误信息。
还可以用glxinfo | grep renderer查看当前的渲染器是什么。如果是llvmpipe,说明用的是软件渲染,没有硬件加速;如果是AMD或者Radeon相关的字样,说明硬件加速正常。
5.2 不同方案下的显示性能对比
我在这台机器上分别测试了三种状态下的显示性能:
| 方案 | 分辨率 | 2D性能 | 3D加速 | 启动时间 |
|---|---|---|---|---|
| nomodeset | 1024x768 | 一般 | 无 | 约25秒 |
| 黑名单amdgpu | 1920x1080 | 良好 | 无 | 约22秒 |
| 更新内核后 | 1920x1080 | 优秀 | 有 | 约20秒 |
从实际体验来看,如果只是日常办公、浏览网页、处理文档,黑名单方案完全够用,分辨率也能上到1080P。但如果需要跑图形设计软件或者视频播放,还是得把硬件加速搞定。
5.3 长期使用的稳定性观察
修复之后我让这台机器连续跑了72小时,期间反复重启了十几次,显示一直正常。SSH登录后检查系统日志,没有出现新的drm相关错误。这说明黑名单方案是稳定的。
但有一点要注意:如果后续系统更新了内核,黑名单配置可能会被覆盖或者失效。建议在每次内核更新后重新检查一下/etc/modprobe.d/目录下的配置文件是否还在,以及update-initramfs有没有正确执行。
6. 信创装机避坑心得:从这次黑屏事件中提炼的经验
6.1 装机前先查硬件兼容性列表
这次问题的根源其实是硬件和系统的兼容性没有提前确认。海光GM9-5602这个平台虽然在国内信创市场占有率不低,但不同批次的硬件配置可能有差异,显示控制器的固件版本也不一样。建议在装机前先查一下麒麟软件官方发布的硬件兼容性列表,或者直接联系硬件厂商确认他们有没有针对麒麟系统的驱动包。
如果查不到明确的信息,那就做好心理准备,可能会遇到驱动问题。提前准备好SSH远程登录的环境,这样即使显示有问题也能进去排查。
6.2 保留一个可用的远程管理通道
这次能快速定位问题,很大程度上是因为我提前接好了网线并且知道怎么通过SSH登录。如果当时没有网络,就只能对着黑屏干瞪眼,最后可能只能重装系统。
所以我的建议是:不管装什么国产系统,只要条件允许,一定要配置好远程管理通道。可以是SSH,也可以是串口控制台。有些服务器主板还支持IPMI或者BMC,那就更方便了。有了远程通道,即使显示挂了也能进去看日志、改配置。
6.3 不要迷信“默认配置能跑通”
很多国产化项目的文档里会写“支持XX平台”,但实际部署的时候往往会遇到各种意外。这不是说厂商在虚假宣传,而是因为硬件批次、固件版本、外设组合的差异太大了,厂商不可能覆盖所有情况。
我的经验是:永远准备一个Plan B。比如这次,如果黑名单方案也不行,我就准备换一个内核版本试试;如果换内核也不行,那就只能换一块独立的显卡来绕过板载显示控制器。多做几手准备,遇到问题才不会慌。
6.4 记录每一次踩坑的完整过程
这次排查过程中我详细记录了每一步的操作和观察到的现象,包括dmesg的输出、GRUB的修改、不同方案的效果对比。这些记录不仅对解决当前问题有帮助,以后遇到类似情况也能快速参考。
建议做信创适配的同行都养成这个习惯:建一个文档,按平台和系统版本分类,把每次遇到的问题、排查过程、最终方案都记下来。时间长了这就是一笔宝贵的经验财富,比任何官方文档都实用。
6.5 关注内核社区和厂商补丁的动态
海光平台的内核支持还在不断完善中,主线内核的更新、麒麟官方的补丁、硬件厂商的驱动包,这些都在持续迭代。这次用黑名单方案绕过去了,可能过几个月官方就发布了修复补丁,到时候就可以把黑名单去掉,恢复硬件加速。
所以不要觉得问题解决了就万事大吉,定期关注一下相关社区的动态,看看有没有新的解决方案。有时候一个内核参数的调整就能让性能提升一大截,这种信息往往不会主动推送到你面前,得自己去挖。
7. 如果黑名单方案也不管用:进阶排查思路
7.1 检查BIOS/UEFI里的显示输出设置
有些海光平台的BIOS里会有显示输出相关的选项,比如“Primary Display”可以选板载显示还是外接显卡,“Above 4G Decoding”影响大地址空间的分配。如果这些设置不对,即使驱动正常也可能黑屏。
建议进BIOS把显示相关的选项都看一遍,特别是如果有“IGD”或者“Onboard VGA”之类的选项,确认它是启用状态。另外,有些平台需要把“CSM”关掉,用纯UEFI模式启动,这样内核才能正确识别显示控制器。
7.2 尝试不同的内核启动参数组合
除了nomodeset,还有几个参数值得一试:
video=efifb:off:禁用efifb,强制用其他framebufferamdgpu.dc=0:禁用显示核心,用传统的显示路径amdgpu.dpm=0:禁用动态电源管理,有时候电源管理会导致初始化失败acpi=off:完全禁用ACPI,这个比较激进,但能排除ACPI相关的问题
这些参数可以组合使用,比如nomodeset amdgpu.dc=0。每次改完重启看效果,虽然麻烦但能逐步缩小问题范围。
7.3 用Live CD验证硬件是否正常
如果所有参数都试过了还是黑屏,可以用一个Ubuntu或者Fedora的Live USB启动一下,看看在别的Linux发行版下显示是否正常。如果Live CD能正常显示,说明硬件本身没问题,是麒麟系统的驱动适配有欠缺;如果Live CD也黑屏,那可能是硬件故障或者BIOS设置有问题。
这一步能帮你判断问题的边界,避免在软件层面白费功夫。
7.4 考虑外接显卡作为最终方案
如果板载显示控制器实在搞不定,而项目又必须用这台机器,那就只能上一块独立显卡了。选择显卡的时候要注意:优先选AMD的卡,因为amdgpu驱动对AMD的支持最好;NVIDIA的卡需要装闭源驱动,在国产系统上可能会遇到更多麻烦。
外接显卡之后,记得在BIOS里把主显示输出改成外接显卡,或者用video=参数指定用哪块卡输出。这样虽然增加了成本,但能彻底绕过板载显示控制器的兼容性问题。
8. 写在最后:国产化适配需要耐心和记录
这台海光GM9-5602装麒麟V11的黑屏问题,从发现到修复大概花了两个小时,其中大部分时间用在判断问题层级和验证不同方案上。真正改配置的操作其实很简单,就是加一个内核参数或者拉黑一个驱动模块。
但这两个小时的价值不在于最终的那几行配置,而在于排查过程中建立的判断逻辑:先确认系统运行状态,再定位问题层级,然后从临时方案到永久方案逐步推进,最后验证效果并评估影响。这套方法论适用于任何国产化平台的兼容性问题,不管是显示、网络还是存储。
国产化替代是一个长期的过程,硬件和软件的磨合需要时间。作为一线从业者,我们能做的就是遇到问题不慌,按逻辑排查,把每次踩坑的经验记录下来。这些经验积累起来,就是整个行业适配能力提升的基础。下次再遇到类似的黑屏问题,可能十分钟就能搞定,这就是经验的价值。