# 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 ``` ```