问题现象

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.

专注搬砖,擅长搬砖砸自己的脚