为云服务器添加图形化桌面并通过VNC连接

2021-08-06

< view all posts

Linux的服务器版很多是不带GUI的,不过对于我们个人自用的服务器,很多时候有一个GUI桌面会方便很多。这里记录一下如何为云服务器(例如我用的腾讯云)配置GUI并通过VNC软件远程连接。

首先安装一个GUI桌面,桌面种类很多,选择一种即可。下面给了三个例子:

安装GUI桌面

* 安装xfce

xfce是一个轻量级的桌面,它的资源占用少,配置也简单,用来安装在云主机上是很合适的:

sudo apt update
sudo apt install xfce4 xfce4-goodies

上面的xfce4-goodies包含了一些常用的额外的桌面程序,因此也推荐安装。

* 或安装GNOME(on debian)

GNOME是一个很主流的桌面,也是ubuntu默认的桌面,参考此处,执行:

apt install task-gnome-desktop

* 或安装GNOME(on ubuntu)

首先安装tasksel,这是一个用于帮助快速安装和部署软件包的工具:

sudo apt update
sudo apt install tasksel

之后通过tasksel安装桌面GUI,也是以ubuntu默认的GNOME为例:

sudo tasksel install ubuntu-desktop

在安装完成之后,就可以从网页登录云主机,选择VNC方式。之后执行 startx,就能够打开GUI桌面环境。

Windows安装VNC

因为网页操作毕竟不方面,这时候就可以安装VNC专用的软件来连接了。

在自己的电脑上,安装windows版本的TightVNC

注意如果Windows机器是高分屏,启用了dpi缩放的话,最好右键属性里把TightVNC的dpi缩放关闭。这是因为dpi缩放会影响到TightVNC显示的画面,例如服务器输出的分辨率设置成和Windows机器的分辨率一致,那么图像和屏幕应该是刚好匹配的,但是打开dpi缩放的话图像会被拉大,影响显示效果(具体路径是右键属性--兼容性--更改高dpi设置--勾上高dpi缩放替代并选择“应用程序”选项)。

为了使画面尽量流畅,建议连接前在Options里面选择Tight编码模式(默认的),并勾选"256 colors"降低传输的色彩深度;勾选"Set custom compression level",并拉至"best",这个选项设置的是传输的压缩级别,拉到最大。这样设置之后可以显著提升流畅度。

指针选项里勾选"Don't show remote cursor",并把"Local Cursor Shape"调成"Arrow",这样可以只显示本地鼠标指针,效果更好。

服务器安装VNC Server

在云服务器上,安装TightVNC的Server端:

apt install tightvncserver

安装完成后需要先启动一次,因为vncserver的配置文件必须先运行一次才会生成。执行:

vncserver

首次启动时需要设置密码,注意密码必须是6-8位的长度。如果之后需要修改密码,可以使用 vncpasswd 命令。

这个时候因为配置文件还没有配好,直接连接上去是无效的。先停止vncserver:

vncserver -kill :1

其中的:1是编号。默认是1,它在启动的时候是可以指定的,如 vncserver :2

现在开始进行必要的配置:

* 配置xfce4

如果上面选择安装的桌面是xfce4,那么配置很简单,打开 ~/.vnc/xstartup 文件,将下面这一行添加到最后:

startxfce4 &

startxfce4 本质上是一个脚本,里面整合了启动xfce所需的步骤。而 xstartup 这个文件中的内容会在vncserver启动完成后执行,因此添加这一行即可。

* 或配置GNOME

参考此处,首先用以下命令安装软件:

apt install gnome-panel gnome-settings-daemon metacity nautilus gnome-terminal

之后,打开 ~/.vnc/xstartup 文件,将以下内容加入到文件的末尾:

gnome-panel &
gnome-settings-daemon &
metacity &
nautilus &

启动VNC Server

执行如下命令:

vncserver :1 -geometry 2560x1440 -depth 16

即可启动,分辨率和色彩深度建议根据实际情况调整。测试发现色彩深度指定为8bit时部分程序的显示可能出现问题,因此建议不要低于16bit。

在vncserver启动时,会在屏幕上显示日志文件的位置。查看日志文件,就能够看到vncserver所用的端口。默认应该是5901。

在云服务器的安全组策略中,放通对应端口,如5901端口的入站和出站。

此时打开windows机器上的TightVNC Viewer软件,在Remote Host栏输入远程服务器的ip和端口号(注意是端口号是两个冒号分割),之后点击Connect,就可以连接上了。

通过SSH连接

参考此处,因为tightvnc是一个老软件,它除了密码外的所有流量传输都是非加密的。为了安全地使用它,需要为其建立SSH隧道。

首先Server端,在启动时加入一个参数 -localhost ,使得vnc只接受来自本机的连接。因此命令变为:

vncserver -geometry 2560x1440 -depth 16 -localhost

之后,在Windows机器上创建SSH隧道:

ssh -L [local_port]:localhost:[remote_port] -C -N -l [username] [server_ip]

其中 -L 参数表示转发 [local_port] 的流量至 [remote_port]-C 参数表示压缩传输, -N 参数表示此连接不用于执行任何命令,只转发流量。下面是一个例子:

ssh -L 59000:localhost:5901 -C -N -l ubuntu xxx.xxx.xxx.xxx

之后在客户端中建立连接时,把需要连接的地址改为 localhost::[local_port] 即可。如上面的例子中即改为 localhost::59000

创建系统服务

完成上面的步骤之后我们就可以方便地使用VNC连接云服务器的图形化桌面了。后续我们还可以将其设置为一个系统服务,在开机时自动启动。

参考此处,首先新建一个 /etc/systemd/system/vncserver.service 文件,写入如下内容:

[Unit]
Description=Start TightVNC server at startup
After=syslog.target network.target

[Service]
Type=forking
User=ubuntu
Group=ubuntu
WorkingDirectory=/home/ubuntu

PIDFile=/home/ubuntu/.vnc/%H:1.pid
ExecStartPre=-/usr/bin/vncserver -kill :1 > /dev/null 2>&1
ExecStart=/usr/bin/vncserver -geometry 2560x1440 -depth 16 -localhost :1
ExecStop=/usr/bin/vncserver -kill :1

[Install]
WantedBy=multi-user.target

注意加粗的用户名根据实际情况修改。

之后,刷新服务列表:

sudo systemctl daemon-reload

激活并启动服务:

sudo systemctl enable vncserver.service
sudo systemctl start vncserver

补充功能

剪贴板共享

参考此处,启动Windows机器和VNC之间的复制粘贴。首先安装:

sudo apt install autocutsel

之后将如下内容加入 ~/.vnc/xstartup 文件:

autocutsel -fork

重启vncserver即可。

解决xfce4窗口最大化/最小化/关闭等按钮消失的bug

这是由于xfwm(窗口管理器)4.14.1版本的一个bug导致的,可以参照这篇回答解决。不解决也有一个替代方式,可以直接按Alt+空格键调出菜单。