背景
有些时候要远程运行开发板上的Linux GUI程序,但VNC经常抽风用不了,特别在Ubuntu 1604下面更是如此,所以需要用ssh客户端的X11转发
功能,来将Linux GUI程序通过unix domain socket
发给本地X server
的视频流数据,转换成inet socket
并转发到运行在Windows的X server
操作步骤
PuTTY配置
PuTTY是一款支持X11端口转发
的ssh客户端,要使能该特性,在创建session时按下图配置
VcXsrv配置
VcXsrv是一款运行在Windows上的X server
,可以接收并解析Windows从X11端口收到的GUI数据流并显示到屏幕
-
安装后从开始菜单里找到
XLaunch
菜单项,点击,进入下图界面
注意display number
最好填成0(开发板自身显卡)和-1(X server和X client自动协商,不靠谱)以外的数字(比如10) -
初始不启动任何GUI程序
-
切记禁用
访问控制
!
否则会无法连接 -
不用保存配置,因为保存了也用不了,直接点完成,下次启动重头再来
Windows防火墙配置(简单关闭)
X11对应的端口默认是关闭的,为了开启,你可以添加一条防火墙规则
或者像我一样,直接关闭防火墙,简单粗暴😉
Linux侧配置
启动GUI程序前,配置DISPLAY环境变量,告诉GUI程序X server在哪
export DISPLAY=192.168.20.103:10.0
解释下:
- export关键字用于导出DISPLAY环境变量
- 192.168.20.103是X server的IP,也就是win10电脑的IP
- 10是X server的显卡编号(一台机器可能有多个显卡)
- 0是连到X server指定显卡的显示器编号(一个显卡可能输出到多台显示器)
最终效果
一个注意事项
该方法仅适用于2D GUI程序,如果是3D程序,特别是用到OpenGL加速的3D程序,则GUI程序还是会启动失败,此时可以用远程桌面程序
来远程到开发板,再启动3D程序,才能启动成功。
这样能成的原因是,3D程序的矢量输出
被开发板的显卡
驱动光栅化
成2D像素,然后被远程桌面服务器程序压缩传输
到远程桌面客户端,所以我们看到的3D程序其实是它的2D化远程投影。
如果在开发板上安装xrdp
程序,Windows的远程桌面程序可能连接成功,但大概率失败,此时可以
- 在win10上安装WSL,再在WSL里安装
Remmina
软件包 - 用本贴所述方法在WSL里启动Remmina程序,注意启动前X server的IP改成localhost
- 然后用Remmia远程桌面到开发板
- 祝你好运!