wayland-remote-desktop-guide

0 阅读6分钟

@[TOC](无显示器Ubuntu远程原生 Wayland 桌面完整折腾记录)

环境: Ubuntu 25.04 / GNOME 50 / 无物理显示器 / 内网远程访问 / windows

背景

手里有一台 Ubuntu 桌面机,没接显示器,一直通过 VNC 远程使用。VNC 体验一般——画面模糊、延迟高、剪贴板时不时失灵。甚至有些应用直接打不开,因为 VNC 会话跑在 X11 + GNOME Flashback 下,而 gnome-control-center 只认 GNOME 和 Unity 桌面环境。

既然 Ubuntu 25.04 默认就是 Wayland,能不能直接远程 Wayland 桌面?折腾了一圈,答案是:可以,而且体验比 VNC 好很多。 ![windows app远程wayland成功🥳](direct/7595afd464b24f99a83a7a17cca76f27.png)

先说结论

方案协议端口体验无显示器
xrdp + XvncRDP→VNC3389一般
xrdp + XorgRDP3389黑屏闪退
gnome-remote-desktop headlessRDP3390流畅

最终方案:gnome-remote-desktop headless 模式 + GDM 自动登录,不需要物理显示器,RDP 直连 Wayland 桌面。


最终方案:GNOME Remote Desktop Headless 模式

Ubuntu 25.04 的 gnome-remote-desktop (50.0) 提供了 --headless 选项,专门解决无显示器的场景。配合 GDM 自动登录,开机就能用。

Step 1:开启 Wayland

编辑 /etc/gdm3/custom.conf,注释掉 Wayland 禁用行:

sudo nano /etc/gdm3/custom.conf

修改为:

[daemon]
# WaylandEnable=false  ← 注释掉这行

Step 2:开启 GDM 自动登录

同一文件,设置自动登录你的用户:

[daemon]
AutomaticLoginEnable=true
AutomaticLogin=jun

这样开机后 GDM 会自动以你的账号登录 Wayland 桌面,不需要物理操作。

Step 3:配置 gnome-remote-desktop headless 模式

# 启用 headless RDP
grdctl --headless rdp enable

# 设置 RDP 登录凭据
grdctl --headless rdp set-credentials jun 你的密码

# 允许远程控制(非只读)
grdctl --headless rdp disable-view-only

# 设置端口(避开 xrdp 的 3389)
grdctl --headless rdp set-port 3390

# 确认配置
grdctl --headless status --show-credentials

输出应该类似:

Overall:
    Unit status: active
RDP:
    Status: enabled
    Port: 3390
    Authentication methods: credentials
    TLS certificate: /home/jun/.local/share/gnome-remote-desktop/rdp.crt
    TLS fingerprint: 38:1c:15:91:...
    Username: jun
    Password: 你的密码

grdctl status 输出显示 RDP 已启用、端口 3390 的终端截图

Step 4:重启并验证

sudo reboot

重启后等待约 30 秒,然后 SSH 进去检查:

# 检查端口监听
ss -tlnp | grep 3390
# → LISTEN 0 5 *:3390 *:* users:(("gnome-remote-de",...))

# 检查 Wayland 会话
loginctl list-sessions
# → 应该能看到 Wayland 用户会话(Type=wayland, seat0, tty2)

ss 和 loginctl 显示 3390 端口已监听、Wayland 会话已创建

Step 5:Windows 远程桌面连接

打开 Windows 自带的"远程桌面连接"(mstsc.exe): 在这里插入图片描述

  • 地址: 192.168.x.xxx:3390
  • 用户名: xxx
  • 密码: 你设置的密码

首次连接会提示证书不受信任(自签名证书),勾选信任继续即可。


清理:关掉 xrdp

既然以后用 Wayland RDP 了,xrdp 可以关掉:

sudo systemctl stop xrdp
sudo systemctl disable xrdp

关于 TPM 警告

配置 headless 时可能会看到:

Init TPM credentials failed because Failed to initialize transmission interface context:
tcti:IO failure, using GKeyFile as fallback.

不用担心。 这是因为机器没有 TPM 芯片(虚拟机或老硬件常见),gnome-remote-desktop 会自动回退到文件存储凭据,功能完全正常。

最终架构

graph TB
    A[Windows 远程桌面 mstsc] -->|RDP 3390| B[gnome-remote-desktop]
    B --> C[GNOME Shell - Wayland]
    C --> D[GDM 自动登录]
    D --> E[Ubuntu 25.04 - 192.168.31.161]
    F[xrdp 已禁用] -.-> E

