AutoDL 上配置远程桌面运行 3DGS / SLAM 可视化:TurboVNC + XFCE + SSH 隧道完整可行流程

一、为什么需要在 AutoDL 上使用远程桌面?

在 AutoDL 上跑深度学习训练时,大多数任务只需要 SSH、JupyterLab 或 VSCode Remote 就够了。但是当任务涉及 3DGS、SLAM、OpenCV GUI、Pangolin、RViz、SIBR Viewer 这类实时可视化程序时,仅靠命令行就不太方便了。

例如:

复制代码
cv2.imshow(...)

或者 SLAM 程序中的 Pangolin 可视化窗口、3D Gaussian Splatting 的 viewer,都需要一个图形显示环境。如果没有远程桌面,程序可能会报:

复制代码
cannot open display
Gtk-WARNING: cannot open display
xterm: Xt error: Can't open display

AutoDL 官方文档也提到,如果不是强需求,建议尽量把 imshow 改成 imsave 保存图片再看;但对于 3DGS 和 SLAM 这类需要实时观察轨迹、点云、相机位姿、渲染效果的任务,远程桌面仍然是非常必要的。AutoDL 官方远程桌面文档说明,VNC 可以把键盘鼠标事件传到远程实例,并把远程图形画面传回本地,因此可以用来运行 GUI 程序。(AutoDL)

本文记录一次在 AutoDL 容器实例中配置远程桌面的完整过程,最终使用方案是:

复制代码
AutoDL 实例内:TurboVNC Server + XFCE 桌面
本地电脑:TurboVNC Viewer / RealVNC Viewer
连接方式:SSH 隧道转发 6006 端口

二、本文参考资料

主要参考了以下资料:

AutoDL 官方远程桌面文档:官方给出了 TurboVNC 的安装方式、6006 端口启动方法,以及本地 VNC 客户端连接方式。(AutoDL)

AutoDL 官方开放端口文档:里面提到 AutoDL 实例没有独立公网 IP,60066008 会被映射到公网地址,并且协议可以选择 TCP 或 HTTP;个人用户也可以使用 SSH 隧道代理端口到本地访问。(AutoDL)

马春杰杰的 AutoDL 远程桌面博客:这篇文章也给出了基于 TurboVNC 的安装和连接流程,可以作为额外参考。(Machun Jie)

TurboVNC 官网:可以下载 TurboVNC 客户端,也可以查看官方文档。(TurboVNC)

RealVNC Viewer 官网:如果不想用 TurboVNC Viewer,也可以用 RealVNC Viewer 作为客户端。(RealVNC®)

3D Gaussian Splatting 官方仓库:3DGS 的 network viewer 默认会尝试在 localhost:6009 与训练进程通信,因此 3DGS 可视化还可能涉及额外的端口转发。(GitHub)


三、需要下载哪些程序?

本地电脑需要安装一个 VNC 客户端。推荐两种:

方案 1:TurboVNC Viewer

AutoDL 官方远程桌面文档中提供了不同系统的 TurboVNC 客户端下载入口,包括 Ubuntu、macOS 和 Windows;也可以从 TurboVNC 官网下载。(AutoDL)

方案 2:RealVNC Viewer

RealVNC Viewer 也可以连接 VNC 服务端,Windows、macOS、Linux 都有客户端。(RealVNC®)

此外,本地电脑还需要能使用 SSH。Windows 用户可以直接使用 PowerShell / CMD 里的 ssh 命令,也可以用 Xshell、MobaXterm、Termius 等工具。macOS 和 Linux 一般自带 SSH 客户端。


四、一个很容易踩的坑:不要直接用 HTTPS 公网地址连 VNC

AutoDL 的自定义服务会显示类似这样的地址:

复制代码
http://127.0.0.1:6006 -> https://xxxx.seetacloud.com:8443

很多人会直接把这个 https://xxxx.seetacloud.com:8443 填进 VNC Viewer,结果连接失败,或者显示异常。

