[ Content contribution] 修复deepin V25的GRUB在2012款Mac Pro中显示异常的问题
Tofloor
poster avatar
燕戏竹林
deepin
2026-10-09 17:25
Author

修复deepin V25的GRUB在2012款Mac Pro中显示异常的问题

作者信息:
浣软科技 HuanSoft · 燕戏竹林
deepin 生态共建组成员

前言

手里有台 2012 款 Mac Pro(MacPro5,1),装了 deepin V25。开机引导时遇到一个怪现象:

  • deepin 自带的 GRUB 菜单完全不显示画面——纯黑屏,但方向键、回车都有效,等一会儿还能正常自动进系统;
  • 同样的电脑,插一个 Ventoy U 盘,它的 GRUB 菜单却显示得好好的,主题壁纸都有;
  • 后来换 rEFInd 引导也一切正常。

也就是说系统没坏,引导没坏,唯独 deepin 的 GRUB 菜单"有画面但看不见"。

实在受不了每次盲按回车,我妥协装了 rEFInd——引导是正常了,但 rEFInd 有个烦人的弊端:它每次都现场扫描引导分区来找内核,系统升级、内核换版之后,缺省启动项可能就悄悄变了(选中旧内核、甚至选中不该选的条目),又得翻它的配置文件去修。引导层多维护一套配置,纯属无谓消耗。与其长期伺候 rEFInd,不如回头把 GRUB 黑屏研究明白。

最近这个问题彻底查清楚了,结论先放这里:

