TigerVNC 部署


Catalogue
  1. 1. 安装 TigerVNC 服务端
    1. 1.1. Debain 系
    2. 1.2. RH 系
  2. 2. 启动 VNC 服务 (虚拟桌面)
    1. 2.1. 准备文件
    2. 2.2. 创建服务
    3. 2.3. 启动服务
  3. 3. 启动 VNC 服务 (实机画面)
    1. 3.1. 准备文件
    2. 3.2. 创建服务
    3. 3.3. 启动服务
    4. 3.4. (拓展)手动启动的方法
    5. 3.5. (拓展)脚本启动的方法
  4. 4. 配置防火墙
  5. 5. 参考资料

TigerVNC 是一个用于启动 VNC (Virtual Network Computing) 桌面服务的工具。它基于 Xvnc 在 VNC 桌面上启动了一个窗口管理器,并提供了 vncserverx0vncserver 两个 VNC 服务端。vncserver 允许用户在计算机上并行运行多个虚拟显示会话,实现了多客户端访问该计算机的不同虚拟桌面;x0vncserver 则不创建虚拟显示,而是共享一个现有的 X 服务器,通常被用于实机画面的控制服务。


安装 TigerVNC 服务端

Debain 系

根据需要安装下列包之一:

1
2
apt-get install tigervnc-standalone-server	# 完整安装
apt-get install tigervnc-scraping-server # 仅 x0vncserver

RH 系

1
yum install tigervnc-server					# 确保以 root 身份登录

提醒: 对于 RH 系 的系统,如果没有连接到 RHN 或卫星服务器,请参考以下文章:


启动 VNC 服务 (虚拟桌面)

准备文件

为需要用于启用 VNC 虚拟桌面服务的用户配置 VNC 密码,在必要时为每个 VNC 用户重复操作:

1
2
su - vncuser1			# 切换至对应用户
vncpasswd # 为用户设置VNC密码

提醒: 使用 vncpasswd 为用户创建密码后,会在对应用户的 ~/.vnc/ 目录下生成名为 passwd VNC 密码文件,也可使用如下命令在任意位置创建任意名称的 VNC 密码文件:

1
vncpasswd .vncpasswd	# 在当前目录创建名为 .vncpasswd 的 VNC 密码文件

如需为用户配置分辨率,可选择以下两种方法之一:

  1. 统一配置。使用您喜欢的编辑器来编辑 /etc/sysconfig/vncservers 追加以下行:
1
2
3
VNCSERVERS="1:vncuser1 2:vncuser2"		# 将“vncuser1和“vncuser2”替换为正确的用户名
VNCSERVERARGS[1]="-geometry 1024x768" # 根据需要添加更多用户
VNCSERVERARGS[2]="-geometry 1024x768" # 根据需要更改分辨率值
  1. 单独配置。单独为某个用户配置分辨率,编辑 ~/.vnc/config 追加以下行:
1
geometry = <WIDTH> x <HEIGHT>

提醒: VNC 虚拟桌面默认分辨率为 1024x768。

创建服务

安装时将自动生成 /usr/lib/systemd/system/vncserver@.service 示例文件,若未找到,可按以下内容手动创建 vncserver@.service 文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[Unit]
Description=Remote desktop service (VNC)
After=syslog.target network.target

[Service]
Type=simple

# Clean any existing files in /tmp/.X11-unix environment
ExecStartPre=/bin/sh -c '/usr/bin/vncserver -kill %i > /dev/null 2>&1 || :'
ExecStart=/usr/bin/vncserver_wrapper <USER> %i
ExecStop=/bin/sh -c '/usr/bin/vncserver -kill %i > /dev/null 2>&1 || :'

[Install]
WantedBy=multi-user.target

将其复制到 /etc/systemd/system/ 目录,单用户保持其原名称即可:

1
2
cp /usr/lib/systemd/system/vncserver@.service \
/etc/systemd/system/vncserver@.service

多用户则需要分别命名:

1
2
3
4
5
6
7
# vncuser1
cp /usr/lib/systemd/system/vncserver@.service \
/etc/systemd/system/vncserver-USER_1@.service
# vncuser2
cp /usr/lib/systemd/system/vncserver@.service \
/etc/systemd/system/vncserver-USER_2@.service
# vncuser(n) ...