原因是:VNC 不是普通 HTTP 服务,而是 RFB/TCP 协议 。AutoDL 的 6006/6008 公网映射支持 TCP 或 HTTP,但如果默认是 HTTP 映射,就不适合直接拿来连 VNC。AutoDL 官方端口文档也说明,60066008 的映射协议支持 TCP 或 HTTP,需要根据服务类型选择。(AutoDL)

本文最终采用更稳的方式:SSH 隧道

也就是把 AutoDL 实例里的 6006 端口转发到本地电脑的 6006 端口,然后 VNC 客户端连接:

复制代码
127.0.0.1:6006

五、最终可行安装流程

下面所有命令,除特别说明外,都在 AutoDL 实例的 SSH 终端 中执行。

1. 安装 XFCE 桌面、TurboVNC 和必要组件

AutoDL 官方远程桌面文档中给出了 TurboVNC 和图形库的基础安装命令。这里在此基础上额外补充了 xfce4xfce4-terminalthunardbus-x11 等组件,因为如果只安装基础图形库,可能能看到桌面,但终端、文件夹、应用菜单打不开。(AutoDL)

复制代码
apt update

DEBIAN_FRONTEND=noninteractive apt install -y --no-install-recommends \
  xorg xfce4 xfce4-terminal thunar dbus-x11 gvfs policykit-1 xdg-utils \
  libglu1-mesa-dev mesa-utils xterm xauth x11-xkb-utils \
  xfonts-base xkb-data libxtst6 libxv1 wget

安装 AutoDL 官方文档使用的 TurboVNC:

复制代码
cd /tmp

export TURBOVNC_VERSION=2.2.5
export LIBJPEG_VERSION=2.0.90

wget -q https://autodl-public.ks3-cn-beijing.ksyuncs.com/tool/vnc/libjpeg-turbo-official_${LIBJPEG_VERSION}_amd64.deb
wget -q https://autodl-public.ks3-cn-beijing.ksyuncs.com/tool/vnc/turbovnc_${TURBOVNC_VERSION}_amd64.deb

dpkg -i libjpeg-turbo-official_${LIBJPEG_VERSION}_amd64.deb turbovnc_${TURBOVNC_VERSION}_amd64.deb || apt -f install -y

rm -f libjpeg-turbo-official_${LIBJPEG_VERSION}_amd64.deb turbovnc_${TURBOVNC_VERSION}_amd64.deb

2. 设置 VNC 密码

复制代码
mkdir -p /root/.vnc
/opt/TurboVNC/bin/vncpasswd

这里设置的密码是 VNC 远程桌面密码,不是 AutoDL 实例的 SSH 密码。


3. 配置 XFCE 启动脚本

这一步非常关键。之前遇到过"远程桌面能进入,但是双击打不开程序、文件夹和终端都没反应"的问题,最终原因是 XFCE 桌面会话没有在完整的 DBus 环境中启动。

写入如下配置:

复制代码
mkdir -p /root/.vnc

cat > /root/.vnc/xstartup <<'EOF'
#!/bin/bash
unset SESSION_MANAGER
unset DBUS_SESSION_BUS_ADDRESS

export XDG_RUNTIME_DIR=/tmp/runtime-root
mkdir -p "$XDG_RUNTIME_DIR"
chmod 700 "$XDG_RUNTIME_DIR"

[ -r "$HOME/.Xresources" ] && xrdb "$HOME/.Xresources"

exec dbus-launch --exit-with-session startxfce4
EOF

chmod +x /root/.vnc/xstartup
touch /root/.Xauthority

重点是这一句:

复制代码
exec dbus-launch --exit-with-session startxfce4

如果没有 dbus-launch,可能会出现 Thunar 文件管理器打不开、XFCE 终端打不开、桌面只显示但无法正常交互等问题。


4. 清理旧的 VNC 会话和端口占用

如果之前启动失败过,或者反复执行过启动命令,很容易出现:

复制代码
ListenOnTCPPort: Address already in use