一句话结论:这是 GRUB 2.12 的一个已知缺陷(上游 bug 编号 #65503)。Ventoy 能显示,纯粹是因为它自带的是不带这个缺陷的老版本 GRUB。修复方法只需要加一行"废话"。
flowchart LR M["2012款 Mac Pro 开机"] --> A["deepin GRUB:黑屏,键盘却有效"] M --> B["Ventoy 的 GRUB:菜单与主题正常"] M --> C["rEFInd:正常"] style A fill:#e6482e,color:#fff style B fill:#40c057,color:#fff style C fill:#40c057,color:#fff

同一个 BIOS、同一块显卡、同样是 GRUB——为什么只有 deepin 的黑屏?带着这个问号开始排查。

排查过程:四步排除法

flowchart TD S["黑屏现象"] --> Q1{"怀疑一:分辨率被写死?"} Q1 -->|改成固件当前画面| T1["仍黑:但修正了一个真问题"] T1 --> Q2{"怀疑二:主题皮肤渲染故障?"} Q2 -->|去掉全部主题| T2["仍黑:主题排除"] T2 --> Q3{"验证:文本模式菜单活着吗?"} Q3 -->|强制纯文本终端| T3["文字菜单正常出现:病灶锁定图形终端"] T3 --> Q4{"检索上游缺陷库:图形菜单黑屏 2.12"} Q4 --> T4["命中 bug 65503:一行 echo 即可绕行"] style T3 fill:#40c057,color:#fff style T4 fill:#40c057,color:#fff style T1 fill:#adb5bd,color:#fff style T2 fill:#adb5bd,color:#fff

第一步:怀疑分辨率

抓取 deepin 的 grub.cfg 发现菜单分辨率被写死成了显示器的原生分辨率 1280x1024(deepin 桌面服务根据显示器 EDID 自动写的)。而这台老 Mac 的显卡走的是苹果老 EFI 固件独有的 UGA 显示协议——它不支持中途切换分辨率,任何与"固件当前画面"不一致的请求都会失败。

把分辨率改成 auto(即使用固件当前画面)后重启:依然黑屏。改对了一个问题,但不是全部。

第二步:怀疑主题

菜单背景、中文字体这些"皮肤"(gfxmenu 主题)在某些硬件上渲染出问题会导致整块黑。去掉主题、只留朴素图形菜单:依然黑屏。主题排除。

第三步:验证文本模式是否活着

给 GRUB 配置强制"纯文本终端"模式(GRUB_TERMINAL=console),完全不碰图形画面。重启——蓝底白字的文字菜单出现了,键盘操作一切正常!

这一步很关键:说明 GRUB 本体、显示硬件、键盘链路全都是好的,问题精确锁定在"图形终端(gfxterm)接管之后画面不上屏"。

第四步:定位上游缺陷

带着"2.12 图形菜单黑屏、老硬件"这两个关键词检索,命中了 GRUB 官方缺陷库的 Savannah bug #65503:

  • 官方定性:2.12 的回归缺陷,2.06 完全正常——这正好解释了为什么自带老版 GRUB 的 Ventoy 能显示;
  • 有用户在 苹果 iMac 9.1 上复现,症状与本文一模一样;
  • 缺陷本质(通俗版):图形终端接管画面后,如果接管之前屏幕上没有任何文字输出"垫场",GRUB 画出来的菜单就永远不会被"推"上屏幕——画是画了,只是显示不出来;
  • 帖子给出的解法也极其朴素:在切换到图形终端之前,先让它往文本屏幕打印一行任意内容。有人用一行 echo 治好了自己的 ThinkPad,也有人发现开启调试输出(它会顺带先打一堆日志)同样能治好,两个现象互相印证了机理。

修复方法

原理一张图说清——修复只是给图形接管"垫"一行字:

flowchart LR subgraph S1["修复前:黑屏"] A1["GRUB 启动"] --> A2["图形终端直接接管画面"] --> A3["菜单画好了,却永远刷不上屏"] end subgraph S2["修复后:正常"] B1["GRUB 启动"] --> B2["先输出一行 echo 给文本屏垫场"] --> B3["图形终端接管后菜单正常显示"] end style A3 fill:#e6482e,color:#fff style B3 fill:#40c057,color:#fff

以下操作在 deepin V25 桌面终端执行(会要求输入密码):

1. 新建一个引导配置片段,让 GRUB 在切图形画面前先输出一行文字:

pkexec tee /etc/grub.d/00_a_earlyecho << 'SCRIPT'
#!/bin/sh
# Workaround for Savannah bug #65503: gfxterm shows no output
# unless something was printed to the text console before it.
cat << 'EOF'
echo "Loading bootloader..."
EOF
SCRIPT
pkexec chmod 755 /etc/grub.d/00_a_earlyecho

文件名以 00_a 开头是为了让它排在所有配置片段的最前面(这行 echo 必须出现在图形接管之前)。

2. 把菜单分辨率固定为"固件当前画面"(本机 UGA 唯一可行的模式),并覆盖 deepin 桌面服务写死的分辨率:

pkexec tee /etc/default/grub.d/99-apple-uga-fix.cfg << 'EOF'
GRUB_GFXMODE=auto
EOF

说明:deepin 的桌面服务会把 /etc/default/grub.d/11_dde.cfg 里的 GRUB_GFXMODE 写成显示器原生分辨率,在老 Mac 上这会直接导致黑屏。上面这个以 99- 开头的文件加载顺序在所有配置之后,可以稳定覆盖它,也不用怕桌面服务以后改写。

3.(本机显卡环境需要)指定 GRUB 使用苹果老 EFI 的 UGA 显示驱动:

pkexec grub-editenv /boot/grub/grubenv set video_backend=efi_uga

4. 重新生成 GRUB 菜单并检查:

pkexec update-grub
pkexec grep -nE 'echo .Loading bootloader|terminal_output gfxterm|set gfxmode=' /boot/grub/grub.cfg

三个关键行都应该存在,且 echo 那一行的行号必须小于 terminal_output gfxterm。

5. 把 deepin 的引导项设为第一启动(rEFInd 保留作后备):

pkexec efibootmgr -o 0000,0001,0003,0002,0080

(编号以你自己 pkexec efibootmgr -v 的输出为准,0000 是 deepin、0001 是 rEFInd。)

重启,你会先看到一行 "Loading bootloader..." 闪过,然后——deepin 的主题图形菜单正常显示。

后记

三点说明,避免误解和后顾之忧:

  1. 这是临时绕行方案,不是根治。 等 deepin 仓库收录了修复该缺陷的 GRUB 新版本后,按下方折叠块退出即可。
  2. 菜单分辨率不会全屏。 老 Mac 的 UGA 协议没有切分辨率的能力,菜单画面=固件开机画面。这是硬件协议的历史天花板,不是修复没做完。
  3. rEFInd 建议先留着(排在第二启动位)。稳定运行一阵子后,再决定是否卸载。
▸ 万一需要回退:如何一键恢复原样
pkexec rm -f /etc/grub.d/00_a_earlyecho /etc/default/grub.d/99-apple-uga-fix.cfg
pkexec grub-editenv /boot/grub/grubenv unset video_backend
pkexec update-grub

万一 GRUB 又黑屏进不去系统:开机时按住 Option (Alt) 键,在苹果启动选择器里选 rEFInd,即可照常进入系统再排查。

▸ 将来上游修复后:如何优雅退出本方案

只需删除垫场脚本并重新生成配置(另两项对现代硬件无害,可留):

pkexec rm -f /etc/grub.d/00_a_earlyecho
pkexec update-grub

判断标准:grub --version 不再是 2.12 系列,或社区不再复现该问题时,即可清理。

参考资料:

deepin,友你更好!

Reply Favorite View the author
All Replies

No replies yet