Ubuntu 20.04 上安装和配置 VNC

Ubuntu 20.04 上安装和配置 VNC

[TOC]

Linux 云服务器默认是命令行交互的, 既没有安装桌面程序, 不支持通过远程桌面的方式访问图形化桌面环境. 为了方便从 Windows 端远程访问云服务器, 本文整理了在 Ubuntu 20.04 系统上安装和配置 VNC 服务器所需的步骤. 实现在 Windows 上通过远程桌面管理和控制 Ubuntu 云服务器, 支持图形界面操作.

Ubuntu 云端服务器

安装桌面环境

Ubuntu 支持 Gnome, KDE, Xfce, Unity 等多种桌面环境, 这里选择 Ubuntu 默认的 Gnome.

1
2
3
sudo apt update
sudo apt upgrade
sudo apt install gnome-session gdm3 gnome-panel gnome-settings-daemon metacity nautilus gnome-terminal ubuntu-desktop

安装与初次使用 VNC 服务器

有很多 VNC server 的实现软件, 如 TigerVNC 和 x11vnc 等. 本文选择 TigerVNC , 它是开源的高性能 VNC 服务器, 并被积积极维护.

1
sudo apt install tigervnc-standalone-server tigervnc-common

创建初始配置并设置密码:

1
vncserver

运行时不要使用 sudo .

系统将提示输入并确认密码(最少 6 位), 以及是否将其设置为仅查看密码. 如果您选择设置仅查看密码, 则用户将无法使用鼠标和键盘与 VNC 实例进行交互.

1
2
3
4
5
6
7
8
9
10
11
12
13
You will require a password to access your desktops.

Password:
Verify:
Would you like to enter a view-only password (y/n)? n
/usr/bin/xauth: file /home/typhoon/.Xauthority does not exist

New 'server2.typhoon.org:1 (typhoon)' desktop at :1 on machine server2.typhoon.org

Starting applications specified in /etc/X11/Xvnc-session
Log file is /home/typhoon/.vnc/server2.typhoon.org:1.log

Use xtigervncviewer -SecurityTypes VncAuth -passwd /home/typhoon/.vnc/passwd :1 to connect to the VNC server.

第一次 vncserver 运行命令时, 它将创建密码文件并将其存储在 ~/.vnc 目录中, 如果不存在, 将创建该目录.

一些基础命令:

1
2
3
4
5
vncserver #在当前已经存在的显示端口的基础上再增加一个端口
vncserver :i #创建序号为 i 的一个端口
vncserver -kill :i #删除序号为 i 的端口
vncserver -list #查看当前存在的所有端口
vncpasswd #设置密码

重要的是要记住, 当使用 VNC 服务器时, :i 是一个引用的显示端口 5900+i . 例如, vncserver :2 创建的端口为 5902.

注: 如果启动时出现 VNC 启动异常: is taken because of /tmp/.X11-unix/X1.

此时只需要将提示的文件删除即可. 再次输入 vncserver.

配置 VNC 服务器

VNC 启动脚本 ~/.vnc/xstartup, 无论何时启动或重启 TigerVNC 服务器, 都将自动执行上述命令.

1
2
3
4
5
#!/bin/sh
export XKL_XMODMAP_DISABLE=1
export XDG_CURRENT_DESKTOP="GNOME-Flashback:GNOME"
export XDG_MENU_PREFIX="gnome-flashback-"
gnome-session --session=gnome-flashback-metacity --disable-acceleration-check &

添加权限:

1
sudo chmod u+x  ~/.vnc/xstartup 

VNC 服务器的配置文件 ~/.vnc/config:

1
2
3
$geometry = "1900x1200";
$depth = "32";
$fontPath

更多配置选项内容可参考: vnc.conf.

添加 VNC 服务

如果想要在每次服务器开机都会自动运行 VNC server, 并且方便管理它, 可以考虑将其添加为一个服务.

方法1 创建 Systemd 单元文件

1
sudo vim /etc/systemd/system/vncserver@.service

内容如下:

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

[Service]
Type=simple
User=username
PAMName=login
PIDFile=/home/%u/.vnc/%H%i.pid
ExecStartPre=/bin/sh -c '/usr/bin/vncserver -kill :%i > /dev/null 2>&1 || :'
ExecStart=/usr/bin/vncserver :%i -geometry 1440x900 -alwaysshared -fg
ExecStop=/usr/bin/vncserver -kill :%i

