LinPad OS 桌面起不来、先分显示链路和输入链路两段看

文章导读
桌面起不来时,黑屏和键鼠无反应经常同时出现,很容易被当成一个故障去改:换内核参数、重装桌面环境、清配置,越改变量越多。更稳的做法是先把问题拆成两条独立链路:显示链路看“画面有没有被画出来并送到屏幕上”,输入链路看“按键和触摸有没有进入会话”。两条链路各自能单独验证,验证结果组合起来才能定位到具体一层,改动才不会互相掩盖。
📋 目录
  1. Ⅰ 显示链路第一段:图形设备是否被识别
  2. Ⅱ 显示链路第二段:合成器有没有接管输出
  3. Ⅲ 输入链路第一段:事件设备能不能读到
  4. Ⅳ 输入链路第二段:会话有没有拿到事件
  5. Ⅴ 四条结果组合成结论
A A

桌面起不来时,黑屏和键鼠无反应经常同时出现,很容易被当成一个故障去改:换内核参数、重装桌面环境、清配置,越改变量越多。更稳的做法是先把问题拆成两条独立链路:显示链路看“画面有没有被画出来并送到屏幕上”,输入链路看“按键和触摸有没有进入会话”。两条链路各自能单独验证,验证结果组合起来才能定位到具体一层,改动才不会互相掩盖。

LinPad OS 桌面起不来,建议先分两段排查:显示链路先看 /dev/dri 与 /sys/class/drm 确认显卡和输出接口被内核识别,再看合成器进程与会话日志确认输出有没有被接管;输入链路先用 evtest 或 libinput debug-events 确认事件进入系统,再用终端切换和权限检查确认事件有没有到达会话。两段结果组成四种组合,分别指向内核/驱动、合成器、设备层、会话层四类改动方向。具体命令名和路径需要结合具体发行版与桌面环境确认。

显示链路第一段:图形设备是否被识别

这一段只回答一个问题:底层图形设备和输出接口在系统里存不存在。不存在的话,后面查合成器没有意义。

ls -l /dev/dri/
ls /sys/class/drm/
cat /sys/class/drm/card0-*/status
dmesg | grep -iE 'drm|i915|amdgpu|msm|panfrost|panel|edp|hdmi' | tail -n 50

输出解读:/dev/dri 下通常应能看到 card0 和 renderD128,只有 render 节点没有 card 节点,说明内核没把显示控制器暴露出来。/sys/class/drm 下每个 connector(如 card0-eDP-1、card0-HDMI-A-1)都带一个 status,值为 connected 表示内核认为有屏接着,disconnected 表示没探测到,内嵌面板一般应显示 connected。

识别不到时往这几个方向查:内核模块是否加载(lsmod | grep -E 'i915|amdgpu|msm|panfrost');dmesg 里有没有固件加载失败、panel 初始化超时、I2C 触摸或背光控制器报错;启动参数里是否带着 nomodeset 之类的禁用项;设备树或 ACPI 里有没有对应显示控制器节点。背光故障和链路故障容易混淆,可以在全黑屏状态下用手电斜照屏幕,能看到极暗的桌面轮廓,说明画面其实画出来了,只是背光没开,此时排查方向应转到背光控制而不是显卡驱动。

LinPad OS 桌面起不来、先分显示链路和输入链路两段看

显示链路第二段:合成器有没有接管输出

设备存在之后,要看画面是没人画,还是画了没送到屏上。两者日志表现不同。

ps -eo pid,user,cmd | grep -E 'gnome-shell|kwin_wayland|sway|weston|Xorg|Xwayland'
loginctl list-sessions
loginctl show-session <ID> -p Type -p Active -p State
journalctl -b -p err | tail -n 50
journalctl `--user` -b | grep -iE 'compositor|wayland|drm|output|renderer' | tail -n 50

