桌面起不来时,黑屏和键鼠无反应经常同时出现,很容易被当成一个故障去改:换内核参数、重装桌面环境、清配置,越改变量越多。更稳的做法是先把问题拆成两条独立链路:显示链路看“画面有没有被画出来并送到屏幕上”,输入链路看“按键和触摸有没有进入会话”。两条链路各自能单独验证,验证结果组合起来才能定位到具体一层,改动才不会互相掩盖。
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 里有没有对应显示控制器节点。背光故障和链路故障容易混淆,可以在全黑屏状态下用手电斜照屏幕,能看到极暗的桌面轮廓,说明画面其实画出来了,只是背光没开,此时排查方向应转到背光控制而不是显卡驱动。
显示链路第二段:合成器有没有接管输出
设备存在之后,要看画面是没人画,还是画了没送到屏上。两者日志表现不同。
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 记录,这基本可以判定输出没被接管。
输入链路第一段:事件设备能不能读到
这一段先确认按键和触摸有没有变成系统能读到的事件,与界面是否响应无关。
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 相关模块是否加载、设备是否被别的进程独占抓走。
读到事件但界面完全无反应,不要继续在设备层加参数,应转到会话层,看事件是不是被合成器丢了。
输入链路第二段:会话有没有拿到事件
事件能读到、界面没反应,问题通常落在权限、焦点或会话输入路径三处。建议先做一次终端切换对照实验,这一步能把范围切得很干净。
- 按
Ctrl+Alt+F2切到文本终端,登录后在 VT 里执行sudo evtest并按键。 - VT 里能读到事件,说明设备和权限都没问题,故障在会话侧(合成器未启动、输入设备没被加入 seat、焦点被别的层抢走)。
- VT 里也读不到,回到第一段继续查设备层。
- 再切回图形会话(通常是
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,再回到前两段复测。 |
表格用起来的关键是顺序:先各自独立验证,拿到结论再对照,不要在两条链路同时改配置。每改一处,回到对应段的命令重测一次,把“改了什么、哪一段从不通过变成通过”记下来,下次遇到同类问题能直接跳到对应象限。