2021-08-06
< view all postsLinux的服务器版很多是不带GUI的,不过对于我们个人自用的服务器,很多时候有一个GUI桌面会方便很多。这里记录一下如何为云服务器(例如我用的腾讯云)配置GUI并通过VNC软件远程连接。
首先安装一个GUI桌面,桌面种类很多,选择一种即可。下面给了三个例子:
xfce是一个轻量级的桌面,它的资源占用少,配置也简单,用来安装在云主机上是很合适的:
sudo apt update sudo apt install xfce4 xfce4-goodies
上面的xfce4-goodies包含了一些常用的额外的桌面程序,因此也推荐安装。
GNOME是一个很主流的桌面,也是ubuntu默认的桌面,参考此处,执行:
apt install task-gnome-desktop
首先安装tasksel,这是一个用于帮助快速安装和部署软件包的工具:
sudo apt update sudo apt install tasksel
之后通过tasksel安装桌面GUI,也是以ubuntu默认的GNOME为例:
sudo tasksel install ubuntu-desktop
在安装完成之后,就可以从网页登录云主机,选择VNC方式。之后执行 startx,就能够打开GUI桌面环境。
因为网页操作毕竟不方面,这时候就可以安装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",这样可以只显示本地鼠标指针,效果更好。
在云服务器上,安装TightVNC的Server端:
apt install tightvncserver
安装完成后需要先启动一次,因为vncserver的配置文件必须先运行一次才会生成。执行:
vncserver
首次启动时需要设置密码,注意密码必须是6-8位的长度。如果之后需要修改密码,可以使用 vncpasswd 命令。
这个时候因为配置文件还没有配好,直接连接上去是无效的。先停止vncserver:
vncserver -kill :1
其中的:1是编号。默认是1,它在启动的时候是可以指定的,如 vncserver :2 。
现在开始进行必要的配置:
如果上面选择安装的桌面是xfce4,那么配置很简单,打开 ~/.vnc/xstartup 文件,将下面这一行添加到最后:
startxfce4 &
startxfce4 本质上是一个脚本,里面整合了启动xfce所需的步骤。而 xstartup 这个文件中的内容会在vncserver启动完成后执行,因此添加这一行即可。
参考此处,首先用以下命令安装软件:
apt install gnome-panel gnome-settings-daemon metacity nautilus gnome-terminal
之后,打开 ~/.vnc/xstartup 文件,将以下内容加入到文件的末尾:
gnome-panel & gnome-settings-daemon & metacity & nautilus &
执行如下命令:
vncserver :1 -geometry 2560x1440 -depth 16
即可启动,分辨率和色彩深度建议根据实际情况调整。测试发现色彩深度指定为8bit时部分程序的显示可能出现问题,因此建议不要低于16bit。
在vncserver启动时,会在屏幕上显示日志文件的位置。查看日志文件,就能够看到vncserver所用的端口。默认应该是5901。
在云服务器的安全组策略中,放通对应端口,如5901端口的入站和出站。
此时打开windows机器上的TightVNC Viewer软件,在Remote Host栏输入远程服务器的ip和端口号(注意是端口号是两个冒号分割),之后点击Connect,就可以连接上了。
参考此处,因为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即可。
这是由于xfwm(窗口管理器)4.14.1版本的一个bug导致的,可以参照这篇回答解决。不解决也有一个替代方式,可以直接按Alt+空格键调出菜单。