在没有 GUI 的Remote Linux上查看仿真窗口

如何在只有 VSCode、没有 GUI 的远程服务器上查看仿真窗口?

很多深度学习 / 机器人仿真服务器只有 SSH 或 VSCode Remote,没有本地桌面环境。此时直接运行 MuJoCo、robosuite、pygame 等带窗口的程序,通常会遇到:

1
2
echo $DISPLAY
# 空输出

这说明当前 shell 没有图形显示通道,GUI 程序没有地方绘制窗口。一个比较通用的解决方式是:

  1. 在服务器上启动一个虚拟桌面:VNC。
  2. 用 noVNC 把这个桌面转成浏览器可访问的网页。
  3. 用 VSCode 的 Ports 面板转发 noVNC 端口。
  4. 在本地浏览器中访问远程桌面。

这样即使本地只有 VSCode,也可以看到远程服务器上的图形窗口。

环境

本文示例环境:

  • Ubuntu 22.04
  • VSCode Remote / SSH 环境
  • 当前用户有 root 或 sudo 权限
  • 远程服务器无物理显示器,DISPLAY 为空

检查当前是否有图形显示:

1
2
echo "DISPLAY=$DISPLAY"
echo "WAYLAND_DISPLAY=$WAYLAND_DISPLAY"

如果二者都是空的,说明直接启动 GUI viewer 通常不会弹出窗口。

安装组件

更新 apt 软件源:

1
apt-get update

安装 XFCE 桌面、TigerVNC、noVNC 和 websockify:

1
2
3
4
5
6
7
8
9
10
11
12
13
DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \
xfce4-session \
xfce4-panel \
xfce4-terminal \
xfwm4 \
xfdesktop4 \
thunar \
dbus-x11 \
x11-xserver-utils \
tigervnc-standalone-server \
tigervnc-tools \
novnc \
websockify

说明:

  • xfce4-*:轻量桌面环境。
  • tigervnc-standalone-server:虚拟桌面服务。
  • tigervnc-tools:提供 vncpasswd,用于生成 VNC 密码。
  • novnc:浏览器端 VNC 客户端。
  • websockify:把 VNC 的 TCP 连接转成浏览器可用的 WebSocket。

配置 VNC

创建 VNC 配置目录:

1
mkdir -p ~/.vnc

设置 VNC 密码。TigerVNC 传统密码最多只使用前 8 个字符,建议设置一个临时密码,并只绑定 localhost。

1
2
printf 'vla12345\n' | vncpasswd -f > ~/.vnc/passwd
chmod 600 ~/.vnc/passwd

创建 ~/.vnc/xstartup,让 VNC 会话启动 XFCE:

1
2
3
4
5
6
7
8
9
10
cat > ~/.vnc/xstartup <<'EOF'
#!/bin/sh
unset SESSION_MANAGER
unset DBUS_SESSION_BUS_ADDRESS
export XDG_SESSION_TYPE=x11
export XKL_XMODMAP_DISABLE=1
exec dbus-launch --exit-with-session startxfce4
EOF

chmod +x ~/.vnc/xstartup

启动 VNC 虚拟桌面

启动 :1 号 VNC 桌面:

1
vncserver :1 -localhost yes -geometry 1600x900 -depth 24

成功后会看到类似输出:

text
1
New Xtigervnc server 'hostname:1 (user)' on port 5901 for display :1.

这里有两个重要信息:

  • DISPLAY=:1
  • VNC 端口是 5901
  • localhost yes 表示 VNC 端口只监听 127.0.0.1,不要直接暴露到公网。

启动 noVNC 网页代理

让 noVNC 监听 6080,并转发到 VNC 的 5901

1
websockify --daemon --web=/usr/share/novnc 127.0.0.1:6080 127.0.0.1:5901

检查 noVNC 页面是否可访问:

1
curl -I <http://127.0.0.1:6080/vnc.html>

如果返回 HTTP/1.1 200 OK,说明 noVNC 已经启动成功。

也可以检查进程:

1
ps -ef | grep -E 'Xtigervnc|websockify|xfce|xfwm|xfdesktop'

在 VSCode 中访问远程桌面

打开 VSCode 的 Ports 面板,手动转发远程端口:

text
1
6080

然后在本地浏览器中打开 VSCode 给出的地址,通常是:

text
1
<http://localhost:6080/vnc.html>

如果页面要求填写连接参数,可以使用:

text
1
2
3
4
Host: localhost
Port: 6080
Path: websockify
Password: vla12345

多数情况下直接点击 Connect,再输入 VNC 密码即可。

noVNC 页面文件说明

访问 http://localhost:6080/ 时,可能会看到这些文件:

text
1
2
3
4
5
6
7
8
app/
core/
include/
utils/
vendor/
vnc.html
vnc_auto.html
vnc_lite.html

含义如下:

  • vnc.html:完整版 noVNC 页面,功能最全,推荐日常使用。
  • vnc_lite.html:精简版页面,界面更简单。
  • vnc_auto.html:通常是指向 vnc_lite.html 的软链接,用于简化 / 自动连接入口。
  • app/:完整版 UI 逻辑。
  • core/:VNC / RFB 协议核心实现。
  • include/:旧版本 noVNC 的兼容加载资源。
  • utils/:工具脚本。
  • vendor/:第三方前端依赖。

一般只需要打开:

text
1
<http://localhost:6080/vnc.html>

在远程桌面中运行仿真

进入 noVNC 桌面后,可以打开 XFCE Terminal,也可以继续在 VSCode 终端里指定 DISPLAY=:1 运行 GUI 程序。

例如运行 robosuite / MuJoCo GUI viewer:

1
2
3
4
PYTHONPATH=/path/to/robosuite \
DISPLAY=:1 \
MUJOCO_GL=glfw \
python your_viewer_script.py

如果是离屏渲染保存视频,则不需要 VNC,可以继续使用 EGL:

1
MUJOCO_GL=egl python your_offscreen_render_script.py

两种方式的区别:

  • DISPLAY=:1 MUJOCO_GL=glfw:打开交互式窗口,在 noVNC 桌面里看。
  • MUJOCO_GL=egl:无窗口离屏渲染,适合训练、评估、保存 mp4。

常用管理命令

查看正在运行的 VNC 桌面:

1
vncserver -list

停止 :1 桌面:

1
vncserver -kill :1

重新启动:

1
vncserver :1 -localhost yes -geometry 1600x900 -depth 24

查看 noVNC / VNC 进程:

1
ps -ef | grep -E 'Xtigervnc|websockify'

查看端口监听:

1
netstat -ltnp | grep -E '5901|6080'

在没有 GUI 的Remote Linux上查看仿真窗口
https://d4wnnn.github.io/2026/06/17/Notion/在没有 GUI 的Remote Linux上查看仿真窗口/
作者
D4wn
发布于
2026年6月17日
许可协议