前言
在用vscode远程连接linux服务器开发的时候有将可视化结果回传到本地机器上的需求。
2023年11月29日修改:原文于研究生时期所写,工作后有同样需求于是对文中的配置进行了一些测试,发现如果是vscode+MobaXterm方案的话一些配置是多余的。
试验环境
- 本地机器:Win10
- 远程服务器:Ubuntu 20.04.2 LTS
- 已配置ssh
- 已安装MobaXterm
原理介绍
X Window System
对于X Window System 的介绍引用自维基1:
X窗口系统(X Window System,也常称为X11或X,天窗口系统)是一种以位图方式显示的软件窗口系统。最初是1984年麻省理工学院的研究,之后变成UNIX、类UNIX、以及OpenVMS等操作系统所一致适用的标准化软件工具包及显示架构的运作协议。X窗口系统通过软件工具及架构协议来创建操作系统所用的图形用户界面,此后则逐渐扩展适用到各形各色的其他操作系统上。现在几乎所有的操作系统都能支持与使用X

X 协议2由 X server 和 X client 组成:
- X server 管理主机上与显示相关的硬件设置(如显卡、硬盘、鼠标等),它负责屏幕画面的绘制与显示,以及将输入设置(如键盘、鼠标)的动作告知 X client。
- X client 则主要负责事件的处理(即程序的逻辑)。它会向X server反馈事件处理结果。
上图表示 X server 和X client不在同一台主机上依然可以按照X协议进行通讯,也就是说我们可以将远程服务器设置成X client,本地机器设置成X server,在两者之间建立通讯即可达成远程服务器处理生成图像的事件,然后反馈到本地机器上让本地机器生成结果。
实现步骤
本地端
1.X server准备
MobaXterm是集成了X server和ssh的一个非常好用的客户端,可以很方便的查看服务器文件并且能拖拽文件达成在本地机器和服务器之间进行文件传输的目的。
安装了MobaXterm后,在Settings->Configuration->X11将X11 remote access选项改选为full。
2.vscode设置
采用vscode远程连接服务器,MobaXterm作为X server的情况下,在尝试中发现通过使用vscode中的terminal运行python程序并不需要任何额外的vscode插件与设置。该部分仅作保留。
在vscode软件中的extensions中搜索Remote X11,并点击安装。
打开remote-ssh设置。(在C:\Users\你的用户名\.ssh\config)
在config文件中添加3行设置:
ForwardX11 yes ForwardX11Trusted yes ForwardAgent yes
服务端
1.检查配置文件
sudo vim /etc/ssh/sshd_config
结果发现我的配置文件已经有相关设置。
X11Forwarding yes
#X11DisplayOffset 10
#X11UseLocalhost yes
结合资料应该是必须要设置这两项。(我的配置文件没有设置X11UseLocalhost,应该是默认该值为no)
X11Forwarding yes
X11UseLocalhost no #禁止将X11转发请求绑定到本地回环地址上
2.设置环境变量
据查阅资料4,MobaXterm 上的X server启动后默认会监听本地6000端口,X client通过环境变量DISPLAY获取X server服务地址,例如DISPLAY=本机ip地址:0.0代表X server在本机6000端口,DISPLAY=本机ip地址:1.0代表X server在本机6001端口依此类推。
~/.bashrc文件是用户级的可以自定义的配置文件,当每次开启新终端时系统都会读取该文件执行其中的配置命令。
给服务器增加DISPLAY环境变量,修改.bashrc文件:
vim ~/.bashrc
在文件中加一句:
export DISPLAY=你的本地主机ip:0.0
最后输入命令生效一下:
source ~/.bashrc
验证
跑了一下mmdet,可以在本地输出目标检测结果图了。
再尝试跑了一下open3d,也可以可视化点云了。
参考
- [1] Wikipedia
- [2] linux服务器通过X11实现图形化界面显示
- [3] Linux X11 远程图形显示
- [4] SSH下Linux X Server的配置