[Install]
WantedBy=multi-user.target

这里解释一下条目的意义:

  • [Unit]: 启动顺序与依赖关系区块

  • [Service]: 启动行为区块.

  • [Install]: 定义如何安装这个配置文件.

  • Description: 该服务的描述.

  • After: 需要在哪些服务之后启动, 这里是在系统日志以及网络服务启动后启动.

  • Type: simple 足够了.

  • User: 远端服务器登陆用户名.

  • PAMName: 可拆卸式认证模块(Pluggable Authentication Modules) for Linux 用来管理授权信息.

  • PIDFile: 服务进程 PID.

  • ExecStartPre: 启动前的准备工作. 注意此处的输入参数无法识别 >, | 等字符, 因此需要通过 /bin/sh -c ' ' 的形式将整个命令/脚本传进去.

  • ExecStart: 启动时的命令/脚本.

  • ExecStop: 停止服务后需要执行的命令/脚本.

  • WantedBy: 该服务是哪些服务可能依赖的, 一般都是 multi-user.target.

更多解读以及其他字段可以参考手册, 以及汉语翻译.

注意命令中的 %i 即是启动端口对象的序号(后面作为参数传进来).

通知 systemd 我们创建了一个新的单元文件:

1
sudo systemctl daemon-reload

告诉系统每次开机启动 VNC 服务:

1
sudo systemctl enable vncserver@1.service

注意 @1 中的 1 即是端口对象的序号. 相当于 vncserver :1.

执行以下命令启动 VNC 服务:

1
sudo systemctl start vncserver@1.service

验证服务是否已成功启动:

1
sudo systemctl status vncserver@1.service

输入的前一部分如下:

1
2
3
4
5
vncserver@1.service - Remote desktop service (VNC)
Loaded: loaded (/etc/systemd/system/vncserver@.service; indirect; vendor preset: enabled)
Active: active (running) since Thu 2018-08-16 19:05:54 UTC; 4s ago
Process: 9893 ExecStartPre=/bin/sh -c /usr/bin/vncserver -kill :1 > /dev/null 2>&1 || : (code=exited, status=0/SUCCESS)
Main PID: 9900 (vncserver)

可以看到 VNC 服务的状态是 Active: active (running) 运行正常的.

Windows 本地

VNC viewer

Windows 端有很多可以接收 VNC server 的软件, 这里使用 VNC viewer, 下载安装后不需要注册也可以使用: 只需要在对话框中输入 IP:port, 例如 1.19.2.33:5901 后输入约定的密码即可通过图形界面访问云端服务器.

相关联的问题

Ubuntu 18.04 残余的影响

我在跑 ros2 的一些图形界面的工具时报错, 例如:

1
ros2 run rviz2 rviz2

报错内容:

1
Qt: XKEYBOARD extension not present on the X server

导致这个错误的原因有很多, 但从原理上分析来看, 应该是 X -> X server -> Gnome -> VNC server -> VNC viewer 这个链接中的某个环节出错了导致了我在 VNC viewer 上运行 rviz2 识别.

看到此回答, 我发现我的问题与他一样.

我是通过系统升级从 Ubuntu 18.04 升级到 20.04 的, 之前的 VNC – tightVNC 没有起作用, 我默认 tightVNC 被删除了, 其实并没有.

1
2
3
4
prompt> whereis vncserver
prompt> /usr/bin/vncserver
prompt> ll /usr/bin/vncserver
prompt> /usr/bin/vncserver -> /usr/bin/tightvnc

发现 vncserver 默认还是 tightvnc. 卸载 tightVNC 后, 安装 tigerVNC, 问题解决了.

参考链接: https://xie.infoq.cn/article/cf473dc0dea917b0b2a546ecd

https://help.aliyun.com/document_detail/332898.html

https://blog.csdn.net/weixin_39278265/article/details/120546447

Ubuntu 20.04 上安装和配置 VNC

https://www.chuxin911.com/vnc_setting_20220516/

作者

cx

发布于

2022-05-16

更新于

2022-07-16

许可协议