这说明 6006 端口已经被旧的 VNC 进程占用。必须先清掉旧进程:

复制代码
/opt/TurboVNC/bin/vncserver -kill :1 2>/dev/null || true
pkill -9 -f "Xvnc" 2>/dev/null || true
pkill -9 -f "Xtigervnc" 2>/dev/null || true

pid=$(ss -lntp 2>/dev/null | awk '/:6006 / {print $NF}' | sed -n 's/.*pid=\([0-9]*\).*/\1/p' | head -n 1)
[ -n "$pid" ] && kill -9 "$pid" || true

rm -f /tmp/.X1-lock
rm -f /tmp/.X11-unix/X1
rm -rf /root/.cache/sessions/*

检查 6006 是否已经释放:

复制代码
ss -lntp | grep 6006

如果没有任何输出,说明端口已经空出来了。


5. 启动 VNC 服务端

复制代码
USER=root HOME=/root /opt/TurboVNC/bin/vncserver :1 \
  -geometry 1920x1080 \
  -depth 24 \
  -rfbport 6006 \
  -rfbauth /root/.vnc/passwd \
  -auth /root/.Xauthority \
  -xstartup /root/.vnc/xstartup

检查是否启动成功:

复制代码
ss -lntp | grep 6006
ps -ef | grep -E "Xvnc|xfce|dbus" | grep -v grep

如果能看到 6006 端口处于监听状态,并且有 Xvncxfcedbus 相关进程,就说明服务端基本启动成功。


六、本地电脑通过 SSH 隧道连接

在 AutoDL 控制台复制 SSH 登录命令,通常类似:

复制代码
ssh -p 12345 root@region-xx.autodl.com

把它改成端口转发命令:

复制代码
ssh -CNg -L 6006:127.0.0.1:6006 root@你的AutoDL主机 -p 你的AutoDL端口

例如原始登录命令是:

复制代码
ssh -p 48332 root@region-3.autodl.com

那么隧道命令就是:

复制代码
ssh -CNg -L 6006:127.0.0.1:6006 root@region-3.autodl.com -p 48332

执行后这个终端会像"卡住"一样,没有输出。这是正常的,表示隧道正在保持连接。不要关掉这个窗口。

然后打开 TurboVNC Viewer 或 RealVNC Viewer,连接:

复制代码
127.0.0.1:6006

输入前面设置的 VNC 密码,即可进入 AutoDL 的远程桌面。


七、测试 GUI 是否正常

进入远程桌面后,可以在 SSH 终端中测试:

复制代码
export DISPLAY=:1
export XAUTHORITY=/root/.Xauthority

xterm &
xfce4-terminal &
thunar &

如果远程桌面里能弹出 xterm、XFCE 终端和文件管理器,说明桌面环境是正常的。

也可以测试 OpenGL:

复制代码
export DISPLAY=:1
glxinfo | grep -E "OpenGL vendor|OpenGL renderer|OpenGL version"

如果要运行自己的 SLAM 或 3DGS 程序,也需要在同一个终端里设置:

复制代码
export DISPLAY=:1
export XAUTHORITY=/root/.Xauthority

然后再运行程序:

复制代码
conda activate 你的环境
python your_slam_script.py

或者:

复制代码
conda activate 你的环境
python train.py ...

AutoDL 官方文档也强调,启动 GUI 程序前需要设置 export DISPLAY=:1,并且要在同一个终端中执行后续命令。(AutoDL)


八、常见问题与解决办法

问题 1:远程桌面能进入,但是双击打不开终端和文件夹

一般是 XFCE 会话不完整,或者缺少 DBus 组件。解决办法是安装:

复制代码
apt install -y dbus-x11 xfce4 xfce4-terminal thunar gvfs policykit-1 xdg-utils xterm

然后确保 /root/.vnc/xstartup 中使用:

复制代码
exec dbus-launch --exit-with-session startxfce4

最后清理旧会话并重启 VNC。


问题 2:日志里出现 Address already in use

报错类似:

复制代码
ListenOnTCPPort: Address already in use

说明 6006 端口已经被旧的 VNC 进程占用。执行:

复制代码
/opt/TurboVNC/bin/vncserver -kill :1 2>/dev/null || true
pkill -9 -f "Xvnc" 2>/dev/null || true

pid=$(ss -lntp 2>/dev/null | awk '/:6006 / {print $NF}' | sed -n 's/.*pid=\([0-9]*\).*/\1/p' | head -n 1)
[ -n "$pid" ] && kill -9 "$pid" || true

