VNC (Virtual Network Computing- 虚拟网络计算) 的工作原理是捕获显示器的帧缓冲区并使其在网络上可用。
这篇文章向我们展示了如何安装 TigerVNC 并对其进行配置,以让远程用户能够访问他们的图形桌面环境,就像他们在系统前一样。
对于本文中的示例,我们将使用 CentOS 7 服务器作为 VNC 服务器,并使用带有 VNC 客户端的本地计算机连接到它。
它假定远程系统正在运行 OpenSSH SSH 服务器和图形桌面环境,例如 GNOME 或者 KDE。
在继续之前,我们可以参考帖子“CentOS/RHEL 7:如何安装 GUI”来安装图形环境。
安装 VNC 服务器
- 确保我们有权访问本地或者远程 yum 存储库以安装所需的软件包。
# yum repolist
- 如果尚未安装 GUI 桌面包,请安装 GUI 桌面包,以便通过 GUI 访问 VNC 服务器。
# yum groupinstall "Server with GUI"
- 在 VNC 服务器上,安装 TigerVNC 服务器包:
# yum install tigervnc-server
配置 VNC 服务器
将配置文件 /lib/systemd/system/vncserver@.service 复制到目录 /etc/systemd/system/ 后,命名为“vncserver_[username]@:[port].service”。
例如:
# cp /lib/systemd/system/vncserver@.service /etc/systemd/system/vncserver_root@:2.service # cp /lib/systemd/system/vncserver@.service /etc/systemd/system/vncserver_oracle@:3.service
注意:为每个用户创建不同的配置文件是很常见的。
作为最佳实践,我们可以将用户名添加到配置文件中,因为这将有助于确定哪个文件属于每个用户。
这不是必需的。
修改已经为每个用户创建的配置文件(本例中我们将使用root和oracle):
3-1 将<USER> 占位符替换为出现在文件“vncserver_root@:2.service”的[Service] 中的“root”用户,
将文件“vncserver_oracle@:3.service”的“oracle”替换为vi。
# vi /etc/systemd/system/vncserver_root@:2.service # vi /etc/systemd/system/vncserver_oracle@:3.service
我们也可以使用“sed”来自动进行用户名替换:
# sed -i 's/<USER>/root/g' /etc/systemd/system/vncserver_root@:2.service # sed -i 's/<USER>/oracle/g' /etc/systemd/system/vncserver_oracle@:3.service
3-2 也为每个用户将几何图形添加到配置文件中。
在本例中,我们将在配置文件中添加“-geometry 800×800”。
这将位于以“ExecStart”开头的行的末尾。
# vi /etc/systemd/system/vncserver_root@:2.service # vi /etc/systemd/system/vncserver_oracle@:3.service
- 在步骤A和B中进行修改后,我们在配置文件下修改的行应该类似于以下内容:
对于文件“vncserver_root@:2.service”
[Unit] Description=Remote desktop service (VNC) After=syslog.target network.target [Service] Type=forking User=root # Clean any existing files in /tmp/.X11-unix environment ExecStartPre=-/usr/bin/vncserver -kill %i ExecStart=/sbin/runuser -l root -c "/usr/bin/vncserver %i -geometry 800x800" PIDFile=/home/root/.vnc/%H%i.pid ExecStop=-/usr/bin/vncserver -kill %i [Install] WantedBy=multi-user.target
对于文件“vncserver_oracle@:3.service”
[Unit] Description=Remote desktop service (VNC) After=syslog.target network.target [Service] Type=forking User=oracle # Clean any existing files in /tmp/.X11-unix environment ExecStartPre=-/usr/bin/vncserver -kill %i ExecStart=/sbin/runuser -l oracle -c "/usr/bin/vncserver %i -geometry 800x800" PIDFile=/home/oracle/.vnc/%H%i.pid ExecStop=-/usr/bin/vncserver -kill %i [Install] WantedBy=multi-user.target
当我们使用 systemctl start 启动服务器时,会调用 ExecStart 条目中指定的命令;它使用 runuser 在用户帐户下运行 TigerVNC。
-l 参数提供用户名,-c 指定 runuser 将执行的命令及其参数。
PIDFile 条目指定正在运行的进程将其中跟踪其进程 ID 的目录。
注意:从 RHEL7.4 开始,在调用时传递给 vncserver 的支持服务器选项已移动到 ~/.vnc/ 目录中名为“config”的新文件中。
因此无需在 ExecStart 行中添加这些选项。
使用 VNC 查看器访问 VNC 服务器
我们可以在客户端计算机上安装任何 VNC 查看器软件以访问 VNC 服务器。
我在我的 MAC 上使用 realVNC 软件来访问 VNC 服务器。
我们可以根据我们使用的操作系统使用以下任何 VNC 查看器软件。
- TigerVNC : http://tigervnc.org
- TightVNC : https://www.tightvnc.com/download.php
- RealVNC : https://www.realvnc.com/en/connect/download/viewer
使用 VNC 显示:1
连接 VNV 服务器。
配置防火墙
- 显示器对应端口的流量应该被防火墙允许。
显示器 0 使用端口 5900,显示器 1 使用端口 5901,显示器 2 使用端口 5902,依此类推。
如果我们使用 FirewallD,预定义的 vnc-server 服务会打开端口 5900-5903:
# firewall-cmd --zone=public --permanent --add-service=vnc-server
如果你需要另外的端口或者如果你不需要打开整个范围,你可以使用 -add-port 打开你需要的:
# firewall-cmd --zone=public --permanent --add-port=5901/tcp
- 重新加载防火墙,使防火墙规则生效。
# firewall-cmd --reload
- 重新加载配置:
# systemctl daemon-reload
启动服务并设置密码
- 我们现在将为选定端口上的每个用户启用 vncserver 服务,这也将启用系统启动时的自动启动,使用以下命令:
# systemctl enable vncserver_root@:2.service Created symlink from /etc/systemd/system/multi-user.target.wants/vncserver_root@:2.service to /etc/systemd/system/vncserver_root@:2.service.
# systemctl enable vncserver_oracle@:3.service Created symlink from /etc/systemd/system/multi-user.target.wants/vncserver_oracle@:3.service to /etc/systemd/system/vncserver_oracle@:3.service.
- 重新加载 systemd 的配置以使其了解新的单元文件:
# systemctl daemon-reload
- 为每个用户配置一个密码,以便与 vncserver 一起使用。
# vncpasswd root Password: Verify: Would you like to enter a view-only password (y/n)? n
# vncpasswd oracle Password: Verify: Would you like to enter a view-only password (y/n)? n
- 以用户身份登录时,我们需要在命令行中执行“vncserver”。
这将自动要求我们为用户创建新密码。
# vncserver You will require a password to access your desktops. Password: Verify: Would you like to enter a view-only password (y/n)? n xauth: file /root/.Xauthority does not exist New 'onitroad:1 (root)' desktop is onitroad:1 Creating default startup script /root/.vnc/xstartup Creating default config /root/.vnc/config Starting applications specified in /root/.vnc/xstartup Log file is /root/.vnc/onitroad:1.log