天天学习,好好向上!

标签 VNC 下的文章

最近,突发奇想,想着能不能在自己的远程主机上弄个图形界面再远程控制,上网搜了一圈,果然有不少教程,不过我比较担心我的主机 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 -c "/usr/bin/vncserver %i"
PIDFile=/home//.vnc/%H%i.pid

两处 为普通用户,会导致服务在 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 连接上远程主机。
批注 2019-10-15 224957.png
然后,就可以在 VNC 客户端里使用地址

127.0.0.1:5900

输入刚才用 vncpasswd 设置的密码来连接远程桌面啦!
效果如下图:
批注 2019-10-13 235609.png
PS:最后看了下,占用内存情况还是比较少的,现在内存占用率变化很小,依然不到 80%,几乎感觉不出来,Xfce 果然还是省内存呀!