Ubuntu 设置远程桌面(VNC)
连接 Xfce 远程桌面
-
安装 Xfce 以及
xfce4-goodies
软件包,其中包含一些桌面环境的增强功能:sudo apt install -y xfce4 xfce4-goodies
-
安装 TightVNC 服务器
sudo apt install -y tightvncserver
-
接下来,运行
vncserver
命令设置 VNC 访问密码,创建初始配置文件,并启动 VNC 服务器实例:vncserver
系统将提示你设置密码,这里需要填入一个长度小于 8 位的密码,多余的位数会被截去。之后你要再输入一遍相同的密码以确认密码。接下来系统会提示你是否要设置提供仅查看功能的密码,一般我们不需要这个功能,所以这里填
n
。启动 VNC 服务器时注意命令的输出提示。如果提示像下面这样,表示 1 号 VNC 服务器实例已被占用,创建了 2 号 VNC 服务器实例:
Warning: ubuntu-linux-22-04-desktop:1 is taken because of /tmp/.X1-lock Remove this file if there is no X server ubuntu-linux-22-04-desktop:1 New 'X' desktop is ubuntu-linux-22-04-desktop:2 Creating default startup script /home/parallels/.vnc/xstartup Starting applications specified in /home/parallels/.vnc/xstartup Log file is /home/parallels/.vnc/ubuntu-linux-22-04-desktop:2.log
-
此时我们已经设置好了密码。关闭 VNC 服务器实例:
vncserver -kill :1 # 刚刚创建了几号实例就关闭几号实例
-
接下来我们要修改
xstartup
文件:mv ~/.vnc/xstartup{,.bak} # 先备份原文件 vim ~/.vnc/xstartup # 创建新文件
填入以下配置:
#!/bin/bash xrdb $HOME/.Xresources startxfce4 &
为文件添加执行权限:
chmod +x ~/.vnc/xstartup
-
启动 VNC 服务器实例:
vncserver -localhost
由于 VNC 不具有加密功能,因此在公网上直接和 VNC 服务器通信并不安全。我们接下来将建立一个 SSH 隧道,通过隧道我们和 VNC 服务器连接。这种策略将为 VNC 增加一层额外的安全性,因为唯一能够访问它的用户是那些已经具有 SSH 访问权限的用户。
-
建立 SSH 隧道
ssh USER@HOST -L 5901:localhost:5901 -CNf # 注意改端口号,端口号应为 5900 + 实例号
-L 59000:localhost:5901
: -L 选项指定本地计算机(5901)上的给定端口将被转发到目标服务器上给定的主机和端口(localhost:5901
,其中目标服务器是 HOST)。-C
:此标志启用压缩,有助于减少资源消耗并加快速度。-N
: 此选项告诉 SSH 你不希望执行任何远程命令。当您只想转发端口时,此设置很有用。-f
: 此选项表示将 SSH 连接放到后台。避免长时间不用 SSH 连接时终端失去响应。
-
使用 VNC 客户端进行连接
如果你使用 macOS,可以使用系统自带的屏幕共享应用来连接:打开 Spotlight,搜索并打开
Sharing.app
。之后新建一个连接,连接地址填写vnc://localhost:5901
(注意改端口号为实际端口号)如果一切正常,你就能看到 Xfce 的远程桌面了。
将 VNC 作为系统服务运行(开机自启)
-
创建 systemd 服务文件:
sudo vim /etc/systemd/system/vncserver@.service
在名称末尾的
@
符号将允许我们传入一个参数,你可以在服务配置中使用。你将使用此参数来指定在管理服务时要使用的 VNC 显示端口。将以下行添加到文件中。确保更改
User
、Group
、WorkingDirectory
的值,并将PIDFILE
值中的用户名更改你的用户名:[Unit] Description=Start TightVNC server at startup After=syslog.target network.target [Service] Type=forking User=<USER> Group=<GROUP> WorkingDirectory=/home/<USER> PIDFile=/home/<USER>/.vnc/%H:%i.pid ExecStartPre=-/usr/bin/vncserver -kill :%i > /dev/null 2>&1 ExecStart=/usr/bin/vncserver -depth 24 -geometry 1280x800 -localhost :%i ExecStop=/usr/bin/vncserver -kill :%i [Install] WantedBy=multi-user.target
-
重启 systemd 守护进程
sudo systemctl daemon-reload
-
启用服务文件
sudo systemctl enable vncserver@1.service
这里的
1
表示服务应该出现在哪个显示编号上,这里为:1
。现在,每次启动系统时,都会自动启动一个编号为
:1
的 VNC 服务器实例。 -
建立 SSH 隧道
在每次连接 VNC 服务之前,你都需要确保已经建立了 SSH 隧道:
ssh USER@HOST -L 59000:localhost:5901 -CNf
Troubleshooting
灰屏问题
-
检查
~/.vnc/xstartup
配置文件的内容是否正确,以及文件是否有执行权限。 -
使用
ps -a
命令检查gnome-session-b
进程是否在运行:$ ps -a | grep gnome-session-b 9521 tty2 00:00:00 gnome-session-b
发现
gnome-session-b
进程在运行,此时无法启动 Xfce 桌面环境。注意我们必须通过 SSH 远程连接到服务器上进行接下来的操作,不能在主机的桌面环境下操作。关闭 gnome-session-b:
kill xxxx # 这里输入上面 gnome-session-b 的进程号,这里是 9521
然后再启动 VNC 服务器:
vncserver
此时再次尝试连接,应该就能看到桌面了。
参考:How to Install and Configure VNC on Ubuntu 22.04 | DigitalOcean
相关阅读
个人认为 RDP 更好用一点