要点总结

  1. Wayland 远程不需要物理显示器,但需要 headless 模式 + GDM 自动登录
  2. gnome-remote-desktop 是官方方案,Ubuntu 25.04 自带,RDP 协议体验好
  3. xrdp + Xorg 在无 GPU 环境下容易崩,xrdp + Xvnc 能用但体验差
  4. 端口要错开,xrdp 默认 3389,gnome-remote-desktop 改 3390
  5. TPM 警告可以忽略,不影响功能
  6. 必须关闭自动锁屏,否则几分钟后远程桌面就连不上,报 "Session creation inhibited"

踩坑记录

下面是折腾过程中遇到的各种坑,供同样在摸索的同学参考。

坑 1:VNC 下系统设置打不开

通过 xrdp 连接 VNC 桌面后,点击"设置"没反应。手动运行 gnome-control-center 报错:

Running gnome-control-center is only supported under GNOME and Unity, exiting

原因: xrdp 的 VNC 会话启动脚本 /etc/xrdp/startwm.shXDG_CURRENT_DESKTOP 设成了 GNOME-Flashback,而 gnome-control-center 检查这个环境变量,只接受 GNOMEUnity

修复:

sudo sed -i 's/XDG_CURRENT_DESKTOP=GNOME-Flashback/XDG_CURRENT_DESKTOP=GNOME/' /etc/xrdp/startwm.sh

或者临时在终端里启动:

DISPLAY=:10 XDG_CURRENT_DESKTOP=GNOME gnome-control-center

gnome-control-center 报错 "not supported under GNOME and Unity" 的终端截图

坑 2:xrdp 选 Xorg 黑屏闪退

xrdp 登录界面提供四个选项:Xorg、Xvnc、vnc-any、neutrinordp-any。选 Xorg 后黑屏闪退。

查看 xrdp-sesman 日志:

Window manager (pid 216896, display 11) exited with signal SIGABRT.
Window manager (pid 216896, display 11) exited quickly (1 secs).
This could indicate a window manager config problem

原因: gnome-session 在 xrdp 的 Xorg 会话中崩溃。这在没有物理 GPU / 没有正确 DRI 权限的机器上很常见。xorgxrdp 需要跟 Xorg 紧密配合,环境不匹配就崩。

结论: xrdp + Xorg 在这台机器上不靠谱,选 Xvnc 能用但体验差。

xrdp 登录界面的四个会话类型选项截图

坑 3:Wayland 远程的鸡生蛋问题

==这是最大的坑。== gnome-remote-desktop 需要 Wayland 用户桌面会话才能监听 RDP 端口。但没有物理显示器、没有远程连接,就没有 Wayland 桌面会话——死循环。

具体表现:

# 服务启动了,但端口没监听
systemctl --user status gnome-remote-desktop.service
# → active (running)

ss -tlnp | grep 3390
# → 无输出!端口没有监听

原因: gnome-remote-desktop 必须跑在一个活跃的 Wayland compositor(GNOME Shell)下面,才能截取画面和注入输入。没有 Wayland 会话 = 没有画面 = 服务空转不监听。

解法: 开启 GDM 自动登录 + headless 模式,让系统开机自动创建 Wayland 会话,gnome-remote-desktop 就能正常工作了。

gnome-remote-desktop 服务运行但 ss 显示端口未监听的终端截图

坑 4:自动锁屏导致连接闪退(最容易踩的坑!)

==这个坑藏得最深,折腾最久。== 配置好 headless 模式后,第一次连接成功,但过几分钟后再连就闪退。日志里反复出现:

Failed to start remote desktop session: GDBus.Error:org.freedesktop.DBus.Error.Failed: Session creation inhibited

还有认证失败:

client authentication failure
nla_recv() error: -1

原因: GDM 自动登录后,GNOME 会在几分钟后自动锁屏。锁屏状态下,xdg-desktop-portal 会拒绝所有远程桌面会话创建,直接返回 "Session creation inhibited"。而 Windows 远程桌面客户端收不到有效响应就闪退了。

验证方法:

# 检查是否锁屏
loginctl show-session <session-id> -p LockedHint
# LockedHint=yes  ← 这就是连不上的原因

gdbus call --session --dest org.gnome.ScreenSaver \
  --object-path /org/gnome/ScreenSaver \
  --method org.gnome.ScreenSaver.GetActive
# (true,)  ← 锁屏中

永久修复:关闭自动锁屏和屏保

gsettings set org.gnome.desktop.screensaver lock-enabled false
gsettings set org.gnome.desktop.screensaver idle-activation-enabled false
gsettings set org.gnome.desktop.session idle-delay 0
gsettings set org.gnome.settings-daemon.plugins.power sleep-inactive-ac-type 'nothing'

⚠️ 安全提醒:关闭锁屏意味着任何人能物理接触到机器就能直接操作。如果是服务器/无显示器场景,可以接受。如果是笔记本,请三思。