优雅的远程连接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