CachyOS 启动黑屏排查:Intel 核显外接显示器与 ACPI 盖子状态的冲突
2026-08-19
INFO
本文有部分 AI 参与,但都是我的真实经历,可以放心阅读 :)
摘要 (TL;DR)
在使用 Limine 引导 CachyOS 时,若在开机后立即合上笔记本盖子,系统有概率在加载内核后出现黑屏死机(外接显示器有信号但无画面,SysRq 无响应)。
根本原因:开机秒合盖导致 UEFI 传递给内核的 ACPI 盖子状态(_LID)与显示输出路由状态发生冲突,引发 Intel i915 驱动在早期 KMS(内核模式设置)接管时发生 GPU 状态机死锁。
解决方案:在 Limine 启动参数中添加 button.lid_init_state=open 等参数,覆盖初始状态并禁用部分激进的显示节能特性。
1. 问题背景与环境
- 硬件环境:搭载 Intel 集成显卡的笔记本,通过 Type-C 接口连接外部显示器。
- 软件环境:CachyOS,使用 Limine 作为引导加载器(Bootloader)。
- 触发条件:按下电源键后,在 Limine 引导界面出现前(或刚出现时)立即合上笔记本盖子。
故障现象
- Limine 倒计时正常结束,开始加载内核及 initramfs。
- 随后屏幕黑屏,但外接显示器提示有视频信号输入。
- 笔记本风扇正常运转,但系统完全无响应。
- 键盘输入无效,按下
SysRq组合键(REISUB)无任何反馈,只能强制断电重启。重启后通常可正常进入系统。
2. 问题分析与排查
2.1 现象拆解
- 有信号但黑屏:说明内核已经接管了显示输出,Type-C 接口的 DP Alt Mode 已成功握手并输出了底层视频时序,但 GPU 渲染管线卡死,或帧缓冲控制台(fbcon)未能成功渲染画面。
- SysRq 无响应:说明死锁发生在极早期的驱动
probe(探测)阶段。此时内核可能屏蔽了中断,或处于不可中断睡眠状态(D state),导致键盘输入和 SysRq 中断无法被处理。
2.2 核心疑点:内核未启动,ACPI 如何产生影响?
一个自然的疑问是:合盖时内核尚未加载,ACPI 事件不可能直接发送给内核,为何会导致内核死锁?
事实上,问题不在于“事件传递”,而在于 “状态继承”(State Inheritance)。
- UEFI 阶段:开机秒合盖时,主板 EC(嵌入式控制器)检测到合盖。UEFI 在初始化 Intel 核显并设置 GOP(图形输出协议)时,会将显示路由至 Type-C 接口,并在 ACPI 表中将
_LID(盖子状态)标记为Closed。 - Bootloader 阶段:Limine 继承了 UEFI 的 GOP 状态,因此能正常在外接显示器上显示菜单。
- Kernel 阶段(冲突点):内核启动,
i915驱动开始进行 KMS 接管。驱动读取 ACPI 表发现_LID = Closed,试图在“UEFI 留下的 Type-C 输出状态”与“ACPI 要求的关闭内屏状态”之间重新配置显示管线。由于 Intel Type-C/DP 握手对状态变化极为敏感,这种底层状态机的冲突直接导致了 GPU 硬件死锁(GPU Hang)。
3. 解决方案
定位到是 i915 驱动在早期初始化时因状态冲突而死锁后,解决思路是:禁用部分激进的显示节能特性,并覆盖初始盖子状态,使驱动安全度过 KMS 接管阶段。
编辑 Limine 配置文件(通常为 /boot/limine.conf),在 CachyOS 启动项的 cmdline 末尾追加以下参数:
button.lid_init_state=open这个参数强制内核在初始化时忽略 BIOS 传递的 _LID 状态,默认盖子为打开状态,避免 i915 驱动在接管时因状态冲突而死锁。
INFO
CachyOS 默认使用 limine-entry-tool 创建启动项,这种情况下就要在 /etc/default/limine 中添加参数:
ESP_PATH="/boot"
KERNEL_CMDLINE[default]+="quiet nowatchdog splash rw ....."
KERNEL_CMDLINE[default]+="quiet nowatchdog splash rw ..... button.lid_init_state=open"
BOOT_ORDER="*, *lts, *fallback, Snapshots"TIP
此外,如果遇到其他显示问题,也可以尝试以下参数:
plymouth.disable=1:禁用 Plymouth 开机动画。动画在早期会频繁切换显示模式,禁用后可降低早期显示切换卡死的概率。i915.enable_psr=0:禁用 Panel Self Refresh(面板自刷新)。这是 Intel 笔记本外接显示器黑屏/闪屏的常见诱因。i915.enable_dc=0:禁用 Display C-states(显示深度节能),防止 Type-C 握手时因节能状态切换失败而卡死。
4. 机制探讨与常见疑问
在应用上述参数后,有两个关于 ACPI 盖子状态处理机制的疑问值得探讨。
Q1:强制覆盖初始状态,是否会影响运行时的正常合盖处理?
不会。acpi.button.lid_init_state=open 仅在内核极早期初始化阶段生效,提供一个“默认初始值”。Linux 内核处理盖子状态是事件驱动(Event-driven) 的。 系统启动完成后,主板 EC 持续监控物理盖子。当发生物理开合时,EC 会发送 ACPI 中断(SCI),内核捕获中断后会重新读取真实的硬件寄存器状态,并通知桌面环境(如触发锁屏或休眠)。该参数不会屏蔽运行时的硬件中断。
Q2:为什么进入系统后,读取盖子状态依然显示为 closed?
在终端执行 cat /proc/acpi/button/lid/*/state,即使添加了上述参数,状态依然会显示 state: closed。
这是因为参数仅作为“早期心理暗示”,防止内核在 KMS 接管前激进地切断显示输出。当系统成功进入桌面,i915 驱动完成 KMS 接管后,内核再次读取主板 EC 的 ACPI _LID 方法时,EC 会如实反馈物理上的 closed 状态。只要显示管线已稳定建立,内核便不会再重置硬件状态,系统可正常运行。这也侧面印证了系统已安全度过最易发生死锁的早期初始化阶段。
5. 总结
“开机秒合盖导致黑屏”是一个典型的由固件(UEFI/BIOS)初始状态继承引发的 Linux 显卡驱动早期死锁问题。通过合理配置内核参数,覆盖冲突的初始状态并关闭不稳定的节能特性,可以有效绕过此类硬件/固件协同 Bug。
对于使用 Intel 核显并外接显示器的 Linux 用户,若遇到类似的启动黑屏或早期死锁问题,本文提供的参数组合可作为排查和解决的参考。