编辑 /etc/systemd/system/vncserver@.service 文件,将如下行中的 <USER> 替换为实际用户名,其他行不动:

1
ExecStart=/usr/bin/vncserver_wrapper <USER> %i

为确保变更生效,需执行以下命令:

1
systemctl daemon-reload			# 重载服务

启动服务

启动时需要指定一个非“0”的 <display_number> (“0”为实机画面预留显示号),并根据系统支持执行以下两组命令之一:

1
2
3
4
5
6
7
# service 命令
service vncserver@:<display_number> start # 启动服务
chkconfig vncserver@:<display_number> on # 确保在重新启动时启动服务

# systemctl 命令
systemctl start vncserver@:<display_number> # 启动服务
systemctl enable vncserver@:<display_number> # 确保在重新启动时启动服务

启动 VNC 服务 (实机画面)

准备文件

使用 root 用户创建 VNC 密码文件,并将其保存在共享目录 /usr/share/ 下以避免权限问题:

1
2
mkdir /usr/share/.vnc
vncpasswd /usr/share/.vnc/passwd

创建服务

/etc/systemd/system/ 目录下手动创建 x0vncserver.service 文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[Unit]
Description=Remote desktop service (X0VNC)
After=syslog.target network.target

[Service]
Type=simple

ExecStart=/usr/bin/x0vncserver \
-SecurityTypes=VncAuth \
-AlwaysShared \
-PasswordFile=/usr/share/.vnc/passwd \
-rfbport=5900 \
-display=:0.0
Restart=always
RestartSec=5

[Install]
WantedBy=multi-user.target

为确保变更生效,需执行以下命令:

1
systemctl daemon-reload			# 重载服务

启动服务

根据系统支持执行以下两组命令之一:

1
2
3
4
5
6
7
# service 命令
service x0vncserver start # 启动服务
chkconfig x0vncserver on # 确保在重新启动时启动服务

# systemctl 命令
systemctl start x0vncserver # 启动服务
systemctl enable x0vncserver # 确保在重新启动时启动服务

(拓展)手动启动的方法

手动使用 TigerVNC 的 x0vncserver命令共享实机画面:

1
2
x0vncserver -PasswordFile=~/.vnc/passwd -AlwaysShared=1	# 使用用户的密码文件,或:
x0vncserver -PasswordFile=.vncpasswd -AlwaysShared=1 # 使用手动生成的密码文件

(拓展)脚本启动的方法

使用 git 工具克隆脚本仓库:

1
git clone https://github.com/sebestyenistvan/runvncserver.git

或者通过如下链接下载脚本,并手动上传至服务端主机:

1
2
cd ./runvncserver/		# 进入仓库目录
chmod +x ./startvnc # 为脚本添加执行权限

脚本用法 (默认使用 ~/.vnc/passwd 文件,启动前确保文件存在):

1
2
3
4
5
6
7
8
9
10
./startvnc
# Usage: ./startvnc start|stop|restart|status
./startvnc start
# Starting VNC Server on display :0 [ok]
./startvnc stop
# Stopping VNC Server: [ok] (pid: xxxx)
./startvnc restart
# Restarting VNC Server on display :0 [ok]
./startvnc status
# Status of the VNC server: [running] (pid: xxxx)

设置脚本开机自启的方法(将下方的地址替换为正确的脚本地址):

1
echo "/home/user/runvncserver/startvnc start >/dev/null 2>&1" >> ~/.xsessionrc

配置防火墙

开放相应端口:

1
2
3
4
5
6
# x0vncserver
iptables -I INPUT -m state --state NEW -p tcp --destination-port 5900 -j ACCEPT
# vncuser1
iptables -I INPUT -m state --state NEW -p tcp --destination-port 5901 -j ACCEPT
# vncuser2
iptables -I INPUT -m state --state NEW -p tcp --destination-port 5902 -j ACCEPT

提醒: 实机画面需要打开5900端口,此外每个虚拟桌面用户都需要从 5901 开始的已打开的额外防火墙端口。因为在上面添加了两个用户,所以我们需要再打开两个端口。

保存规则(根据情况选择以下之一):

1
2
service iptables save						# 旧版本
iptables-save > /etc/sysconfig/iptables # 新版本

提醒: 对于 RHEL7 及以后系统出现缺少 iptables 命令或者重启后 iptables 规则失效的情况,请参考以下文章:


参考资料