前言

前段时间因为一个项目我需要远程访问 linux 服务器的桌面,虽然 Xmanager 提供的 Xstart 可以实现远程调用图形化,但是使用体验没有 VNC 好,所以针对如何配置 VNC 远程连接,心血来潮写了这样一篇博客。

需要说明的是,本文所述的全部操作都是基于系统(CentOS 7.6)已经完成了如下的配置:

  • 设置好主机名;
  • 关闭系统防火墙;
  • 禁用 selinux 模块;
  • 配置好本地 yum 源。

1. 图形化桌面配置 VNC 远程连接

1.1. 安装 VNC 服务

在已经安装了桌面图形化的操作系统中配置 VNC 远程连接还是比较简单的,只需要配置好本地 yum 源,然后安装上 tigervnctigervnc-server 安装包即可,下面以我的一台 Nginx 服务器进行操作展示。

首先,Nginx 服务器并没有预先安装 vnc 服务:

[root@nginx ~]# which vncserver
/usr/bin/which: no vncserver in (/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin)

接下来,我们来安装 vnc 服务:

[root@nginx ~]# yum search tigervnc --showduplicates   //可以看到本地 yum 源提供的 vnc 版本。
[root@nginx ~]# yum -y install tigervnc*

是不是很意外?安装 vnc 服务确实只需要这么简单的一步即可 ~~

1.2. 临时启用 VNC 远程连接

所谓临时启用 VNC 远程连接,顾名思义就是因为一些特殊要求,用户需要临时使用 VNC 远程连接到桌面进行一些操作,当操作完成后,至于 VNC 服务还要不要启动,对用户来说根本不在意。并且,如果没有配置 VNC 自启动服务,实际上当系统发生重启后,VNC 服务是不会随机自启动的。

临时启用 VNC 远程连接又可以简单分为以下两种情况:

  • 【单终端】只需要一个远程窗口供用户进行操作即可;
  • 【多终端】需要多个远程窗口供多个用户进行操作(比如多个用户都需要图形化界面来配置多个不同的应用服务)。

注意事项:以上两种情况,用户在远程连接桌面时都是以 root 超级管理员身份登录的,所以权限是最大的;因此,授权给用户连接的时候需要格外注意下。如果希望给用户分配一个普通的远程账号,请参考 1.3.2 章节的内容。

1.2.1. 单终端启用 VNC 远程连接

服务器端配置:

[root@nginx ~]# vncserver
[root@nginx ~]# vncserver -list

在这里插入图片描述

客户端配置远程连接:

首选需要下载 VNC® Viewer 客户端。

安装并打开 VNC Viewer 客户端,按照下图所示进行配置:
在这里插入图片描述

输入在服务器端启动 vnc 服务时所设置的密码:
在这里插入图片描述

此时,我们就可以远程访问服务器的图形化桌面啦:
在这里插入图片描述
在这里插入图片描述

1.2.2. 多终端启用 VNC 远程连接

其实多终端也很好理解,就是启用多个 vnc 服务,如下图所示:
在这里插入图片描述

此时,在客户端我们就可以使用3个窗口进行连接,如下图所示:
在这里插入图片描述

1.3. 开机自启动 VNC 服务实现远程连接

在配置自启动服务之前,我们可以先把前面启动的 vncserver 全部 kill 掉,方法如下:

[root@nginx ~]# vncserver -kill :1
[root@nginx ~]# vncserver -kill :2
[root@nginx ~]# vncserver -kill :3

在这里插入图片描述

1.3.1. 设置以 root 用户身份远程连接

开机自启动 VNC 服务,并设置以 root 用户身份远程连接后,用户可以随时远程使用服务器的图形化桌面,即使系统发生重启 vnc 也会自己把服务启动起来,并且用户每次都是以 root 超级管理员的身份连接到桌面。

首先我们要制作系统服务文件:

其实 /lib/systemd/system/vncserver@.service 文件中默认的注释信息里已经交代了配置服务的方法,下面就是按照注释里面的内容来进行操作:

[root@nginx ~]# cp /lib/systemd/system/vncserver@.service /etc/systemd/system/vncserver@:1.service
[root@nginx ~]# vim /etc/systemd/system/vncserver@:1.service   //服务文件配置信息如下。
[Unit]
Description=Remote desktop service (VNC)
After=syslog.target network.target

[Service]
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

通过对比源文件不难发现,其实就是将源文件中的 <USER> 替换成了 root,只不过 root 用户不在 /home 目录下,所以在配置以 root 用户身份远程连接时,需要将服务文件前面的 /home 删除掉:
在这里插入图片描述

重新加载服务配置文件,并将服务设置为开机自启动:

[root@nginx ~]# systemctl daemon-reload
[root@nginx ~]# systemctl enable vncserver@:1.service

通过下面的命令来设置 vncserver 的密码:

[root@nginx ~]# vncpasswd 
Password:   //输入密码。
Verify:   //确认密码。
Would you like to enter a view-only password (y/n)? n
A view-only password is not used

启动 vnc 服务并查看服务状态:

[root@nginx ~]# systemctl start vncserver@:1.service
[root@nginx ~]# systemctl status vncserver@:1.service

在这里插入图片描述

OK,此时我们就可以在客户端进行连接测试,甚至可以直接将服务器进行重启然后在进行连接测试。
在这里插入图片描述

1.3.2. 设置以普通用户身份远程连接

开机自启动 VNC 服务,并设置以普通用户身份远程连接后,用户可以随时远程使用服务器的图形化桌面,即使系统发生重启 vnc 也会自己把服务启动起来,但是用户每次都是以普通用户的身份连接到桌面。

