场景
root@NanoPi2:/home/fa/Documents/opencv-demo# ./demo
(edges:1685): Gtk-WARNING **: cannot open display:
按照网上说明添加display如下:
root@NanoPi2:/home/fa/Documents/opencv-demo# export DISPLAY=:0.0
root@NanoPi2:/home/fa/Documents/opencv-demo# ./demo
No protocol specified
(edges:1671): Gtk-WARNING **: cannot open display: :0.0
加xhost +
之类的也没用。后来参考此篇说法明白了原因:
因为Xserver默认情况下不允许别的用户的图形程序的图形显示在当前屏幕上. 如果需要别的用户的图形显示在当前屏幕上, 则应以当前登陆的用户, 也就是切换身份前的用户执行如下命令。
因此,我直接切换到当前图形界面的用户下,执行程序是OK的,
root@NanoPi2:/home/fa/Documents/opencv-demo# su fa
root@NanoPi2:/home/fa/Documents/opencv-demo# ./demo
ok starting demo
按上述说法,在此账户下输入如下命令:
fa@NanoPi2:~/Documents/opencv-demo$ xhost +
access control disabled, clients can connect from any host
fa@NanoPi2:~/Documents/opencv-demo$ su root
Password:
root@NanoPi2:/home/fa/Documents/opencv-demo# ./demo
ok starting demo
在转回root用户下也可执行了。试了下如下:
root@NanoPi2:/home/fa/Documents/opencv-demo# su fa
fa@NanoPi2:~/Documents/opencv-demo$ xhost -
access control enabled, only authorized clients can connect
综上所述:在当前图形界面的账户里如果你使能了access control功能,那么只有允许了的用户才能启动GUI程序显示到当前的屏幕,否则由于无法显示而启动失败。
总结
参考文章:Linux在远程X Server上显示图形界面
-
一、远程的X Server
-
X Window System由客户端和服务端组成,服务端X Server负责图形显示,而客户端库**X
Client**根据系统设置的DISPLAY环境变量,将图形显示请求发送给相应的X Server。
X Server是Gnome等桌面环境的基础,一个桌面环境通常包含了XDM(X Display Manager,通常的图形化用户登录界面就属于XDM)、窗口管理器(X Server显示的图形是没有“窗口”边框的,通过替换窗口管理器可以实现不同的视觉效果,比如实现3D效果的Compiz)等组件。进行图形显示并不需要桌面环境,只要有X Server即可。
依上述说明:
-
首先要在远程要显示图形的机子(简称图形机)上打开X erver服务。两种方法启动:startx和xinit,命令参数一样的
startx [ [ client ] options ... ] [ -- [ server ] [ display ] options ... ] eg: xinit /usr/bin/xterm -- :1 &
选项分为两个部分,以符号 “–”为界,前面是客户端选项,后面是X Server选项。客户端程序必须是绝对路径(
/usr/bin/xterm
),如果一个客户端也没有,X sever就会自行退出,所以开机时默认会启动一个客户端。服务端默认X :0
display:用于设置客户端远程连接该图形服务器的DISPLAY名称
启动完成后查看进程可看到/usr/bin/Xorg :0 -nr -verbose -audit 4 -auth /var/run/gdm/auth-for-gdm-Ikd3i7/database -nolisten tcp vt1
-
授权远程机访问X server
xhost [[+-]name ...]
直接
xhost +
允许所有访问,xhost -
禁止所有访问,xhost可以查询当前访问列表信息 -
在客户端配置显示机
指定在哪个图形机上显示通用环境变量DISPLAY指定,格式如下:export DISPLAY = [Address]:{NumA}.{NumB}
其中Address为X Server地址,如果Address为空,则通过域套接字连接到本地的X Server。
NumA为display number,这与传递给xinit的display选项对应,这个display number为X Server的监听端口号送去6000。因此,实际上此时B机器上的X Server在监听6001端口,可以使用netstat命令验证。
NumB为screen number(可能是多显示器的情况下指定显示在哪个显示器,未验证),通常情况下都为0.
二、
SSH隧道转发
-
-
图形机上的SSH服务开启了X11转发功能。
配置文件/etc/ssh/sshd_config
中X11Forwarding yes
在ssh远程登录时加上-X选项如下:
ssh -X 192.168.9.135
启动一个图形程序测试下。