ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

麒麟V10救援模式显示异常排查与修复指南

麒麟V10救援模式显示异常排查与修复指南 我去年底接手过一台启动黑屏的麒麟V10-SP1机器当时第一个判断就是救援模式等真正进到救援模式才发现显卡驱动加载那段的显示问题比系统本身的故障还麻烦。这篇文章就结合麒麟桌面系统V10-SP1 2503这个版本把救援模式下显示异常这件事从头到尾拆清楚它到底是救系统时才会出现的显示问题还是平时启动就带的隐患以及怎么一步步把问题定位、修复、验证让后续维护少走弯路。这篇文章适合两类人看一类是刚拿到麒麟系统运维任务、还没碰到救援模式故障的新手另一类是已经被黑屏或花屏折磨过、想彻底搞清楚原理的老手。我会把现象分类、排查路径、具体命令和修改参数都用实际场景讲清楚保证可以直接照做。1. 先搞懂救援模式它和你的桌面系统到底什么关系1.1 救援模式是干什么的和单用户模式、紧急模式有什么不同救援模式翻译自rescue target在systemd体系下对应的是rescue.target。麒麟桌面系统V10-SP1作为典型的systemd发行版启动时会根据GRUB菜单或者内核参数选择进入哪一种目标状态默认图形界面graphical.target也就是我们平时看到的桌面环境。救援模式rescue.target加载最基础的文件系统和网络组件只启动少量服务目标是让你在系统起异常时还能进到一个命令行环境去修东西。紧急模式emergency.target比救援模式更“裸”几乎只挂载根文件系统还是只读的网络和日志服务都不启动适合应对极端的系统损坏。很多新手会把救援模式和单用户模式混为一谈。单用户模式是SysVinit时代的概念现在在麒麟系统上已经做了整合救援模式基本取代了单用户模式的日常用途。区别在于救援模式会尝试把文件系统挂到可用状态而紧急模式更保守。你平时在GRUB菜单里看到“救援模式”那一项执行的就是rescue.target。1.2 为什么救援模式下显示特别容易出问题救援模式最典型的特征就是不加载完整的桌面图形组件。这意味着你看到的不再是麒麟桌面那套图形界面而是内核帧缓冲fbcon驱动的字符终端。显卡相关的内核模块虽然会尝试加载但像NVIDIA私有驱动、AMD Modeset这些部分在救援环境里往往没有完整启用。分辨率、刷新率、色彩深度全部交给内核和固件去协商一旦协商失败就表现出黑屏、花屏、字体异常。更关键的是救援模式显示异常和系统日常启动的显卡配置是绑在一起的。系统里如果装了第三方闭源显卡驱动initramfs在启动阶段加载驱动模块的顺序、内核参数的设置都会影响救援模式的显示。平时图形桌面能正常显示很可能是因为Xorg或者Wayland的显示管理器在拉起图形栈时做了额外的模式设置和驱动加载到了救援模式这套图形栈完全没起来问题就暴露了。所以遇到救援模式显示异常不要只盯着救援环境本身要把它当成一次“不依赖桌面环境启动”的压力测试。它能把很多平时埋着的显卡配置问题逼出来。2. 显示异常的分类先判断你是哪一种“异常”处理显示问题最忌讳的就是上来就乱改参数。我习惯先按现象分门别类因为不同现象对应的故障层完全是两回事。2.1 黑屏但机器明显还在运行这是最常见、也最容易被误判为死机的情况。具体表现是进救援模式后屏幕全黑但机箱电源灯常亮硬盘指示灯间歇闪烁按大小写锁定键键盘灯还能切换。这种情况下系统其实已经在命令行等你输入只不过显示输出没有正确送到屏幕上。为什么会这样救援模式下内核帧缓冲没有正确初始化或者当前framebuffer的输出目标和你实际插的显示器接口不一致。笔记本平台还涉及核显、独显之间的输出切换救援模式默认走的是固件初始化时指定的GPU如果你的显示器接在另一个GPU上自然看不到画面。判断方法是盲操作先盲按回车再输入root和密码如果系统能接受输入可用CtrlAltF1到F6切换虚拟控制台试试说明系统活着只是显示链路断了。这时候最该做的是重新用另外的显式参数进入救援模式比如加nomodeset让内核放弃GPU的Modeset接管用最保守的VESA兼容模式输出画面很多黑屏问题立刻就好。2.2 花屏、噪点、画面撕裂花屏比黑屏更讲究。黑屏多数是显示输出没建立花屏则是输出建立了但方式不对。常见原因有两个面内核帧缓冲的像素格式和显示器实际的物理链路不匹配比如系统输出的是24位色深显示器却协商成16位颜色信息错乱就成了噪点。GPU的Modeset接管了分辨率切换但固件或者后续加载的驱动模块对当前显卡的分辨率支持列表不完整切换时踩了缓冲区参数错误。这种花屏在进入救援模式后的前几秒特别明显等到命令行界面稳定后可能部分恢复正常也可能一直花下去。遇到花屏重启后进入GRUB界面按E编辑内核引导行临时加上video参数固定一个保守的分辨率比如video1024x768如果能稳定显示说明就是高分辨率协商的问题。2.3 字体超大、模糊、错位救援模式正常显示时屏幕上是标准的Linux字符终端。有的机器进到救援模式后只有四五个字符占满全屏或者字与字之间撕裂错位看着像分辨率没协商成功。字体超大不是故障反而是内核默认vga控制台在低分辨率模式下的正常表现。当内核没有启用高分辨率帧缓冲支持时它会退回80x25文本模式分辨率大约只有640x480字体自然大得夸张。如果你觉得太大没法操作可以在GRUB引导行加上gfxpayload1024x768x24让内核在启动早期就切到一个适中的分辨率或者干脆接受低分辨率反正命令照样能敲。模糊和错位则不一样多半是GRUB的gfxpayloadkeep和内核fbcon发生了分辨率争夺。一个坚持用BIOS/固件设定的原生分辨率一个自己想切到别的方式结果就是时序错乱。2.4 卡在启动阶段连救援模式都进不去这种最麻烦。现象是GRUB菜单选救援模式后屏幕停在麒麟Logo、内核版本号或者黑屏闪烁光标的位置几分钟都没进展。它不是显示异常而是系统在启动早期就崩了显示正好停在一个“看起来像显示异常”的位置。这种情况要区分根因是initramfs解压失败、根文件系统找不到、关键系统服务启动级联失败还是显卡模块加载时死锁。死锁常见于NVIDIA驱动与nouveau并存、或者模块加载顺序冲突。判断方法是在GRUB引导行临时去掉quiet、splash加上systemd.log_leveldebug观察最后一屏输出停在哪个服务或模块上。停在文件系统挂载就是磁盘或fstab问题停在显卡模块就是驱动问题路径完全不同。3. 实操从哪进救援模式进去了怎么操作3.1 从安装介质进救援环境如果系统已经坏了GRUB菜单都进不去或者开机直接黑屏连BIOS信息都看不到那就需要用麒麟桌面系统V10-SP1的安装U盘或光盘来引导再从启动介质选择救援模式。具体操作插入安装介质开机按启动项快捷键不同主板品牌不一样常见的有F11、F12、Esc选择U盘启动。麒麟安装界面启动后通常会出现一个菜单其中包含“安装系统”和“救援模式”之类的选项。选择救援模式会先加载一个小型Linux环境然后让你选择需要修复的安装系统。这个方式的好处是救援环境完全独立于硬盘系统即使硬盘里的系统已经启动不了也能挂载它的根分区进行操作。缺点是要准备介质且救援环境的内核版本可能与原系统不一致但用来修复配置和重建initramfs完全够用。3.2 直接从GRUB进救援模式大部分情况下硬盘上的GRUB还能正常工作只是系统启动到一半就崩了。这时候不需要介质重启电脑在GRUB菜单出现时按方向键选择“高级选项”里面通常有一项“救援模式”。选中回车即可。还有一种更灵活的方式在GRUB菜单把光标停在默认启动项上按E进入编辑模式找到以linux开头的那一行在末尾追加systemd.unitrescue.target然后按CtrlX或F10启动。这个方法和菜单里的救援选项等效但好处是可以顺便追加nomodeset、video1024x768这些显示参数一次性解决“救援模式黑屏”的入场问题。三种方式对比如下进入方式适用场景显示可控性依赖条件安装介质救援GRUB损坏、系统完全进不去较高可加载介质自带驱动需要安装U盘/光盘GRUB菜单高级选项GRUB正常但系统崩溃中等可临时编辑参数本机GRUB可用GRUB手动追加rescue.target需要同时指定救援模式和显示参数最高可自由组合会编辑GRUB引导行3.3 救援环境里的基础操作挂载和读写权限进入救援模式后第一眼看到的提示通常是Give root password for maintenance或类似的中文提示。输入本机的root密码即可进入命令行。注意救援模式默认把根文件系统挂载为只读这是为了安全防止你在系统损坏状态下盲目写入数据。但我们要修系统就必须把它改为可写。# 确认当前挂载状态 mount | grep / # 重新以读写模式挂载根文件系统 mount -o remount,rw /有些复杂场景比如/boot分区独立、/home分区独立还得看/etc/fstab里的定义手动挂载缺失的分区。确认根文件系统可写之后才能执行编辑GRUB配置、重建initramfs这些修复操作。还要提醒一点救援模式下的hostname、环境变量和后台服务都是最简状态network服务不一定启动。需要联网下载驱动包的话先用nmcli或ip link确认网卡状态必要时手动开启网络服务。如果不需要联网建议保持断网减少救援环境的不确定性。4. 显示异常的核心修复路径4.1 先看日志再动手改参数很多人在救援模式里看到黑屏第一反应就是重装显卡驱动这是执行力太强、判断力跟不上。黑屏不等于驱动损坏也可能是驱动加载顺序问题、内核参数问题、甚至显示管理器残留配置问题。按下面顺序查日志能找到九成以上的真相。# 查看本机内核日志中关于显卡/帧缓冲的记录 dmesg | grep -Ei fb|drm|i915|nouveau|amdgpu|nvidia|vesa|vga # 查看上次启动的journal日志如果系统日志还能读 journalctl -b -1 | grep -Ei fail|error|drm|gpu|fb # 查看Xorg的日志如果桌面系统曾尝试启动 cat /var/log/Xorg.0.log 2/dev/null | grep -Ei EE|WW排查时的一个经验nuveau开源NVIDIA驱动模块在救援模式下偶尔会尝试接管显卡然后初始化失败屏幕就黑了。日志里能看到nouveau ... DRM: failed to create kernel channel之类的报错。确认是这个原因后直接在grub引导行把nouveau.modeset0加进去让内核不要加载nouveau的Modeset功能黑屏立竿见影地解决。读取日志还有一个技巧。救援模式下journalctl默认只显示本次启动的日志用-b -1看上一次启动的日志特别有用——因为你修复前最后那次崩溃就在上一次启动里它比当前救援环境的日志更接近故障现场。4.2 调整GRUB显示参数nomodeset、vga、gfxpayload日志只能告诉你哪里出问题真正修复往往还得靠GRUB参数。下面这三个参数是处理救援模式显示异常的“三板斧”优先级和适用场景完全不同。nomodeset——最推荐先试。它的含义是告诉内核不要执行KMS内核模式设置让显卡驱动不要接管显示模式的切换改用BIOS或固件已经设置好的模式。优点是万能兜底几乎对所有显卡表现友好缺点是会丢失一些高分辨率支持如果你的屏幕是4K画面会比较粗糙但至少能看清楚。gfxpayload1024x768x24——GRUB2专门负责给内核传递初始显示分辨率的参数。可以在GRUB编辑界面看到gfxpayloadkeep字样keep原意是保留GRUB阶段的分辨率但如果固件、GRUB、内核三方分辨率协商出现冲突就会导致错位。把它改成固定值能强制内核帧缓冲在一个明确的分辨率下工作。video1024x768——作用域更底层直接作用于fbcon的显示输出适合分辨率错乱、花屏的情况。它和gfxpayload的区别是前者管真实物理输出后者管内核接管前的分辨率约定。临时验证这些参数的方式是在GRUB编辑界面手动追加一次改一个重启看效果。确认那个参数有效后再把它写进持久配置# 编辑GRUB默认配置 vi /etc/default/grub # 找到 GRUB_CMDLINE_LINUX_DEFAULT 这一行比如说默认是 # GRUB_CMDLINE_LINUX_DEFAULTquiet splash # 可以改成 GRUB_CMDLINE_LINUX_DEFAULTquiet splash nomodeset video1024x768 # 重新生成GRUB配置 # 麒麟系统如果用GRUB2通常用这条 grub2-mkconfig -o /boot/grub2/grub.cfg # 如果提示找不到grub2-mkconfig就试试 grub-mkconfig -o /boot/grub/grub.cfg注意不同机器/boot/grub2/grub.cfg和/boot/grub/grub.cfg路径不一样生成前可以用ls /boot/grub*确认。写错路径不影响系统重启但会让新配置不生效白忙一场。4.3 修复显示管理器配置不只是在救援模式生效救援模式显示正常了重启进桌面还是黑屏或闪屏这时候问题从内核层转移到了显示管理器层。麒麟系统的显示管理器一般是LightDM也有的版本用SDDM它们的配置直接影响桌面登录界面的显示输出。在救援模式下把根文件系统切为读写后可以检查一下这些目录的配置# 查看显示管理器配置 cat /etc/lightdm/lightdm.conf 2/dev/null cat /etc/X11/xorg.conf 2/dev/null cat /etc/X11/xorg.conf.d/*.conf 2/dev/nullxorg.conf里常见的坑是Device段指定了错误的驱动标识比如机器换了显卡配置还写着旧驱动。处理思路是备份后把xorg.conf临时改名或删除让Xorg在启动时自动探测显卡。很多Linux发行版现在都不需要手写xorg.conf删掉反而能恢复默认自动识别。# 备份并移除旧配置除非你确定需要它 mv /etc/X11/xorg.conf /etc/X11/xorg.conf.bak.$(date %Y%m%d%H%M)LightDM等显示管理器也有一个隐藏问题如果之前手动修改过默认会话、或者设置了错误的分辨率参数重启后桌面环境会反复尝试初始化失败从救援模式看系统一切正常一进桌面就黑屏。此时恢复这些配置即可。判断是否走到这一步看日志里lightdm服务有没有反复重启。4.4 重建initramfs让内核模块在启动早期正确加载救援模式显示异常还有一个特别隐蔽的来源就是initramfs初始内存文件系统里的模块元数据陈旧。initramfs在系统安装或内核更新时生成里面包含了启动早期要加载的内核模块和固件。如果你换了显卡、更新了驱动或手动改过模块blacklist而initramfs没重新生成启动早期加载的模块顺序就是旧的可能会加载了互相冲突的显卡模块。重建initramfs是修复这类问题的标准操作同时也是最容易被忽略的一步。好在操作很简单# 如果你用的是dracut偏向RHEL风格 dracut -f # 如果你用的是initramfs-tools偏向Debian/Ubuntu风格 update-initramfs -u麒麟桌面系统V10-SP1不同小版本可能使用不同的initramfs生成工具两个命令都试试哪个存在用哪个。重建完成后重启看显卡相关模块在dmesg里是不是按预期加载。一个实操技巧有时候显卡驱动模块冲突严重其实可以更彻底一点把新的第三方驱动完全移除恢复使用开源的nouveau、amdgpu或i915模块。除非你有明确的GPU计算需求否则桌面日常使用用这些开源驱动绰绰有余。在救援模式下执行dmesg确认当前加载的显卡驱动模块然后对症处理。5. 常见问题与排查技巧实录5.1 救援模式显示异常速查表我把这几年来处理麒麟救援模式显示异常遇到的典型情况整理成一张表遇到类似问题可以直接对着查现象可能原因第一排查动作修复手段全黑屏但系统有反应fbcon未初始化、GPU输出链路错误盲按CtrlAltF1/F2切换TTY追加nomodeset并重启花屏/噪点/颜色错乱像素格式协商错误、Modeset冲突dmesg查fbcon和drm相关报错追加video1024x768字体错位/半屏闪动GRUB gfxpayload与内核分辨率冲突查看GRUB引导行的gfxpayload值改为gfxpayload1024x768x24启动卡Logo/黑屏光标根因可能在文件系统或模块死锁去掉quiet splash观察输出根据最后输出定位是文件系统还是显卡救援模式能显示、桌面黑屏Xorg/显示管理器配置错误查Xorg.0.log、lightdm服务状态备份删除xorg.conf并重启修改GRUB配置后不生效生成了错误的grub.cfg路径ls /boot/grub*确认路径用正确路径重新生成5.2 四条独家避坑经验先看懂再动手第一条修改任何系统文件之前先确认根文件系统是否可写。在救援模式下一个常见的悲剧是你辛苦执行了grub2-mkconfig、dracut -f等命令看起来全部执行成功实际因为根文件系统还是只读什么都没真正写进去重启后问题照旧。所以操作的第一步永远是mount -o remount,rw /并且在修改关键文件前用echo test /root/test.txt确认真的可写。第二条不要同时改多个参数。一次性加上nomodeset、video1024x768、gfxpayload1024x768x24如果问题解决了你不知道是哪个参数救的命如果没解决排查范围被互相掩盖。一次只加一个临时参数记录是否有效再进入持久配置。第三条注意救援模式下手工挂载分区的顺序。如果根文件系统是对的、但/boot没挂载上直接执行grub2-mkconfig很有可能会自己挂载或处理但也可能因为找不到/boot里的文件而报错。先挂载齐全再操作别让分区挂载事分心。检查mount输出如果/boot缺失在root可写后执行mount /dev/sdXX /boot/dev/sdXX要替换成实际boot分区。第四条搞不清状态时就断网。救援模式下如果开启了网络且配置了自动挂载远程存储可能导致启动时等待网络超时看起来像是显示卡住了。排查显示问题时优先把所有不相关的服务因素隔离掉让系统以最干净的方式进入救援模式。5.3 修复完别忘了验证从救援模式回到桌面的完整流程修复不是说改了配置重启就结束。我遇到过很多人修完救援模式显示正常但重启又黑屏原因不在显卡而是文件系统本身还有隐患。所以这里给一个建议的完整验证流程。先执行一次完整重启进入GRUB时先观察菜单本身是否显示正常。GRUB菜单显示异常说明固件和GRUB的分辨率协商就有问题这种情况即使内核参数调得再好启动过程也会伴随显示跳变。确认GRUB菜单正常后尝试正常启动桌面系统进入登录界面后观察是否有闪烁、撕裂、分辨率异常。桌面正常以后再重启一次进入救援模式确认救援模式的黑屏/花屏问题也同时修复。两个层级都验证通过才算彻底修复。因为很多参数对图形桌面的影响和对救援模式的影响并不完全同步只验证其中一边很容易留下尾巴。6. 搞定救援模式显示从“救火”变成“预防”写到这里我特别想把一个体会分享出来处理救援模式显示异常真正的收获往往不是“会修”而是重新理解了显卡驱动、内核参数、显示管理器三者之间的关系。以前觉得这些是桌面系统装好了就不用管的部分实际上一旦系统异常它们就是最后兜底的那条命。我个人在实操里最推崇的兜底画面是默认正常启动、但救援模式始终不加载任何危险模块的状态。你可以提前在/etc/modprobe.d/里给某些显卡驱动模块加上blacklist这样即使系统出了大问题需要救援也不会因为模块冲突重演黑屏。这是一种很划算的预防成本。再提前做一点“顺手事”在系统健康时就备份/etc/default/grub和/etc/X11/xorg.conf如果有的话。真到救援模式的时候你不仅知道原始配置长什么样还能对比是哪些设置被改动导致了当前问题。这个习惯帮我省过不止一次从头排查的时间。救援模式显示异常不是什么神秘故障它只是Linux启动链路在最精简环境下的一次“亮底牌”。把这张底牌的每一层都理解了你就能在关键时刻把“救火”变成从容的系统维护。最后再提一句遇到黑屏先别急着重装系统九成问题都出在启动早期那几秒钟的参数和模块加载顺序里冷静排查很快就会有结论。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进