Skip to main content

Ubuntu 25.10 原生桌面远程,终于跑通了....再也不用买 mac 了

由于家里没有 MacMini,所以之前 OpenClaw 刚起来的时候,我用零刻 Me Mini 单独跑了一套 Ubuntu 25.10 的裸系统。本地图形化桌面么,不用去配置远程、映射,直接连 HDMI 就能用。

但是随着跑的业务越来越多以后,我发现只用 IM 工具和 SSH 并不能很好的解决我使用它的场景。于是我开始尝试使用 windows 原生的 RDP 来远程。

远程,很简单对吧。脑子里第一反应就是装了 xrdp,然后搞定收工。

sudo apt install xrdp

然后我还很熟练的关闭 Wayland,开启 X11,等我悄咪咪打开 mstsc 远程桌面连接后 —— 黑屏。

???

大概是 GUI 不对,于是在网上找了一些方案,跑了各种 GUI,结果发现最大的问题就是没办法使用原生 Wayland,我跑在桌面上各种配置好的网页、应用,一到 RDP 就变成了丑不拉几的界面,一点用不下去。

我是真不懂阿,毕竟很少想不开远程 Ubuntu 的。然后看着价格高居不下的 Mac Mini,我决心还是换个思路来解决远程的问题。

后来 OpenClaw 提醒我,GNOME 自带了一个叫 gnome-remote-desktop 的组件,原生支持 Wayland 下的 RDP。而且系统里其实已经预装了,只是没有启用。

# 启用它
systemctl --user enable --now gnome-remote-desktop.service

然后设置一下 RDP 的登录凭据:

# 需要连接到桌面会话的 D-Bus
export DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus

# 设置用户名和密码
grdctl rdp set-credentials myuser mypassword

生成 TLS 证书(RDP 需要 TLS 加密):

mkdir -p ~/.local/share/gnome-remote-desktop

openssl req -x509 -newkey rsa:2048 \
  -keyout ~/.local/share/gnome-remote-desktop/rdp-tls-key.pem \
  -out ~/.local/share/gnome-remote-desktop/rdp-tls-cert.pem \
  -days 365 -nodes \
  -subj "/CN=$(hostname)"

指定证书路径:

grdctl rdp set-tls-cert ~/.local/share/gnome-remote-desktop/rdp-tls-cert.pem
grdctl rdp set-tls-key ~/.local/share/gnome-remote-desktop/rdp-tls-key.pem

配置完成后查看状态:

grdctl status --show-credentials

输出大概长这样:

Overall:
    Unit status: active
RDP:
    Status: enabled
    Port: 3389
    TLS certificate: /home/user/.local/share/gnome-remote-desktop/rdp-tls-cert.pem
    TLS fingerprint: ab:cd:ef:...
    TLS key: /home/user/.local/share/gnome-remote-desktop/rdp-tls-key.pem
    View-only: no
    Username: myuser
    Password: mypassword

完美!

然后熟练的反代 3389 端口,配置域名,打开远程 RDP,链接,错误代码 0x904。

查了一下日志:

journalctl --user -u gnome-remote-desktop.service --since "1 min ago"

看到了这行:

gnome-remote-desktop-daemon: ../src/libei-connection.c:75: ei_connection_get_context: Assertion `connection' failed.

服务直接 中断 了。上游 gnome-remote-desktop 49.0 的已知 bug。 当 RDP 客户端断开连接时,libei 试图获取一个已经不存在的连接上下文,然后——,断言失败,进程直接被杀死。

然后查了查相关的资料,发现view-only 模式不走 libei。 然后测试了一下,果然,先开启 view-only,连接以后再关闭,这样远程 RDP 就可以直接操作 Ubuntu 桌面了 稳定如老狗

开始起飞

然后我就创建了一个脚本,大致思路就是先 view-only 开启服务,连上后断 view-only,监听 3389 连接,无连接自动重启再次开启监听。

服务启动 → 开启 view-only(稳定,不崩溃)
    ↓
用户连上 RDP(view-only 模式,绕过 libei bug)
    ↓
检测到连接 → 关闭 view-only(libei 此时已经正常初始化)
    ↓
用户正常操作鼠标键盘
    ↓
用户断开 → 服务崩溃 → 自动重启 → 回到第一步

第一步:给服务加崩溃自动重启

mkdir -p ~/.config/systemd/user/gnome-remote-desktop.service.d

cat > ~/.config/systemd/user/gnome-remote-desktop.service.d/override.conf << 'EOF'
[Service]
Restart=always
RestartSec=1
EOF

这样 libei 崩了之后,1 秒内自动重启。

第二步:创建 Watcher 脚本

这是整个方案的核心。用端口连接状态来判断用户是否在线:

mkdir -p ~/.local/bin

cat > ~/.local/bin/rdp-watcher.sh << 'SCRIPT'
#!/bin/bash
# RDP Watcher - View-Only 自动切换
# 原理:检测 3389 端口 TCP 连接状态
#   无连接 → view-only ON(稳定)
#   有连接 → view-only OFF(可操作)

export DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus
state="idle"

while true; do
  if ss -tn state established 2>/dev/null | grep -q ':3389'; then
    if [ "$state" = "idle" ]; then
      sleep 1
      grdctl rdp disable-view-only >/dev/null 2>&1
      state="connected"
    fi
  else
    if [ "$state" = "connected" ]; then
      # 连接断开了,等服务崩溃重启稳定后,再开 view-only
      sleep 5
      grdctl rdp enable-view-only >/dev/null 2>&1
      state="idle"
    elif [ "$state" = "idle" ]; then
      # 空闲时确保 view-only 是开着的
      grdctl rdp enable-view-only >/dev/null 2>&1
    fi
  fi
  sleep 2
done
SCRIPT

chmod +x ~/.local/bin/rdp-watcher.sh
  • • 每 2 秒检测一次 3389 端口有没有 TCP 连接
  • • 没连接 → 开 view-only,等待用户连接
  • • 有连接 → 关 view-only,用户可以操作
  • • 连接断开 → 等 5 秒(让崩溃和重启完成)→ 重新开 view-only

不用日志,不用 D-Bus 监听,就一个 ss 命令,简单粗暴且可靠。

第三步:注册为 systemd 用户服务

cat > ~/.config/systemd/user/rdp-watcher.service << 'EOF'
[Unit]
Description=RDP View-Only Auto-Switch Watcher
After=gnome-remote-desktop.service

[Service]
ExecStart=%h/.local/bin/rdp-watcher.sh
Restart=always
RestartSec=5

[Install]
WantedBy=default.target
EOF

systemctl --user daemon-reload
systemctl --user enable --now rdp-watcher.service

✅ 最终效果

全部配置完成后:

# 确认两个服务都在跑
systemctl --user status gnome-remote-desktop.service
systemctl --user status rdp-watcher.service

然后用任意 RDP 客户端连接。连上就能操作,断开再连也没问题。全程自动,不需要手动干预。

好了,我可以美美的开始办公远程做游戏了~~

三国曹操传美少女版,启动!

image_1.png