最近,突发奇想,想着能不能在自己的远程主机上弄个图形界面再远程控制,上网搜了一圈,果然有不少教程,不过我比较担心我的主机RAM太小,导致图形界面运行不起来,在装了一大堆服务后,甲骨文的免费主机的1G内存占用率已经达到了近80%,所以我的选择一个占用内存小的桌面。
根据网上查找教程的线索,提出Xfce这种图形界面即省内存,又不简单,所以就选择他了。根据网上的教程,先进入root账户,直接输入

yum grouplist

来查看都有哪些可以安装的组包,显示有Xfce,所以就按照网上的教程,输入了

yum groupinstall "Server with GUI"
yum groupinstall Xfce

期间提示输入了两次y,等了一小会就安装好了

因为我只能远程连接我的主机,所以我也就没有设置什么默认图形界面启动。然后,就开始研究远程连接了

查了查资料,显示好像VNC连接比较方便,然后就找了篇教程,输入

yum install vnc-server

就可以吧VNC服务安装到主机上了.

接下来是配置,参照网上的配置,把我弄得一头雾水,有的说需要改/etc/sysconfig/下的配置文件,有的说拷贝配置文件到systemd目录下。最后实际去看了看 这些文件发现下面这种才正确。

cp /lib/systemd/system/[email protected] /etc/systemd/system/[email protected]:1.service

有博主说,直接把[email protected]文件拷贝到/etc/systemd/system/目录下也行,不用加那个“:1”,后来经过我的测试,还是带了好,这样可以指定好VNC服务的端口(:1对应的端口就5901,:2就是5902,以此类推),而且可以配置出多个不同用户的实例,更加方便管理。这里我们只配置一个。输入如下命令来编辑配置文件,

vi /etc/systemd/system/[email protected]:1.service

前面按照网上的教程,修改配置文件使用root用户来连接VNC,我照做了,开始没理解用户那里怎么配置,失败了,后来干脆完全照搬代码,终于也成功了,可是直接用root用户连接时,系统会提示不安全,所以我还是想使用默认账户opc来连接VNC服务。所以,经过反复试验,终于找到了既能使用普通账户,又不会出现systemd里的错误信息,配置文件改成了如下:

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

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

PIDFile=/home/opc/.vnc/%H%i.pid
ExecStartPre=-/usr/bin/vncserver -kill %i > /dev/null 2>&1
ExecStart=/usr/bin/vncserver -localhost -nolisten tcp %i
ExecStop=/usr/bin/vncserver -kill %i > /dev/null 2>&1

[Install]
WantedBy=multi-user.target

特别需要注意的是,采用网上的教程,仅仅修改

ExecStart=/sbin/runuser -l <USER>-c "/usr/bin/vncserver %i"
PIDFile=/home/<USER>/.vnc/%H%i.pid

两处<USER>为普通用户,会导致服务在systemd里启动时报错

New main PID 2241 does not belong to service, and PID file is not owned by root. Refusing.

诡异的是仍然可以使用VNCViewer正常连接。。。。
为了不出现这个错误,在[Service]里需要把User、Group和WorkingDirectory均指定到opc用户。同时把几项命令字符串改写为opc用户直接运行的样子。

ExecStartPre=-/usr/bin/vncserver -kill %i > /dev/null 2>&1
ExecStart=/usr/bin/vncserver -localhost -nolisten tcp %i
ExecStop=/usr/bin/vncserver -kill %i > /dev/null 2>&1

这里特别需要注意的是ExecStart命令,因此vnc服务并未加密,直接从外网连接有一定危险性。于是我加上了-localhost和-nolisten tcp参数,这两个参数添加后,可以防止直接从外网访问主机VNC,只能通过SSH通道端口转发方式才能连接,同时关闭tcp监听,实现更加安全的VNC服务。

随后,切换回opc用户

su opc
vncpasswd

设置VNC服务的密码
然后把VNC服务设置为自启动

sudo systemctl daemon-reload
sudo systemctl enable [email protected]:1.service
sudo systemctl start [email protected]:1.service

若开启了防火墙,还需要设置防火墙

sudo firewall-cmd --permanent --add-service vnc-server
sudo systemctl restart firewalld.service

然后编辑启动配置文件xstartup

vi /home/opc/.vnc/xstartup

设置为如下内容

#!/bin/sh
unset SESSION_MANAGER
[ -x /etc/vnc/xstartup ] && exec /etc/vnc/xstartup
[ -r $HOME/.Xresources ] && xrdb $HOME/.Xresources
xsetroot -solid grey
vncconfig -iconic &
startxfce4 &

保存即可。如果xstartup是个空白文件,则还需要对它进行赋权

sudo chmod 755 /home/opc/.vnc/xstartup
sudo chown opc:opc /home/opc/.vnc/xstartup

然后输入

sudo systemctl restart [email protected]:1.service

重启VNC服务。
接下来就可以在自己电脑上安装VNC客户端,先使用putty,选择之前建立的连接服务器的Session,进入左侧Connection-SSH-Tunnels里,在Source Port输入5900,Destination里输入localhost:5901,选择Local单选框,最后点击Add按钮,即可添加本地5900端口到远程主机5901端口的转发映射。去Session里保存下,然后点击Open按钮使用ssh连接上远程主机。


然后,就可以在VNC客户端里使用地址

127.0.0.1:5900

输入刚才用vncpasswd设置的密码来连接远程桌面啦!
效果如下图:


PS:最后看了下,占用内存情况还是比较少的,现在内存占用率变化很小,依然不到80%,几乎感觉不出来,Xfce果然还是省内存呀!