在没有 GUI 的Remote Linux上查看仿真窗口
如何在只有 VSCode、没有 GUI 的远程服务器上查看仿真窗口?
很多深度学习 / 机器人仿真服务器只有 SSH 或 VSCode Remote,没有本地桌面环境。此时直接运行 MuJoCo、robosuite、pygame 等带窗口的程序,通常会遇到:
1 | |
这说明当前 shell 没有图形显示通道,GUI 程序没有地方绘制窗口。一个比较通用的解决方式是:
- 在服务器上启动一个虚拟桌面:VNC。
- 用 noVNC 把这个桌面转成浏览器可访问的网页。
- 用 VSCode 的 Ports 面板转发 noVNC 端口。
- 在本地浏览器中访问远程桌面。
这样即使本地只有 VSCode,也可以看到远程服务器上的图形窗口。
环境
本文示例环境:
- Ubuntu 22.04
- VSCode Remote / SSH 环境
- 当前用户有 root 或 sudo 权限
- 远程服务器无物理显示器,
DISPLAY为空
检查当前是否有图形显示:
1 | |
如果二者都是空的,说明直接启动 GUI viewer 通常不会弹出窗口。
安装组件
更新 apt 软件源:
1 | |
安装 XFCE 桌面、TigerVNC、noVNC 和 websockify:
1 | |
说明:
xfce4-*:轻量桌面环境。tigervnc-standalone-server:虚拟桌面服务。tigervnc-tools:提供vncpasswd,用于生成 VNC 密码。novnc:浏览器端 VNC 客户端。websockify:把 VNC 的 TCP 连接转成浏览器可用的 WebSocket。
配置 VNC
创建 VNC 配置目录:
1 | |
设置 VNC 密码。TigerVNC 传统密码最多只使用前 8 个字符,建议设置一个临时密码,并只绑定 localhost。
1 | |
创建 ~/.vnc/xstartup,让 VNC 会话启动 XFCE:
1 | |
启动 VNC 虚拟桌面
启动 :1 号 VNC 桌面:
1 | |
成功后会看到类似输出:
1 | |
这里有两个重要信息:
DISPLAY=:1- VNC 端口是
5901 localhost yes表示 VNC 端口只监听127.0.0.1,不要直接暴露到公网。
启动 noVNC 网页代理
让 noVNC 监听 6080,并转发到 VNC 的
5901:
1 | |
检查 noVNC 页面是否可访问:
1 | |
如果返回 HTTP/1.1 200 OK,说明 noVNC 已经启动成功。
也可以检查进程:
1 | |
在 VSCode 中访问远程桌面
打开 VSCode 的 Ports 面板,手动转发远程端口:
1 | |
然后在本地浏览器中打开 VSCode 给出的地址,通常是:
1 | |
如果页面要求填写连接参数,可以使用:
1 | |
多数情况下直接点击 Connect,再输入 VNC 密码即可。
noVNC 页面文件说明
访问 http://localhost:6080/ 时,可能会看到这些文件:
1 | |
含义如下:
vnc.html:完整版 noVNC 页面,功能最全,推荐日常使用。vnc_lite.html:精简版页面,界面更简单。vnc_auto.html:通常是指向vnc_lite.html的软链接,用于简化 / 自动连接入口。app/:完整版 UI 逻辑。core/:VNC / RFB 协议核心实现。include/:旧版本 noVNC 的兼容加载资源。utils/:工具脚本。vendor/:第三方前端依赖。
一般只需要打开:
1 | |
在远程桌面中运行仿真
进入 noVNC 桌面后,可以打开 XFCE Terminal,也可以继续在 VSCode
终端里指定 DISPLAY=:1 运行 GUI 程序。
例如运行 robosuite / MuJoCo GUI viewer:
1 | |
如果是离屏渲染保存视频,则不需要 VNC,可以继续使用 EGL:
1 | |
两种方式的区别:
DISPLAY=:1 MUJOCO_GL=glfw:打开交互式窗口,在 noVNC 桌面里看。MUJOCO_GL=egl:无窗口离屏渲染,适合训练、评估、保存 mp4。
常用管理命令
查看正在运行的 VNC 桌面:
1 | |
停止 :1 桌面:
1 | |
重新启动:
1 | |
查看 noVNC / VNC 进程:
1 | |
查看端口监听:
1 | |