问题过程描述
许多经常部署Oracle数据的管理员经常需要对数据库软件进行部署,但大多数都是通过远程部署的方式进行部署,使用远程部署有两种方式,一种是通过脚本部署,另一种就是通过图形化进行部署。
但linux使用图形化并不像windows那么一帆风顺,这也是由于对linux图形的不了解造成。一般连接过程是通常是用putty或xshell等ssh远程客户端连接到服务器,本地电脑运行一个支持X Server协议应用,利用ssh加密隧道将图形界面传送到本地电脑X Server上使用图形化界面,这样就可以看到服务器的图形界面。
但大多数时候却显示下面错误:
那么这个display到底要怎么解决呢?
X-Window
要理解display还是要了解什么是x-windows,网上也有很多文章说的很详细,这里我重点是讲解怎么去排查和解决这个问题。先了解一下基本信息。
1. Xserver和Xclinet
Xserver提供基础硬件环境,如配置键盘、鼠标、显卡、显示器驱动等。 Xclinet进行图形运算,如gimp、火狐这些应用属于客户端。 可以简单的这样理解,Xserver如同我们的操作系统一样,将基础的硬件资源初始化,如cpu内存这些,xclinet在操作系统上使用cpu和内存.
2. 连接方式
这里的连接方式有两种,一种是直接连接,另一种是利用ssh进行转发
1). 直接访问
直接访问就是X客户端直接进行访问X服务端进行连接传输。这里也分两种场景,一种是X客户端主动连接X服务端,这就要求X服务端进行监听,另一种X服务器去主动连接。
想要X客户端连接X服务端,X服务端可通过下面几种方式进行监听:
tcp 表示使用IP`v4或IPv6的TCP协议,inet 表示只使用IPv4的TCP协议inet6 表示只使用IPv6的TCP协议unix UNIX主机套接字,使用socket文件实现进程间通信,不支持在windows上进行访问
本机一般使用UNIX套接字进行通信,在设备上同时部署X服务端和X客户端,启动图形桌面时,X服务器先初始化相关硬件设备,并加载驱动,具体日志可参考X启动日志:/var/log/Xorg.0.log
,Xserver启动时创建socket文件,窗口管理器则以X客户端启动,xclient连接到socket进行通信,这时现实屏幕就显示出画面。
使用套接字好处是连接安全、传输高效稳定,缺点是只能在本机进行访问。
查看X服务端socket文件位置和连接情况
[ user@pc ~] $ ss -xla| grep X11
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
u_str LISTEN 0 4096 /tmp/.X11-unix/X0 15212 * 0
u_str LISTEN 0 4096 @/tmp/.X11-unix/X0 15211 * 0
u_str ESTAB 0 0 @/tmp/.X11-unix/X0 24473 * 22233
u_str ESTAB 0 0 @/tmp/.X11-unix/X0 89299 * 86989
……
远程环境下我们需要将远端画面传输到本地,就需要使用网络远程连接,Windows环境下可以使用Xmanage相关软件完成本地监听。linux环境下Xserver默认不进行监听,所以需要在启动Xserver加入选项-listen tcp
,这时X服务根据启动的显示编号监听相关端口,如:0
则监听6000端口,:1
监听6001端口。 不管是windows还是linux在配置X服务端时需要配置这个displaynumb(显示编号),X客户端才可将画面传过来。
Linux查看X服务器监听状态 这里使用的是Xephyr
,它的功能与X类似,它可以在图形模式下运行,而X只能在文本模式下运行。 X默认监听模式 -nolisten tcp
,此选项表示不监听tcp协议,即监听unix套接字。
[ user@pc ~] $ sudo ss -atlp
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
LISTEN 0 4096 0.0.0.0:6001 0.0.0.0:* users:(( "Xephyr" ,pid= 15335,fd= 5))
XDMCP :还有一种模式不常用到,那就是使用X服务器去主动连接,这种方式的效果和Windows远程桌面类似。但X客户端本身不会监听端口,这时就需要使用显示管理器进行监听,显示管理器使用的是XDMCP
协议进行通信,通常监听端口为177
,现在主流的显示管理器有gdm、LightDM、LXDM、SDDM,这些显示管理器为了安全一般没有对177端口进行监听,需要根据文档具体配置开启监听功能。
[ user@pc ~] $ sudo ss -lunp
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
UNCONN 0 0 *:177 *:* users:(( "gdm3" ,pid= 364775,fd= 12))
提示: 除了开启监听外,大多数故障可能来之放火墙未放通相应服务端口。
这时在启动本端X服务端时,XDMCP协议可以使用三种方式连接远端图形界面。
IP地址直接访问 使用windows端X服务器软件时,软件会询问你远端主机的IP地址,使用LInux端时加入参数-query
后面跟远端主机IP地址或主机名; 具体访问过程是X客户端连接远端主机显示管理器端口177建立连接,显示管理器配置相关显示环境变量,再启动登陆管理器,这时你的X服务端就能显示远端的登陆界面。 这种模式适用与点对点,跨三层网络。广播地址泛访问 使用广播时X服务端发起本地广播,当显示管理器收到广播包就像X服务端回包,这个模式和DHCP类似,好处是不用填写目标主机的IP,不好的地方就是X服务端只响应第一个回复的主机。主机间接访问 这个用于间接访问,A主机不能直接访问C主机,A就使用B主机间接访问C主机。
XDMCP 没有使用压缩和优化传输算法,流量带宽占用较大,一般只在本地网络中进行使用。
2)SSH转发
X windows在传输时没有进行加密,安全得不到保障,还需要配置相关策略才可进行访问,而是用SSH转发X windows就可以解决刚刚讲的问题。SSH转发的原理是SSH本地监听unix套接字,显示编号为:10
,X客户端访问:10
时ssh服务端将流量转发到ssh连接客户端上。
这里需要配置sshd服务开启X转发功能,而ssh客户端也需要配置将转发过来的数据交給谁处理。
开启SSHD X转发 修改SSHD配置文件/etc/ssh/sshd_config
,找到下面按需求取消注释进行启用
X11Forwarding yes
X11DisplayOffset 10
X11UseLocalhost yes
客户端开启X转发 ssh客户端开启的前提条件是本地已经启动了X服务端,ssh连接客户端启一个连接桥梁的作用,ssh客户端开启后将sshd服务的图形流量转发到本地X服务端上,ssh客户端可以是Putty、Xshell、SecureCRT等,开启方式是修改会话的X转发功能,将复选框打上勾就完成功能开启。
LInux的ssh客户端可以在连接时加入参数-X
表示开启转发,如ssh -X username@hostname
。也可修改全局配置文件/etc/ssh/ssh_config
或用户配置文件~/.ssh/config
加入配置参数:ForwardX11 no
开启转发功能
提示 ssh客户端和ssh服务但都启用X转发的功能后,ssh客户端在登陆到远程端时会自动配置DISPLAY
的环境变量,并且会协商auth
的sookit值。
3. 安全认证
X服务端在开放监听时,X客户端只要知道X服务端的显示编号就能在X服务端进行显示,但这就存在一个不安全的因素,其他用户或主机知道X服务的显示标号也可将自己的内容显示到X服务端,那这个X服务端可能就会像windows弹窗广告一样,满屏幕都是其他人的X客户端,为了避免这个问题X服务端开启了安全认证。
X WIndows在以前使用使用的是xhost
命令来管理授权,现在则推荐另外一个命令完成认证:xauth
.
1). xhost
xhost的使用方法很简单,+
表示关闭访问控制,-
表示开启访问控制,默认是所有主机都不信任。 开启验证模式后,只允许xhoost允许的主机进行连接和用户的.Xauthority
文件中有Xserver的cookie条目的用户连接。
xhost
————————————————————————————————————————————————————————————————
INET:220.181.38.148 ( no nameserver response within 5 seconds)
INET:39.156.69.79 ( no nameserver response within 5 seconds)
xhost +
————————————————————————————————————————————————————————————————
access control disabled, clients can connect from any host
xhost -
————————————————————————————————————————————————————————————————
access control enabled, only authorized clients can connect
xhost 192.168.1.1
————————————————————————————————————————————————————————————————
192.168.1.1 being added to access control list
xhost 192.168.1.0
————————————————————————————————————————————————————————————————
192.168.1.0 being added to access control list
xhost -192.168.1.1
————————————————————————————————————————————————————————————————
192.168.1.1 being removed from access control list
2). xauth
xhost控制的方式简单粗暴,xauth则是根据cookie
值进行验证的,X服务端和用户各自拥有各自的cookie
文件,X客户端连接时会获取用户的cookie
值,再将用户的cockie
发送给X服务器,X服务器会对比客户端发来的cookie
值和自身是否条目中是否匹配,只有匹配时才可连接。 查看用户auth文件路径信息
xauth文件路径是根据用户环境变量:XAUTHORITY
来决定,如果未配置XAUTHORITY
环境变量,默认存放路径在:$HOME/.Xauthority
。 .Xauthority
文件是有脚本startx
生成的。
xauth -info
———————————————————————————————————————————
Authority file: /home/user/.Xauthority
File new: no
File locked: no
Number of entries: 1
Changes honored: yes
Changes made: no
Current input: ( argv) :1
查看X服务端xauth路径
ps -aux | grep X
———————————————————————————————————————————
root 596 1.3 0.8 1097120 136228 tty1 Ssl+ Oct23 18:45 /usr/lib/Xorg :0 -nolisten tcp -auth /var/lib/xdm/authdir/authfiles/A:0-H7d7G9
查看cookie
条目值
# 查看当前用户cookie条目值
xauth list
————————————————————————————————————————————
pc/unix:0 MIT-MAGIC-COOKIE-1 87ff7969963f5bd8953094d4ab106f5
# 查看X服务端cookie值(普通用户无权访问该文件)
xauth -f /var/lib/xdm/authdir/authfiles/A:0-H7d7G9 list
————————————————————————————————————————————
#ffff##: MIT-MAGIC-COOKIE-1 87ff7969963f5bd8953094d4ab106f5
这里可以发现用户端的cookie值与X服务端的一致;当不一致时就会发生不能显示错误。
cookie的生成
cookie是使用mcookie
命令生成的,命令很简单,只需要输入该命令,就打印一个cookie直
$ mcookie
84bb129ea77405217b1802d15c42441f
排除故障
1. 确定问题
由上面内容知道Xwindows是如何连接的,掌握了上面知识就可以对问题进行定位。
A:确定自己的连接方式
SSH远程连接
远程端
本地端
xauth认证
xauth认证
X转发
SSH隧道
sshd监听
X客户端1
X客户端2
SSHD服务端
X服务端
SSH客户端
直接连接
这种场景常发生在同台主机上使用A帐号能正常使用,切换到B账户无法访问图形。
用户B
X服务端
用户A
OK
can't open
X客户端2
xauth文件
xauth文件
X服务端
xauth文件
X客户端1
B: 逐步排查故障
检查X服务端 不管是转发还是直接连接,第一步先应检查本地X服务端启动是否正常。 Linux先确定X服务启动方式是tcp还是unix,再根据相应的命令检查是否正常监听 Windows检查相关X服务是否安装并运行正常
检查连接配置 这步主要针对ssh转发,远程端要检查SSHD配置文件是否配置正常,本地端检查是否启用X转发选项,一些SSH客户端配置完毕后需要重新连接到远程端。
检查防火墙配置 如果使用tcp方式进行访问,要多次检查防火墙规则策略,或两个设备之间的安全设备策略。
检远程端用户环境变量 检查远端用户变量DISPAY
是否配置,如果未配置,X客户端将不知道将图像传送至什么地方。
检查xauth认证 先核查用户xauth文件是否存储,再检查用户xauth与X服务端是否有匹配的sookie
,如果没有需要即使进行添加。
2. 对症下药
2.1 DISPLAY配置
DISPLAY是X客户端连接到X服务端的重要依据,通常以 主机名
+显示编号
+显示器
组合方式进行配置,如下:
export DISPLAY= 192.168.1.1:0.0
参数解读 >export
: 表示将DISPLAY这个变量设置到系统环境变量中(仅本次登陆有效) DISPLAY
: 表示环境变量名称,等于符号后面的内容为变量值,查看DISPLA的命令为:echo $DISPLAY
192.168.1.1
: 表示X服务端地址,可以使用主机名或IP地址或域名进行表示 :0.0
: 表示连接192.168.1.1这台主机的第0
号X服务端,后面的.0
表示这个X服务端的第0块显示器,相当于一个X服务端可以有多块显示器,在这里进行指定显示。如果使用unix可以不要填写主机名。
所以要想编写DISPLAY的配置,前提条件是知道X服务端相关信息,下面给出常用的DISPLAY配置参考:
export DISPLAY= :0
export DISPLAY= localhost:10.0
export DISPLAY= 192.168.1.1:5
2.2 xauth认证配置
很多报错用户的xauth有没有认证有关,
xauth文件不存在 使用下面命令查看文件是否存在:
xauth info
———————————————————————————————————————————
xauth: file /root/.Xauthority does not exist < -文件不存在
Authority file: /root/.Xauthority
File new: yes
File locked: no
Number of entries: 0
Changes honored: yes
Changes made: no
Current input: ( argv) :1
如果报错信息如上显示,可以创建xauth文件,创建前需要收集目标X服务端的cookie
值,收集方式如下,第一步获取X服务的验证文件路径,本次测试路径为:/var/lib/xdm/authdir/authfiles/A:0-H7d7G9
,得到后使用root权限执行下面命令。
xauth -f /var/lib/xdm/authdir/authfiles/A:0-H7d7G9 list
这样我们就得到了X服务的sookit值:87ff7969963f5bd8953094d4ab106f50
,假设本次X客户端和服务端再同一台设备上,连接方式使用直接连接unix:0
,我们就是使用下面命令创建用户xauth认证文件。
xauth add localhost:/unix:0 . 87ff7969963f5bd8953094d4ab106f50
参数讲解 add
表示创建sookit条目 localhost:/unix:0
: 表示主机名为:localhost,连接到0号X服务端,使用unix进行连接 .
: 表示使用MIT-MAGIC-COOKIE-1进行认证 87ff7969963f5bd8953094d4ab106f50
: cookie的值
再使用xauth -list
就可以到刚创好的条目值
除了在X客户端的用户环境可以添加也可以使用下面命令自动生成,其中hoastname修改成你自己的主机名称。这样添加的cookie还需要添加到X服务端的认证文件上。
xauth add hostname:0 . ` mcookie`
使用xhost(不推荐) 大多数教程的方法是将认证控制关闭,xauth认证的前提也是xhost认证功能是开启的,检查xhost开启状态。
xhost
———————————————————————————————————————————
access control enabled, only authorized clients can connect
access control disabled, clients can connect from any host
开启和关闭方法请参考本文xhost
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)