Skip to content

Ubuntu 宿主机 TigerVNC 安装与配置手册

适用范围

  • 操作系统:Ubuntu 22.04 LTS
  • 桌面环境:GNOME(已安装) + XFCE4(作为 VNC 桌面)
  • VNC 软件:TigerVNC Standalone Server
  • 运行用户:普通用户(示例为 xxx

一、安装前检查

1.1 确认系统信息

bash
uname -a
cat /etc/os-release | head -5
whoami
systemctl get-default

1.2 确认是否已有桌面环境

bash
which gnome-session xfce4-session startx

1.3 检查现有 VNC 服务

bash
dpkg -l | grep -iE "vnc|tiger|tight|x11vnc"
ps aux | grep -E "Xvnc|Xtigervnc|Xorg" | grep -v grep
ss -tlnp | grep -E "5900|5901|5902"

注意:libvirt/QEMU 虚拟机控制台默认占用 5900 端口,宿主机的 VNC 服务应选择其他端口(如 59015902)。

1.4 检查防火墙

bash
sudo ufw status verbose

二、安装 TigerVNC 和 XFCE4

2.1 更新软件源

bash
sudo apt update

2.2 安装 TigerVNC 和 XFCE4

bash
sudo DEBIAN_FRONTEND=noninteractive apt install -y \
  tigervnc-standalone-server \
  tigervnc-common \
  xfce4 \
  xfce4-goodies \
  dbus-x11

三、配置 VNC

3.1 创建 VNC 启动脚本

bash
mkdir -p ~/.vnc
cat > ~/.vnc/xstartup << 'EOF'
#!/bin/bash
unset SESSION_MANAGER
unset DBUS_SESSION_BUS_ADDRESS

# 启动新的 dbus 会话,避免与现有 GNOME 会话冲突
if [ -z "$DBUS_SESSION_BUS_ADDRESS" ]; then
    eval $(dbus-launch --sh-syntax --exit-with-session)
fi

# 启动 XFCE 桌面
exec startxfce4
EOF
chmod +x ~/.vnc/xstartup

3.2 设置 VNC 密码

bash
vncpasswd

按提示输入两次密码。是否设置 view-only 密码按需选择。

密码文件保存在:

text
~/.vnc/passwd

四、配置 systemd 自启动服务

4.1 创建启动包装脚本

因为 TigerVNC 的 vncserver 命令会 fork 后退出,直接使用 Type=forking 会遇到 PID 文件权限问题。这里使用一个包装脚本让 systemd 能正确管理进程。

bash
sudo tee /usr/local/bin/vncserver-wrapper.sh << 'EOF'
#!/bin/bash
DISPLAY_NUM="${1:-:1}"
NUM=$(echo "$DISPLAY_NUM" | sed 's/://')
PORT=$((5900 + NUM))
export USER="xxx"
export HOME="/home/xxx"
export DISPLAY=":$NUM"
/usr/bin/vncserver "$DISPLAY_NUM" -geometry 1920x1080 -depth 24 -localhost no
PIDFILE="$HOME/.vnc/$(hostname):${PORT}.pid"
if [ -f "$PIDFILE" ]; then
    PID=$(cat "$PIDFILE")
    echo "Monitoring VNC PID $PID on $DISPLAY_NUM (port $PORT)"
    while kill -0 "$PID" 2>/dev/null; do
        sleep 5
    done
fi
EOF
sudo chmod +x /usr/local/bin/vncserver-wrapper.sh

根据实际用户名修改 USERHOME

4.2 创建 systemd 服务文件

bash
sudo tee /etc/systemd/system/vncserver@.service << 'EOF'
[Unit]
Description=Remote desktop service (VNC) for display :%i
After=syslog.target network.target

[Service]
Type=simple
User=xxx
PAMName=login
WorkingDirectory=/home/xxx
ExecStartPre=/bin/sh -c "/usr/bin/vncserver -kill :%i > /dev/null 2>&1 || :"
ExecStart=/usr/local/bin/vncserver-wrapper.sh :%i
ExecStop=/usr/bin/vncserver -kill :%i
Restart=on-failure
RestartSec=5

[Install]
WantedBy=multi-user.target
EOF

根据实际用户名修改 UserWorkingDirectory

4.3 启动并启用服务

以 display :2(端口 5902)为例:

bash
sudo systemctl daemon-reload
sudo systemctl enable --now vncserver@2.service

五、防火墙配置

5.1 添加 ufw 规则

bash
sudo ufw allow 5902/tcp comment 'TigerVNC'
sudo ufw allow 22/tcp comment 'SSH'

5.2 按需启用 ufw

如果当前 ufw 未启用,可以按需启用:

bash
sudo ufw enable

注意:启用 ufw 前请确认已放行 SSH(22)端口,避免断开远程连接。


六、验证连接

6.1 检查服务状态

bash
sudo systemctl status vncserver@2.service

6.2 检查监听端口

bash
ss -tlnp | grep 5902

预期输出:

text
LISTEN 0  5  0.0.0.0:5902  0.0.0.0:*  users:(("Xtigervnc",pid=...,fd=...))

6.3 使用 VNC Viewer 连接

text
<宿主机IP>:5902

密码为前面设置的 VNC 密码。


七、常见问题排查

7.1 A X11 server is already running for display :1

原因:本地已有 Xorg 会话占用 :1

解决:换用其他 display 号,例如 :2(端口 5902)。

bash
sudo systemctl enable --now vncserver@2.service

7.2 systemd 报错 PID file is not owned by root

原因:TigerVNC 生成的 PID 文件属于运行用户,systemd Type=forking 模式下权限校验失败。

解决:改用 Type=simple + 包装脚本(见 4.1)。

7.3 XFCE 启动后立即退出

原因:与现有 GNOME 会话的 D-Bus 冲突。

解决:在 ~/.vnc/xstartup 中启动独立的 D-Bus 会话:

bash
eval $(dbus-launch --sh-syntax --exit-with-session)

7.4 端口 5900 被占用

原因:libvirt/QEMU 虚拟机控制台默认监听 5900。

解决:宿主机的 VNC 服务使用 5901、5902 等端口。

7.5 连接后黑屏

原因:桌面环境未正确启动,或 xstartup 脚本有问题。

排查:

bash
tail -50 ~/.vnc/$(hostname):5902.log

八、管理命令

bash
# 查看状态
sudo systemctl status vncserver@2.service

# 启动
sudo systemctl start vncserver@2.service

# 停止
sudo systemctl stop vncserver@2.service

# 重启
sudo systemctl restart vncserver@2.service

# 开机自启
sudo systemctl enable vncserver@2.service

# 禁止开机自启
sudo systemctl disable vncserver@2.service

# 手动启动(调试用)
vncserver :2 -geometry 1920x1080 -depth 24 -localhost no

# 手动停止
vncserver -kill :2

九、新增其他 VNC 会话

如需同时开启多个 VNC 桌面,例如 :3(端口 5903):

bash
sudo systemctl enable --now vncserver@3.service
sudo ufw allow 5903/tcp

连接地址:

text
<宿主机IP>:5903

十、安全建议

  1. 不要使用弱密码:生产环境应使用强密码或禁用密码认证改用 SSH 隧道。
  2. 限制访问来源
bash
sudo ufw allow from 192.168.122.0/24 to any port 5902
  1. 使用 SSH 隧道:更安全的访问方式是通过 SSH 转发 VNC 端口。
bash
ssh -L 5902:localhost:5902 user@<宿主机IP>

然后本地 VNC Viewer 连接 localhost:5902

  1. 禁用 VNC 密码文件权限过宽
bash
chmod 600 ~/.vnc/passwd

参考命令汇总

bash
# 安装
sudo apt update
sudo DEBIAN_FRONTEND=noninteractive apt install -y tigervnc-standalone-server tigervnc-common xfce4 xfce4-goodies dbus-x11

# 配置
mkdir -p ~/.vnc
vncpasswd
sudo systemctl daemon-reload
sudo systemctl enable --now vncserver@2.service
sudo ufw allow 5902/tcp

# 验证
sudo systemctl status vncserver@2.service
ss -tlnp | grep 5902

记录时间:2026-07-16
涉及版本:Ubuntu 22.04.5 LTS, TigerVNC 1.12.0, XFCE 4.16