rm -f /tmp/.X1-lock
rm -f /tmp/.X11-unix/X1
rm -rf /root/.cache/sessions/*

然后重新启动 VNC。


问题 3:SSH 里运行 GUI 程序时报 cannot open display

先设置:

复制代码
export DISPLAY=:1
export XAUTHORITY=/root/.Xauthority

再运行程序。

如果还是不行,检查 VNC 是否真的在运行:

复制代码
ss -lntp | grep 6006
ps -ef | grep -E "Xvnc|xfce|dbus" | grep -v grep

问题 4:VNC Viewer 连接后只能看,不能操作

检查 VNC 客户端是否开启了 View Only 或"只读模式"。如果开启了,只能看画面,鼠标键盘事件不会真正发送到远程桌面。

TurboVNC Viewer 或 RealVNC Viewer 里都可能有类似选项,需要取消勾选。


问题 5:3DGS Viewer 很卡、黑屏或 OpenGL 报错

这和 VNC、OpenGL、CUDA/OpenGL interop 有关。3DGS 官方仓库说明,network viewer 默认会和训练进程通过 localhost:6009 通信,viewer 本身对 OpenGL 和 GPU 环境也有要求。(GitHub)

可以先检查 OpenGL:

复制代码
export DISPLAY=:1
glxinfo | grep -E "OpenGL vendor|OpenGL renderer|OpenGL version"

如果看到:

复制代码
OpenGL renderer string: llvmpipe

说明当前大概率是 CPU 软件渲染,能开窗口但 3DGS 交互 viewer 可能很慢。

对于 3DGS,另一个更推荐的方式是:

复制代码
AutoDL 负责训练
本地电脑运行 SIBR Viewer
通过 SSH 隧道转发 6009 端口

AutoDL 上运行训练:

复制代码
python train.py -s /path/to/data -m /path/to/output --ip 127.0.0.1 --port 6009

本地电脑再开一个 SSH 隧道:

复制代码
ssh -CNg -L 6009:127.0.0.1:6009 root@你的AutoDL主机 -p 你的AutoDL端口

然后本地启动 SIBR network viewer,连接:

复制代码
127.0.0.1:6009

这样比把 3DGS viewer 完全放在 VNC 桌面里跑更稳定。


九、一键整理版命令

最后给一个完整整理版。新实例中可以直接按顺序执行。

复制代码
apt update

DEBIAN_FRONTEND=noninteractive apt install -y --no-install-recommends \
  xorg xfce4 xfce4-terminal thunar dbus-x11 gvfs policykit-1 xdg-utils \
  libglu1-mesa-dev mesa-utils xterm xauth x11-xkb-utils \
  xfonts-base xkb-data libxtst6 libxv1 wget

cd /tmp

export TURBOVNC_VERSION=2.2.5
export LIBJPEG_VERSION=2.0.90

wget -q https://autodl-public.ks3-cn-beijing.ksyuncs.com/tool/vnc/libjpeg-turbo-official_${LIBJPEG_VERSION}_amd64.deb
wget -q https://autodl-public.ks3-cn-beijing.ksyuncs.com/tool/vnc/turbovnc_${TURBOVNC_VERSION}_amd64.deb

dpkg -i libjpeg-turbo-official_${LIBJPEG_VERSION}_amd64.deb turbovnc_${TURBOVNC_VERSION}_amd64.deb || apt -f install -y

rm -f libjpeg-turbo-official_${LIBJPEG_VERSION}_amd64.deb turbovnc_${TURBOVNC_VERSION}_amd64.deb

mkdir -p /root/.vnc
/opt/TurboVNC/bin/vncpasswd

cat > /root/.vnc/xstartup <<'EOF'
#!/bin/bash
unset SESSION_MANAGER
unset DBUS_SESSION_BUS_ADDRESS

export XDG_RUNTIME_DIR=/tmp/runtime-root
mkdir -p "$XDG_RUNTIME_DIR"
chmod 700 "$XDG_RUNTIME_DIR"

[ -r "$HOME/.Xresources" ] && xrdb "$HOME/.Xresources"

exec dbus-launch --exit-with-session startxfce4
EOF

chmod +x /root/.vnc/xstartup
touch /root/.Xauthority

/opt/TurboVNC/bin/vncserver -kill :1 2>/dev/null || true
pkill -9 -f "Xvnc" 2>/dev/null || true
pkill -9 -f "Xtigervnc" 2>/dev/null || true

pid=$(ss -lntp 2>/dev/null | awk '/:6006 / {print $NF}' | sed -n 's/.*pid=\([0-9]*\).*/\1/p' | head -n 1)
[ -n "$pid" ] && kill -9 "$pid" || true

