基于VNC远程连接服务器以及容器(获取图形化界面)
目录
3.2. VNC / TurboVNC(+ VirtualGL)
已有问题:基于SSH方式,在linux服务器打开Isaac sim软件 GUI界面之后,发现操作界面非常卡顿,然后就基于VNC的方法连接服务器就可以解决这个问题。
1. VNC远程连接服务器的步骤:
1.1.服务器安装VNC服务(TigerVNC)
Ubuntu:
sudo apt install -y tigervnc-standalone-server tigervnc-common
1.2. 启动VNC服务,创建桌面会话
vncserver -geometry 1920x1080 -localhost no :1
也可以通过 -IdleTimeout 参数直接指定超时时间
-
设置为0秒:表示永不超时,连接会一直保持。
-
设置为一个大数值:例如
86400代表24小时。
vncserver -geometry 1920x1080 -localhost no -IdleTimeout 0 :1
1.3. SSH 登录到服务器,
执行:vncserver -list
看到类似输出:

1.4. 重置VNC 密码
vncserver -kill :1 # 先关掉原来的会话
rm -f ~/.vnc/passwd # 删除旧密码文件(可选,但保险)
vncpasswd # 重新设置一个简单的 VNC 密码,例如: 12345678
vncpasswd 的时候:
-
输入两遍新密码(建议只用数字/字母,长度 ≤ 8,先不要用复杂符号)
-
询问 “view-only password?” 直接输入
n回车
再重新启动 VNC:
vncserver -geometry 1920x1080 -localhost no :1
vncserver -list # 再看一眼,确认 :1 已经起来
1.5. 客户端连接
本地 Windows 机器:安装 TurboVNC Viewer 、RealVNC Viewer或者MobaXterm
连接地址填:服务器IP:1 或 服务器IP::5901
弹出认证窗口时,密码填刚才 vncpasswd 设置的那个。
连上后就能看到服务器桌面,在里面打开终端、运行 Isaac Sim 等程序了。
1.6. 关闭 / 清理 stale VNC

