问题现象
centos7.6系统已经正常安装vnc相关组件,并且通过vncclient工具可以正常连接到vncserver,但由于不知名误操作导致vnc 工具登录连接后,出现黑屏、灰屏、鼠标大黑叉情况。
同时,通过尝试重启vnc server来解决问题,重启前通过kill -9强制停掉了Xvnc进程,强制停止进程后,发现vnc server已经不能正常重启,重启命令没有报错,重启完查看服务状态为inactive,同时ps发现并没有相关的Xvnc进程。
[root@database3 .X11-unix]# systemctl start vncserver@:1.service
[root@database3 .X11-unix]# vncserver :1
New 'database3:1 (root)' desktop is database3:1
Starting applications specified in /root/.vnc/xstartup
Log file is /root/.vnc/database3:1.log
[root@database3 .X11-unix]# vncserver :2
New 'database3:2 (root)' desktop is database3:2
Starting applications specified in /root/.vnc/xstartup
Log file is /root/.vnc/database3:2.log
[root@database3 .X11-unix]# vncserver :1^C
[root@database3 .X11-unix]# ps -ef | grep -i vnc
root 19042 16877 0 19:10 pts/0 00:00:00 grep --color=auto -i vnc
分析解决
1、查看vnc service服务配置文件正确性
一般情况下,vnc安装后特定打开窗口服务的配置文件在/etc/systemd/system/目录下,(copy from /lib/systemd/system/vncserver@.service),名称是vncserver@:1.service,":"后面的数字随着开启vnc窗口而变化,多个窗口开启时,对应多个文件。
配置中文件中主要内容,主要关注service下面的ExecStartPre等参数的值。
[Unit]
Description=Remote desktop service (VNC)
After=syslog.target network.target
[Service]
#Type=simple
Type=forking
# Clean any existing files in /tmp/.X11-unix environment
ExecStartPre=/bin/sh -c '/usr/bin/vncserver -kill %i > /dev/null 2>&1 || :'
ExecStart=/usr/sbin/runuser -l root -c "/usr/bin/vncserver %i"
# 服务启动后对应的进程文件所在的位置
PIDFile=/root/.vnc/%H%i.pid
ExecStop=/bin/sh -c '/usr/bin/vncserver -kill %i > /dev/null 2>&1 || :'
[Install]
WantedBy=multi-user.target
2、查看vncserver启动日志
vnc server启动日志一般在用户的家目录下的隐藏文件.vnc中。如果是root用户,那么日志在/root/.vnc/中。
当使用systemctl restart vncserver@:1.service或者systemctl start vncserver@:1.service或者vncserver :1等命令启动vncserver时,会在/root/.vnc目录下生成对应的启动日志文件。 启动日志文件名称的格式为:“主机名:启vnc窗口标识.log”.查看日志发现,日志中包含kill vnc进程的操操作以及不到打开显示图形的错误提示:
[root@database3 .vnc]# cat database3\:1.log
Xvnc TigerVNC 1.8.0 - built Apr 1 2020 04:46:00
Copyright (C) 1999-2017 TigerVNC Team and many others (see README.txt)
See http://www.tigervnc.org for information on TigerVNC.
Underlying X server release 12004000, The X.Org Foundation
Tue Sep 29 17:10:23 2020
vncext: VNC extension running!
vncext: Listening for VNC connections on all interface(s), port 5901
vncext: Listening for HTTP connections on all interface(s), port 5801
vncext: created VNC server for screen 0
Running without a11y support!
killing Xvnc process ID 3438
Error: cannot open Display: :1
其实,通过分析发现,上述日志中的killling进程日志和Error日志,其实是vncserver启动操作中调用/root/.vnc/xstartup脚本产生的。原始脚本如下:
[root@database3 .vnc]# cat xstartup
#!/bin/sh
unset SESSION_MANAGER
unset DBUS_SESSION_BUS_ADDRESS
/etc/X11/xinit/xinitrc
# Assume either Gnome or KDE will be started by default when installed
# We want to kill the session automatically in this case when user logs out. In case you modify
# /etc/X11/xinit/Xclients or ~/.Xclients yourself to achieve a different result, then you should
# be responsible to modify below code to avoid that your session will be automatically killed
if [ -e /usr/bin/gnome-session -o -e /usr/bin/startkde ]; then
vncserver -kill $DISPLAY
fi
通过分析脚本可知,脚本在执行到/etc/X11/xinit/xinitrc时,“Running without a11y support!”提示语输出,和系统输入法相关(不影响当前文章的问题)。
脚本执行vncserver -kill $DISPLAY时,对应日志中的“killing Xvnc process ID 3438”,也就是说,vnc server在启动时调用上述脚本时,又进入了上述脚本中的自动kill语句,这显然是不合适的。正常启动设置时,如果已经启动gnome session或者kde的,ls /usr/bin/gnome-session或者/usr/bin/startkde的值均不为空,该脚本不允许启动vnc server。我们可以直接将次判断注释掉。防止自动杀掉vnc进程。同时在脚本后端配置gnome-session。更改后的配置。
[root@database3 .vnc]# cat xstartup
#!/bin/sh
unset SESSION_MANAGER
unset DBUS_SESSION_BUS_ADDRESS
/etc/X11/xinit/xinitrc
# Assume either Gnome or KDE will be started by default when installed
# We want to kill the session automatically in this case when user logs out. In case you modify
# /etc/X11/xinit/Xclients or ~/.Xclients yourself to achieve a different result, then you should
# be responsible to modify below code to avoid that your session will be automatically killed
#if [ -e /usr/bin/gnome-session -o -e /usr/bin/startkde ]; then
#vncserver -kill $DISPLAY
#fi
gnome-session &
3、检查启动vncserver时调用的xstartup脚本的权限
/root/.vnc/xstartup脚本的执行权限必须是755.脚本名称前面的路径根据实际环境进行替换即可。
[root@database3 .vnc]# ll
total 24
-rw-r--r-- 1 root root 332 Aug 1 10:53 config
-rw-r--r-- 1 root root 941 Sep 29 17:10 database3:1.log
-rw-r--r-- 1 root root 6 Sep 29 17:10 database3:1.pid
-rw-r--r-- 1 root root 489 Aug 1 10:56 default.tigervnc
-rw------- 1 root root 8 Sep 29 10:58 passwd
-rwxr-xr-x 1 root root 559 Sep 29 14:50 xstartup
4、检查是否安装OS相关图形包组
服务器在安装字符界面操作系统时默认不会安装相关图形包组。
# yum groupinstall "GNOME Desktop Environment" (centos 5.x安装Gnome桌面环境)
# yum groupinstall "Desktop" "X Window System" (centos 6.x安装Gnome桌面环境)
# yum install -y gnome* (centos 7可用)
可以按照上述四项检查项进行排查,基本能够解决vnc连接不上、连接上黑屏、灰屏、出现黑叉鼠标的问题,如果还不行,继续排查其他原因。
注意停止vnc进程的命令,最好不要使用kill -9,而是用vncserver -kill :1等来代替。
/root/.vnc/xstartup脚本的执行权限必须是755.
专注搬砖,擅长搬砖砸自己的脚