树莓派 4B Wayland VNC 折腾记:从 SSH 隧道到 RealVNC 直连
背景硬件环境树莓派 4BDebian 13 trixie 64-bit桌面环境labwc基于 wlroots 0.19 的 Wayland 合成器显示屏Yahboom 7寸 HDMI 触摸屏 → QDtech MPI7003 HDMI 触摸屏目标 从 PC 用 VNC 远程访问 Pi 的 Wayland 桌面用于学习嵌入式图形栈。必须走 Wayland不能走 X11。整个过程中踩了三个大坑记录如下。前置换屏后卡在左上角光标换屏后 Pi 开机卡住屏幕只剩左上角一个闪烁光标进不了桌面。SSH 还能进于是远程诊断。故障现象lightdm.service状态failed8 次快速重启被 systemd 限流放弃Start request repeated too quickly。根因定位查看 greeter 日志发现关键错误[ERROR] [backend/libinput/backend.c:112] Set WLR_LIBINPUT_NO_DEVICES1 to suppress this check [ERROR] [backend/multi/backend.c:32] Failed to initialize backend. [ERROR] [../src/server.c:788] unable to start the wlroots backendlibinput list-devices返回空——那次开机时系统检测到0 个 libinput 输入设备。原因分析外借屏MPI7003本身是触摸屏触摸硬件一直存在但那次开机时触摸没被及时枚举出来很可能是 USB 枚举时序的偶发问题wlroots 0.19硬性要求至少 1 个 libinput 输入设备否则拒绝初始化 backendlabwc 起不来 → lightdm 反复重试失败 → 限流放弃 → 只剩控制台光标顺便发现新屏 EDID 读不出0 字节连接器停在FIXED_MODE。但非致命labwc 后面仍能以 1024x600 出图。解决方案在两个文件中各加一行WLR_LIBINPUT_NO_DEVICES1# /etc/xdg/labwc/environment # /etc/xdg/labwc-greeter/environment WLR_LIBINPUT_NO_DEVICES1这是 wlroots 官方提供的「无输入设备也启动」开关。改完重启 lightdm桌面恢复。后续验证现在触摸已被正常识别/proc/bus/input/devices显示 QDtech MPI7003libinput也能列出。WLR_LIBINPUT_NO_DEVICES1作为兜底保留以防万一。VNC 方案选择wayvnc纯 WaylandPi 上已安装wayvnc 0.9.1labwc 也支持屏幕捕获协议zwlr_screencopy_manager_v1 v3ext_image_copy_capture_manager_v1 v1。wayvnc 是 wlroots 原生的 VNC server直接抓 labwc 的输出完全不碰 X11完美契合需求。第一版方案wayvnc SSH 隧道localhost:5900设计思路wayvnc 只绑定127.0.0.1:5900不对局域网暴露PC 端用 SSH 隧道将本地 5900 转发过去VNC viewer 连接localhost:5900安全完全依赖 SSH 密钥认证翻车现场配置里顺手写了password1想加一道密码。但用 RFB 协议握手一探测offered: [None(无认证!)]wayvnc 配置里单独写password根本不生效仍然是None无认证差点在局域网裸奔。原因查阅 man 手册才明白password只有在enable_authtrue时才被启用。而enable_authtrue还需要一整套配置usernamepasswordrsa_private_key_filecertificate_fileprivate_key_fileRSA-AES 加密模式当时觉得这套太重、viewer 兼容性也存疑就先走了隧道方案。临时方案wayvnc 绑定127.0.0.1不对外暴露无密码也安全PC 执行ssh -N -L 5900:localhost:5900 brahmsjraspberrypi.localVNC viewer 连接localhost:5900免密SSH 鉴权投屏成功。链路 viewer → localhost:5900 → [SSH 隧道] → Pi 127.0.0.1:5900 → wayvnc → labwc → HDMI第二关重启就断问题描述Pi 一重启VNC 立刻报「计算机拒绝连接」。两个原因SSH 隧道是 PC 端进程Pi 重启时 SSH 连接被掐ssh exit 255Connection closed by remote host隧道消失wayvnc 没有设置自启重启后也没起来每次重启都要手动操作SSH 进 Pisystemctl --user start wayvncPC 上重起隧道太烦了。解决方案labwc autostart 拉起 wayvnc又一个坑graphical-session.target在 Pi OS 的 labwc 会话下是inactive会话由 lightdm → Xsession → labwc-pi 拉起不是 systemd 启动的所以常规的systemctl --user enable wayvnc不生效。改为在 labwc 的autostart里拉起编辑/etc/xdg/labwc/autostart就是启动 pcmanfm/wf-panel/kanshi 的文件在lxsession-xdg-autostart行前加XDG_RUNTIME_DIR/run/user/$(id -u) systemctl --user --no-block start wayvnc 这样 labwc 一起来就跑 autostart顺带把 wayvnc 拉起。第三关用户嫌隧道烦要直连「跑脚本很烦。」——隧道是 PC 端进程每次用 VNC 前都得手动起一条命令还容易忘了关。新目标 VNC viewer 直连不跑脚本。三种方案权衡方案优点缺点免密直连绑 0.0.0.0无认证最省事同 WiFi/局域网内任何人都能连上 Pi 操控带密码直连0.0.0.0 enable_auth更安全viewer 必须支持 RSA-AES/Apple-DH保留隧道最安全通用要起脚本可做快捷方式选择了带密码直连viewer 使用 RealVNC Viewer支持 Apple-DH/RSA-AES。第四关RSA 密钥格式坑PKCS#1 vs PKCS#8问题配置enable_auth需要 RSA 私钥。执行openssl genrsa -out rsa_key.pem 2048启动 wayvnc报错ERROR: ../src/crypto/nettle/rsa.c:131: Unsupported RSA private key format ERROR: ../src/main.c:965: Failed to load RSA credentials根因查看密钥文件头-----BEGIN PRIVATE KEY-----——这是PKCS#8 格式。原来 OpenSSL 3.xDebian trixie的openssl genrsa默认输出 PKCS#8而neatvncwayvnc 的 VNC 库只认PKCS#1-----BEGIN RSA PRIVATE KEY-----。修复方法转为 PKCS#1 格式openssl genpkey -algorithm RSA -out /tmp/k.pem openssl rsa -in /tmp/k.pem -traditional -out rsa_key.pem-traditional强制输出传统 PKCS#1 格式。再启动 wayvnc正常加载。最终配置wayvnc 配置文件~/.config/wayvnc/configaddress0.0.0.0 port5900 enable_authtrue relax_encryptiontrue usernamebrahmsj password1 rsa_private_key_file/home/brahmsj/.config/wayvnc/rsa_key.pem private_key_file/home/brahmsj/.config/wayvnc/tls_key.pem certificate_file/home/brahmsj/.config/wayvnc/tls_cert.pemtls_key.pem/tls_cert.pem是自签 TLS 证书用openssl req -x509 -newkey rsa:2048 -nodes ...生成。relax_encryptiontrue让 wayvnc 额外提供 Apple-DH 这种纯密码认证。验证认证类型再次探测offered: [VeNCrypt(19), RSA-AES(129), RA2(5), Apple-DH(30)]None消失了裸奔问题彻底解决。最终效果RealVNC 直连PC 上 RealVNC Viewer地址raspberrypi.local:5900用户名brahmsj密码1连上Wayland 桌面投屏成功。不用 SSH 隧道不用跑脚本。重启后 wayvnc 由 labwc autostart 自动起来直接再连即可——重启验证通过。最后一个小坑地址别用错重启后再连VNC viewer 又报「拒绝连接」。一查 Piwayvnc 明明好好的active监听0.0.0.0:5900。原来连的是localhost:5900——那是老隧道的地址隧道已经关了本机 5900 没人监听。直连要用raspberrypi.local:5900。踩坑总结wlroots 0.19 要输入设备 换屏后某次开机触摸没被及时枚举系统 0 个 libinput 设备合成器拒绝启动。WLR_LIBINPUT_NO_DEVICES1救命且作为兜底保留触摸现在已正常识别。wayvnc 的password单写不生效 仍是无认证。必须enable_authtrue配全套 RSA 密钥/证书。wayvnc 的 RSA 密钥要 PKCS#1 OpenSSL 3.x 默认出 PKCS#8neatvnc 不认报Unsupported RSA private key format。用openssl rsa -traditional转换。Pi OS labwc 的graphical-session.target是inactive wayvnc 自启不能靠systemctl --user enable得靠 labwc 的autostart拉起。localhost:5900≠raspberrypi.local:5900 前者是 SSH 隧道地址本机回环后者是直连 Pi 的地址。换方案后别连错。关键文件清单用途文件libinput 兜底/etc/xdg/labwc/environment、/etc/xdg/labwc-greeter/environment加WLR_LIBINPUT_NO_DEVICES1wayvnc 配置~/.config/wayvnc/config0.0.0.0enable_authwayvnc 密钥~/.config/wayvnc/rsa_key.pemPKCS#1、tls_key.pem、tls_cert.pemwayvnc 服务~/.config/systemd/user/wayvnc.serviceMemoryMax 隔离disabledwayvnc 自启/etc/xdg/labwc/autostart加启动行备份.bak