两种失败形态的区分点:

  • 合成器进程不存在或反复重启:日志里能看到启动失败、依赖缺失、GPU 权限不足、配置解析错误。loginctl show-session 里 State 不是 active,说明会话根本没起来。改动方向是会话启动栈和合成器配置,不是显示输出。
  • 合成器进程在、日志没有致命错误,但屏幕仍然无输出:常见是输出目标选错(connector 未启用、外接屏被当作主屏、模式或缩放不被面板接受),也可能是 DRM master 被另一个图形进程占着,比如旧 Xorg 没退干净。检查点是 /sys/class/drm/card0-*/status 为 connected,而合成器日志里没有对应的 output enabled 记录,这基本可以判定输出没被接管。

输入链路第一段:事件设备能不能读到

这一段先确认按键和触摸有没有变成系统能读到的事件,与界面是否响应无关。

LinPad OS 桌面起不来、先分显示链路和输入链路两段看
ls /dev/input/by-path/
grep -A5 -iE 'keyboard|touch|mouse' /proc/bus/input/devices
sudo evtest /dev/input/eventX
# 或者
sudo libinput debug-events `--show-keycodes`

判定标准很直接:按下按键时段终端应出现 EV_KEY 行,触摸屏滑动应出现 EV_ABS 坐标变化。有事件输出,说明设备识别、驱动和读取权限这一段是通的。没有事件输出,先查设备层:USB 或 I2C 触摸控制器是否被枚举、hid 相关模块是否加载、设备是否被别的进程独占抓走。

读到事件但界面完全无反应,不要继续在设备层加参数,应转到会话层,看事件是不是被合成器丢了。

输入链路第二段:会话有没有拿到事件

事件能读到、界面没反应,问题通常落在权限、焦点或会话输入路径三处。建议先做一次终端切换对照实验,这一步能把范围切得很干净。

LinPad OS 桌面起不来、先分显示链路和输入链路两段看
  1. 按 Ctrl+Alt+F2 切到文本终端,登录后在 VT 里执行 sudo evtest 并按键。
  2. VT 里能读到事件,说明设备和权限都没问题,故障在会话侧(合成器未启动、输入设备没被加入 seat、焦点被别的层抢走)。
  3. VT 里也读不到,回到第一段继续查设备层。
  4. 再切回图形会话(通常是 Ctrl+Alt+F1 或 F7),观察合成器是否恢复响应。

权限与焦点侧要确认的点:ls -l /dev/input/event* 与 getfacl /dev/input/eventX 看当前登录用户有没有读权限,seat 分配是否把设备给了正确会话;loginctl show-session <ID> -p Active 为 no 时会话收不到输入属正常现象;窗口管理器侧确认是否存在全屏置顶窗口或弹层长期持有焦点。另一个对照实验是接一个 USB 键盘:只有内置键盘失效说明是特定设备或特定驱动的问题,外接键盘也失效则更可能是会话层整体没拿到输入。

四条结果组合成结论

两条链路各取一个结论(通 / 不通),组合起来就是四个方向。这里的“通”指该链路按上面的判定标准能自证通过,不是“看起来像好了”。

组合现象优先改动方向
显示通 + 输入通设备与合成器都正常,桌面仍不可用往会话内层查:桌面主程序崩溃、自动登录循环、锁屏或欢迎界面卡住、磁盘满或用户目录权限异常。重点看 journalctl `--user` -b 中桌面主进程的退出记录。
显示通 + 输入不通能看到画面但键鼠不响应锁定在输入会话层:seat 设备分配、/dev/input 权限与 ACL、焦点持有者、合成器的输入后端是否启用。设备层已验证过,不必再动内核参数。
显示不通 + 输入通屏幕无画面,但 VT 或日志证明按键有效锁定在显示后段:合成器启动失败、输出目标选错、DRM master 被占、背光未开。按显示第二段两种失败形态分别处理。
显示不通 + 输入不通两条链路都没自证通过优先查共同前置条件:内核是否正常启动、显卡与输入控制器是否都没被识别(多见于供电、设备树、内核版本或恢复模式启动)、系统是否停在 initramfs。先让系统进到能登录的 VT,再回到前两段复测。

表格用起来的关键是顺序:先各自独立验证,拿到结论再对照,不要在两条链路同时改配置。每改一处,回到对应段的命令重测一次,把“改了什么、哪一段从不通过变成通过”记下来,下次遇到同类问题能直接跳到对应象限。