rm -f /tmp/.X1-lock
rm -f /tmp/.X11-unix/X1
rm -rf /root/.cache/sessions/*

USER=root HOME=/root /opt/TurboVNC/bin/vncserver :1 \
  -geometry 1920x1080 \
  -depth 24 \
  -rfbport 6006 \
  -rfbauth /root/.vnc/passwd \
  -auth /root/.Xauthority \
  -xstartup /root/.vnc/xstartup

本地电脑开启 SSH 隧道:

复制代码
ssh -CNg -L 6006:127.0.0.1:6006 root@你的AutoDL主机 -p 你的AutoDL端口

VNC Viewer 连接:

复制代码
127.0.0.1:6006

运行 GUI 程序前:

复制代码
export DISPLAY=:1
export XAUTHORITY=/root/.Xauthority

十、总结

AutoDL 上配置远程桌面的核心不是"把 6006 的 HTTPS 地址复制到 VNC Viewer",而是要理解 VNC 使用的是图形远程控制协议,最稳的连接方式是 VNC Server 监听 AutoDL 内部 6006 端口,然后用 SSH 隧道转发到本地,再让 VNC Viewer 连接本地的 127.0.0.1:6006

对于普通 OpenCV、SLAM GUI、Pangolin 窗口,这套方案基本够用。对于 3DGS 这类依赖 OpenGL 和实时 viewer 的任务,VNC 可以作为调试入口,但更推荐训练端放在 AutoDL,本地电脑运行 viewer,并通过 6009 端口与训练进程通信。这样稳定性和交互体验通常会更好。

相关推荐
Web3探索者13 小时前
可视化服务器管理和传统命令行区别是什么?新手教程:Linux 运维到底该用图形界面还是 SSH 命令行?
linux·ssh
荣--17 小时前
一键部署不是为了省时间 —— 它是把"买来的 PaaS"变成"自己的平台"的拐点
运维·zabbix·工程化·一键部署·平台化·边界设计
江华森17 小时前
动手实战学 Docker — 从零到集群编排完全指南
运维
Avan_菜菜1 天前
FRP 内网穿透完整实战:从 HTTP 映射到 HTTPS 自签代理
运维·nginx·https
SelectDB2 天前
Litefuse 开源并推出单进程轻量模式,25 秒就能跑起来的 Agent 可观测与评估平台
运维·后端·自动化运维
XIAOHEZIcode4 天前
Linux系统鼠标偏移常见原因以及修复方案
linux·运维·游戏
用户0328472220704 天前
如何搭建本地yum源(上)
运维
大树887 天前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠7 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
霸道流氓气质7 天前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务