← 返回首页

SIGNAL · POST

树莓派使用 MHS35-show 后无法通过 VNC 连接的原因说明

约 7 分钟阅读 bajiu 青年大学习

一、问题现象

在树莓派上执行 MHS35-show 脚本后,3.5 寸小屏可能可以正常显示,但原本可用的 VNC 远程桌面连接失效,表现通常包括:

  • VNC 客户端无法连接到树莓派
  • 可以 ping 通树莓派,但 VNC 黑屏或连接失败
  • SSH 仍然可以连接,但图形桌面无法远程访问
  • 系统启动后只进入命令行界面,没有桌面环境

二、核心原因

MHS35-show 并不只是“安装一个屏幕驱动”,它会直接修改树莓派的显示配置,使系统从默认的图形显示路径切换到适配 3.5 寸 SPI 小屏的一套旧式显示方案。

这会影响 VNC 正常工作。

1. 修改了 /boot/config.txt 或显示相关配置

该脚本通常会写入类似如下参数:

dtoverlay=mhs35
dtparam=spi=on
hdmi_force_hotplug=1
hdmi_group=2
hdmi_mode=87
hdmi_cvt 480 320 60 6 0 0 0

这些设置会改变树莓派原本的显示输出方式。

2. 使用旧式 framebuffer / fbcp / fbturbo 方案

MHS35-show 常会安装或启用以下兼容组件:

  • fbcp
  • fbturbo
  • SPI framebuffer 驱动

这类方案本质上是把桌面内容“复制”到 SPI 小屏,而不是走现在更标准的 DRM / KMS / Wayland 图形栈。

3. VNC 依赖正常的图形桌面会话

树莓派上的 VNC 不是简单地抓取任意 framebuffer,而是依赖系统能够正常启动图形桌面环境。

一旦 MHS35-show 导致以下情况,VNC 就会失效:

  • 图形桌面没有成功启动
  • 显示输出被切换到 VNC 不支持的方式
  • 新版系统的显示架构与旧驱动脚本不兼容

三、为什么 SSH 还能连,但 VNC 连不上

这是这类问题中最常见的现象。

原因是:

  • SSH 只依赖网络和系统服务,哪怕系统没有图形界面,也通常还能连接
  • VNC 依赖图形桌面环境,如果桌面没有正常运行,VNC 就无法共享桌面

因此:

SSH 能连,并不代表图形系统正常;很可能只是桌面已经被 MHS35-show 改坏了。


四、最常见的几种具体情况

情况 1:系统没有进入桌面,只进入命令行

如果安装 MHS35-show 后系统启动进入终端文本界面,而不是图形桌面,那么 VNC 无法提供远程桌面。

情况 2:VNC 服务还在,但抓不到有效桌面

即使 VNC 服务本身仍然开启,只要显示输出方式已经被切换到旧式 framebuffer,VNC 也可能无法抓取正确画面。

情况 3:新版 Raspberry Pi OS 与旧驱动脚本不兼容

如果你使用的是较新的 Raspberry Pi OS(尤其是 Bullseye / Bookworm 及之后的版本),MHS35-show 这种旧式 LCD 驱动脚本与当前桌面显示架构常常存在兼容性问题。


五、排查思路

建议先通过 SSH 登录树莓派,然后依次检查。

1. 检查设备是否在线

ping raspberrypi.local

或者:

ssh 用户名@raspberrypi.local

2. 检查图形桌面服务状态

systemctl status display-manager --no-pager

如果这里显示桌面管理器未启动、启动失败或报错,说明图形界面本身已经有问题。

3. 检查当前会话类型

echo $XDG_SESSION_TYPE

它可能返回:

  • x11
  • wayland
  • 空值

如果没有正常图形会话,VNC 通常也无法工作。

4. 检查启动配置文件

较老系统通常看:

cat /boot/config.txt

较新系统有时是:

cat /boot/firmware/config.txt

重点看是否存在:

dtoverlay=mhs35
hdmi_force_hotplug=1
hdmi_group=2
hdmi_mode=87
hdmi_cvt 480 320 60 6 0 0 0

如果这些参数已经写入,基本可以确认 MHS35-show 已经接管了显示配置。

5. 检查 VNC 是否启用

sudo raspi-config nonint do_vnc 0

这条命令会启用 VNC。

你也可以查看相关服务状态,但很多时候即使服务开着,只要桌面本身异常,VNC 仍然无法正常使用。


六、解决思路

方案一:先恢复默认显示配置,再测试 VNC

这是最稳妥的办法。

你可以先把 config.txt 中由 MHS35-show 添加的内容注释或删除,例如:

# dtoverlay=mhs35
# hdmi_force_hotplug=1
# hdmi_group=2
# hdmi_mode=87
# hdmi_cvt 480 320 60 6 0 0 0

保存后重启:

sudo reboot

然后重新测试:

  • 是否恢复正常桌面
  • VNC 是否可连接

方案二:重新启用图形桌面和 VNC

如果系统只是掉回了命令行模式,可以尝试重新设置启动到桌面:

sudo raspi-config

进入后检查:

  • 是否设置为启动到 Desktop
  • 是否启用了 VNC

也可以直接执行:

sudo raspi-config nonint do_vnc 0

方案三:不要继续使用这类旧式 LCD-show 脚本

如果你使用的是较新的树莓派系统版本,建议尽量避免继续依赖 LCD-show / MHS35-show 这一类老脚本。

原因是:

  • 它们大量依赖旧式 framebuffer 技术
  • 与当前 Raspberry Pi OS 的图形架构兼容性较差
  • 很容易破坏 HDMI、桌面环境和 VNC
  • 出问题后恢复成本较高

如果必须使用这块 3.5 寸小屏,更建议查找:

  • 该屏幕针对当前 Raspberry Pi OS 版本的新版驱动
  • 是否支持更标准的 DRM/KMS 显示方式
  • 是否有专门适配 Bookworm/Bullseye 的安装方法

七、结论

树莓派在执行 MHS35-show 之后无法使用 VNC,根本原因通常不是网络问题,而是:

MHS35-show 修改了系统显示栈,使图形桌面不再以 VNC 可识别的标准方式运行。

因此 VNC 失效通常来自以下几个方面之一:

  • 图形桌面未成功启动
  • 显示输出改成了旧 framebuffer 方式
  • 新系统与旧小屏驱动不兼容
  • VNC 服务虽然开启,但没有可共享的有效桌面

八、建议的实际处理顺序

建议按下面顺序操作:

  1. 先确认树莓派还能通过 SSH 登录
  2. 检查 display-manager 是否正常
  3. 检查 /boot/config.txt/boot/firmware/config.txt
  4. 暂时移除 dtoverlay=mhs35 等配置
  5. 重启测试桌面是否恢复
  6. 重新启用 VNC
  7. 确认系统版本后,再决定是否继续使用该小屏驱动

九、可直接执行的命令汇总

# 连接树莓派
ssh 用户名@raspberrypi.local

# 查看桌面服务状态
systemctl status display-manager --no-pager

# 查看当前会话类型
echo $XDG_SESSION_TYPE

# 查看显示配置(老系统)
cat /boot/config.txt

# 查看显示配置(新系统)
cat /boot/firmware/config.txt

# 启用 VNC
sudo raspi-config nonint do_vnc 0

# 重启
sudo reboot

十、补充说明

如果你愿意进一步排查,最有价值的是把下面三项结果贴出来:

cat /boot/config.txt
# 或
cat /boot/firmware/config.txt

systemctl status display-manager --no-pager

echo $XDG_SESSION_TYPE

有了这三项,通常就能进一步判断到底是:

  • GUI 没启动
  • VNC 没开启
  • 还是 MHS35-show 与当前系统显示架构冲突

sudo ./LCD-hdmi

sudo raspi-config nonint do_vnc 0