如果显示stale,表示VNC 会话已经死掉,但残留的 pid / lock 文件还在,所以系统以为 session 还存在。
(1)先确认没有真正的 VNC 进程
ps -ef | grep Xtigervnc
如果只看到 grep,说明确实没有运行中的 VNC。
(2)删除相关残留文件
删除 .vnc 残留
ls ~/.vnc
删除 pid 和 log:
rm -f ~/.vnc/*.pid
rm -f ~/.vnc/*.log
(3)再查看
vncserver -list
如果正常,stale 就消失了。
2. VNC远程连接服务器的容器
首先在服务器里进入容器内部
2.1 容器内安装GUI桌面环境以及创建会话
1. 安装相关软件
apt update
apt install -y dbus-x11 xfce4 xfce4-session
2. 配置 VNC 启动脚本
vim /root/.vnc/xstartup 添加以下内容:
#!/bin/sh
unset SESSION_MANAGER
unset DBUS_SESSION_BUS_ADDRESS
# 1) TigerVNC 正常会传入 DISPLAY(比如 :1 / :2)
# 2) 如果没传入,就从该会话的端口/环境推不出来的话,兜底用 :2
: "${DISPLAY:=:2}"
export DISPLAY
export XDG_SESSION_TYPE=x11
export XDG_RUNTIME_DIR=/tmp/runtime-root
mkdir -p "$XDG_RUNTIME_DIR"
chmod 700 "$XDG_RUNTIME_DIR"
exec dbus-launch --exit-with-session xfce4-session
保存后:
chmod +x /root/.vnc/xstartup
删除相关:
vncserver -kill :2 # 杀死原有桌面会话2
rm -f /root/.vnc/*:2.pid /root/.vnc/*:2.log
重新创建会话
vncserver -geometry 1920x1080 -localhost no :2
vncserver -list # 显示如下,代表VNC桌面会话创建成功

2.2 用“端口转发”实现连接
当前方法适用于容器已经创建,容器里 已经启动VNC
1)找到容器 IP
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' 容器名
假设输出是 172.17.0.3
2)在服务器上做端口转发(把服务器 5902 转到容器 5902)
退出容器,进入到服务器中,采用socat进行标准端口映射
sudo apt install -y socat
sudo socat TCP-LISTEN:5902,fork TCP:172.17.0.3:5902
# TCP-LISTEN:5902代表服务器的端口,172.17.0.3:5902代表容器IP以及VNC会话端口
注意执行sudo socat TCP-LISTEN:5902,fork TCP:172.17.0.3:5902之后,不要关闭终端或者ctrl+z ,会断开连接(但是进程还在),否则VNC客户端无法连接
ctrl+z 断开连接后,可以用 下述命令继续跑
fg %4
杀死socat进程
sudo ss -lntp | grep ':5902'
sudo kill -9 pid
一切完毕后,然后 Windows 端通过下述方式,就可以连接上容器
连接地址填:服务器IP:2 或 服务器IP::5902
注意:这里的服务器的5902端口会指向容器的5902端口
3. SSH和VNC方法比较
简单说一句:
SSH 用来“远程敲命令”,VNC 用来“远程看整个桌面”。
跑 Isaac Sim 这种 3D GUI,基本就是:SSH + VNC(或 TurboVNC+VirtualGL / DCV),而不是 SSH X11 转发。
3.1. SSH(含 X11 转发)
优点: 适合:命令行、脚本、日志、轻量 GUI(小对话框那种)。
缺点(关键)
-
X11 转发非常不适合 3D / 大量图形:
-
每一帧都要把图像/绘图指令通过 SSH 传回本地,延迟大、带宽占用高。
-
Isaac Sim、Blender 这类 GPU 渲染程序几乎一定会“动一下就 1–5 FPS”。
-
3.2. VNC / TurboVNC(+ VirtualGL)
特点:
- 服务端跑一个完整桌面会话(:1 → 5901)。
-
更适合 3D 应用:
-
渲染在服务器 GPU 上完成,只把压缩后的画面传回来。
-
TurboVNC + VirtualGL / NICE DCV 这类方案,性能比 X11 转发好一个数量级。
-
-
能看到完整桌面环境
缺点
-
需要额外安装/配置 vncserver、xstartup 等。
结论:
-
SSH:继续做日常开发、上传下载、跑脚本。
-
VNC / TurboVNC:专门用来进服务器“看桌面 + 跑 Isaac Sim GUI”。
4. 实际问题
利用TurboVNC去连接服务器时发现一个问题:就是容易断开,经过测试主要受网络波动影响,本机和 Linux 服务器之间的底层网络链路存在间歇性中断或严重丢包,就容易导致 VNC 断开。
在MobaXterm的session也有vnc,连接linux服务器很稳定,几乎断连,但是实际使用发现鼠标滚轮在其vnc桌面内不起作用,使用感觉不方便,设置里面也没有找到这一块,这个暂时没搞懂😔

最终解决方案:MobaXterm 端口转发 + TurboVNC 本地连接
- 首先,在linux服务器已经创建了vnc桌面会话,例如设置端口为5901
- 使用 MobaXterm 建立本地端口转发:如上图所示,在MobaXterm选择Tunneling,Destination server代表服务器地址和端口,这里就是127.0.0.1:5901,SSH server代表基于SSH的方式去连接服务器(用户名@IP:port), Forward port可以理解为MobaSSH暴露的端口。最后再开启运行。
- turbovnc连接,vnc server选择:127.0.0.1:5901(假设Forward port是5901)
本质上:这里本质上是借助MobaSSH 进行了中转,由于SSH传输更加稳定,“断线重连”机制也更加出色。turbovnc连接之后也很稳定,基本不会断开。
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐

所有评论(0)