优雅的远程连接 Ubuntu 图形桌面

  绝大多数时候利用 SSH 可以方便的连接上 Ubuntu 服务器完成大部分工作,但是仍有部分程序必须在图形化界面下运行,比如 nvidia-settingsvirtualboxfirefox 等。本篇文章基于 Ubuntu 20.04 下进行编写。

xrdp 方案

  vnc协议是 Linux 下最为流行的远程协议,除此之外同样有程序为 Ubuntu 实现了微软的 rdp协议。使用这种方法,可以:①方便的支持任意多个用户同时连接;②对 Windows 客户端非常友好,使用 mstsc 就可以直接连接;但是同样有些不足:xrdp 实现了一个虚拟的 XServer,这个 XServer 并没有载入 N 卡驱动,因此 nvidia-settings 仍旧无法打开。

  1. sudo apt update
  2. sudo apt install xrdp
  3. sudo systemctl enable xrdp
  4. sudo systemctl start xrdp
  5. 使用 mstsc 连接服务器
  6. 选择 Xorg,输入用户名及密码登录

vino 方案

  Ubuntu 默认使用 GNOME 作为桌面环境,使用与之配套的 vino 就可以优雅的开启一个 VNC Server。使用这种方法,缺点很多:①服务器必须接上显示器并登陆一个且只能一个用户,这意味着如果存在多个用户,将不能够同时使用,切换用户时还必须跑到服务器前面注销当前用户再登陆另一个用户;②你的一举一动在物理显示器上可以观察的一清二楚。

  1. sudo apt update
  2. sudo apt install vino
  3. 打开 Ubuntu 设置 -> 共享 -> 屏幕共享 -> 启用 -> 允许连接控制屏幕 -> 需要密码 (VNC 密码)-> 允许网络,如图 1 所示
  4. 关闭 TLS 加密,实测不关闭,则 macOS 自带的 VNC,Windows 下最新版本的 RealVNC Viewer、TigerVNC Viewer 均不兼容
    gsettings set org.gnome.Vino require-encryption false
  5. 使用任意 VNC Client 连接服务器
  6. 每个要连接 VNC 的用户都要完成以上 3~4 的操作
允许屏幕共享

使用 VNC 连接登录屏幕

  为了弥补 vino 方案致命的缺陷,需要一个方法连接 Ubuntu 的登录屏幕,Ubuntu 使用 gdm3 作为用户登录管理器,但是 Ubuntu 20.04 下的 gdm3 并不能直接使用 VNC 连接登录屏幕。可行的办法有两个:①使用 lightdm 代替 gdm3,但是安装 lightdm 时有近 40 个依赖包要一并安装;②关闭 Wayland 使用旧的 X11 的方式渲染登录屏幕。以下均假设 125gdm 使用的用户,可以通过命令 cat /etc/passwd | grep gdm 查看。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
sudo vim /etc/gdm3/custom.conf
# 取消该行的注释
#WaylandEnable=false

# 或直接执行以下命令:
sudo sed -i "s/#WaylandEnable=.*/WaylandEnable=false/g" /etc/gdm3/custom.conf

# 修改完成后重启

sudo ps -aux | grep auth
# 修改前
/usr/bin/Xwayland :1024 -rootless -noreset -accessx -core -auth /run/user/125/.mutter-Xwaylandauth.19SU70 -listen 4 -listen 5 -displayfd 6 -listen 7
# 修改后
/usr/lib/xorg/Xorg vt1 -displayfd 3 -auth /run/user/125/gdm/Xauthority -background none -noreset -keeptty -verbose 3
# 可以观察到登陆程序已经从Xwayland变为Xorg

  此时需要安装一个 VNS Server 用于连接登录屏幕,尽管 Linux 下有很多 VNC Server,但是目前仅发现只有 x11vnc 可以满足登录屏幕的 VNC 功能。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 1. 安装x11vnc
sudo apt update
sudo apt install x11vnc net-tools

# 2. 设置公用的登录屏幕的VNC密码
sudo x11vnc -storepasswd /etc/x11vnc.passwd

# 3. SSH连接到服务器后开启一个临时的VNC Server
sudo x11vnc -auth /run/user/125/gdm/Xauthority -rfbauth /etc/x11vnc.passwd -rfbport 5910

# 有用的参数:
-viewonly 只能查看,不能控制,默认关闭
-shared 允许多个用户同时连接到同一个会话,同时查看/操控,默认关闭
-loop 若VNC Server启动失败,循环尝试再次启动

-once 第一个连接的会话结束后关闭VNC Server,默认
-forever 一直监听端口直到VNC Server被杀死

# 4. 使用任意VNC Client连接目标服务器的第10个端口

  systemd 启动脚本,可以将 x11vnc 配置为系统服务:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
sudo bash -c 'cat <<EOF > /etc/systemd/system/x11vnc.service
[Unit]
Description=x11vnc service
After=display-manager.service network.target

[Service]
Type=simple
ExecStart=/usr/bin/x11vnc -auth /run/user/125/gdm/Xauthority -rfbauth /etc/x11vnc.passwd -rfbport 5910 -loop -forever -shared
ExecStop=/usr/bin/killall x11vnc
Restart=on-failure

[Install]
WantedBy=multi-user.target
EOF'

sudo systemctl enable x11vnc
sudo systemctl start x11vnc

  使用 VNC Client 连接到 Ubuntu 端口 5910 并登陆后,该屏幕随后会黑屏,然后需要再开一个 VNC Client,用于连接已登陆的用户会话,当用户注销后,该屏幕又会回到登录状态,因此将 vino 方案与该方法一起配合使用,可以达到远程切换用户登录的目的。又由于这个 VNC 方案使用的是物理显示器上的 X11 Server,因此 N 卡驱动可以正常加载,可以打开 nvidia-settings