首先,我们需要先创建一个普通用户:

[root@nginx ~]# useradd vncuser1   //新建一个名为 vncuser1 的普通用户。
[root@nginx ~]# passwd vncuser1 
Changing password for user vncuser1.
New password: 
Retype new password: 
passwd: all authentication tokens updated successfully.

同样,我们也需要先制作系统服务文件:

[root@nginx ~]# cp /lib/systemd/system/vncserver@.service /etc/systemd/system/vncserver@:2.service
[root@nginx ~]# vim /etc/systemd/system/vncserver@:2.service   //服务文件配置信息如下。
[Unit]
Description=Remote desktop service (VNC)
After=syslog.target network.target

[Service]
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 vncuser1 -c "/usr/bin/vncserver %i"
PIDFile=/home/vncuser1/.vnc/%H%i.pid
ExecStop=/bin/sh -c '/usr/bin/vncserver -kill %i > /dev/null 2>&1 || :'

[Install]
WantedBy=multi-user.target

通过对比源文件不难发现,只需要将源文件中的 <USER> 替换成 vncuser1 即可:
在这里插入图片描述

重新加载服务配置文件,并将服务设置为开机自启动:

[root@nginx ~]# systemctl daemon-reload
[root@nginx ~]# systemctl enable vncserver@:2.service

通过下面的命令来设置 vncserver 的密码(注意:此时需要在 vncuser1 用户下设置密码而非在 root 用户下哦):

[root@nginx ~]# su - vncuser1
[vncuser1@nginx ~]$ vncpasswd 
Password:
Verify:
Would you like to enter a view-only password (y/n)? n
A view-only password is not used

启动 vnc 服务并查看服务状态(启动服务还是在 root 用户下执行):

[root@nginx ~]# systemctl start vncserver@:2.service
[root@nginx ~]# systemctl status vncserver@:2.service

在这里插入图片描述

OK,此时我们就可以在客户端进行连接测试,甚至可以直接将服务器进行重启然后在进行连接测试。
在这里插入图片描述
在这里插入图片描述

其实到这里该配置的都已经配置好了,不过有个有意思的现象大家可以注意下。当我们既启动了 root 用户的 vnc 服务,又启动了 vncuser1 用户的 vnc 服务,此时在 root 用户下我们只能通过端口号来判断启动了几个 vnc 服务,而不能单纯的以 vncserver -list 来进行判断。
在这里插入图片描述

通过端口号我们就可以看出确实启动了两个 vnc 服务(默认从 5900 往后面顺延):

[root@nginx ~]# netstat -antp |grep 590
tcp        0      0 0.0.0.0:5901            0.0.0.0:*               LISTEN      10147/Xvnc   //root 用户的 vnc 服务。 
tcp        0      0 0.0.0.0:5902            0.0.0.0:*               LISTEN      10146/Xvnc   //vncuser1 用户的 vnc 服务。          
tcp6       0      0 :::5901                 :::*                    LISTEN      10147/Xvnc          
tcp6       0      0 :::5902                 :::*                    LISTEN      10146/Xvnc          

2. 最小化安装配置 VNC 远程连接

当系统默认使用最小化安装,后期想要启用图形化桌面并配置 vnc 远程连接,其实也很简单,主要需要下面两个步骤。

第一步:将最小化安装升级为图形化桌面。

配置图形化界面请参考 《CentOS 7 最小化系统安装图形化桌面》 这篇博客。

第二步:按照本文上面所述配置 vnc 服务即可。


3. 关于 VNC 的其它说明

3.1. 几条简单的 vnc 维护命令

  • 启动 vnc 服务:
# vncserver
  • 关闭 vnc 服务:
# vncserver -kill <X DISPLAY>
  • 查看当前 vnc 服务运行列表:
# vncserver -list
  • 修改 vnc 连接密码:
# vncpasswd
  • 修改桌面分辨率:
# vncserver -geometry 1920x1080   //其实就是新启动一个分辨率为 1080p 的 vnc 服务窗口。

3.2. 关于远程桌面模糊的处理方法

有的朋友可能发现了使用 VNC Viewer 去连接远程桌面的时候,桌面背景糊的跟马赛克一样 ~~ 虽说这种状态下并不影响我们使用 Terminal 以及其它类似于火狐浏览器这样的图形化工具,但是终究还是觉得丑哇 …… 下图就是这个丑样的展示,它和分辨率无关,主要是 VNC Viewer 获取图片质量的设置问题。
在这里插入图片描述

OK,打开我们的 VNC Viewer 软件,找到目标 Connection 编辑其属性,在 Options 选项中我们可以看到 Picture quality 默认设置为 Automatic,我们只需要将其改为 High 就可以完美解决这个问题啦。
在这里插入图片描述

设置好以后重新连接桌面,此时的体验就很 nice 啦。
在这里插入图片描述


总结

其实日常 linux 运维工作中,很少会去用到服务器的桌面,至少对我而言是这样的。因为 linux 本身就需要运维人员掌握大量的命令行工具去配置各种各样的系统服务和应用服务,如果一些简单的操作还需要依赖于桌面去点点点,那就失去了 linux 系统本身的优越性。当然喽,有些服务还是通过图形化配置会更加方便、简单一些,如配置 Oracle RAC 数据库啥的。

个人感觉这篇博客写的已经很详细了,以后再次面临访问远程桌面的需求,就可以直接拿来用了。以上,若有不当之处,欢迎朋友们及时指正!


Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