引言
在介绍具体的方案之前, 有必要先介绍各种方案的实现方法. 要实现远程桌面主要只要解决三个问题:
- Q: 如何在远程桌面上使用 GPU 的功能(vulkan 等)?
A: 第一个问题的答案只有一个:接入显示器。所以我们必须需要为 GPU 接入一个显示器。如果是 headless 机器,那我们也可以使用虚拟显示器,通过伪装成显示器,欺骗显卡输出视频信号,使 GPU 工作起来,实现与物理显示器类似的功能。
具体的实现方法包括:使用显卡诱骗器(物理)或使用Xorg模拟出一个虚拟显示器。 - Q: 如何建立服务端和客户端之间的连接?
A: 第二个问题,由于在学校内,我们可以使用内网通讯,并且由于IPv6的覆盖,我们在校外也可以使用IPv6通讯,或直接使用内网穿透。 - Q: 如何将桌面编码以进行传输?
A: 第三个问题,我们可以使用 Linux/Ubuntu上的 X server,将显卡输出的视频信号通过VNC转发出来,vino VNC/ X11VNC均支持这个特性,我这里选用了X11VNC,因为功能更多,更灵活。
设置显示器
需要的工具
- 终端访问权限(ssh等)及 sudo 权限
- 显卡诱骗器(可选)
- 物理显示器以及视频信号线(HDMI、DP)(可选)
方法一:使用物理显示器/显卡诱骗器
接入物理显示器
这不用我说了吧
插入显卡诱骗器
将显卡诱骗器/显示器接入显卡上的 HDMI/DP 接口。建议接入 GPU0,一般是主板最上面的 GPU,可用如下命令确定插入的 GPU。
sudo nvidia-xconfig --query-gpu-info
方法二:使用软件模拟虚拟显示器(无须额外硬件)
慎用,默认只会使用虚拟显示器,而无法使用物理显示器!!!
通过配置/etc/X11/xorg.conf文件,从而实现增加GPU设备上的虚拟显示器。适合Remote Headless Server等无法物理接触到的设备,尚未确定此方法是否会遇到bug。
sudo nvidia-xconfig -a --allow-empty-initial-configuration --use-display-device=None --virtual=1920x1080
sudo vim /etc/X11/xorg.conf
在xorg.conf配置中,将多余的Screen和Monitor删掉,只保留Screen 0和Monitor 0。
Section "ServerLayout"
Identifier "Layout0"
Screen 0 "Screen0" 0 0
InputDevice "Keyboard0" "CoreKeyboard"
InputDevice "Mouse0" "CorePointer"
EndSection
Section "Monitor"
Identifier "Monitor0"
VendorName "Unknown"
ModelName "Unknown"
Option "DPMS"
EndSection
Section "Screen"
Identifier "Screen0"
Device "Device0"
Monitor "Monitor0"
DefaultDepth 24
Option "UseDisplayDevice" "None"
SubSection "Display"
Virtual 1920 1080
Depth 24
EndSubSection
EndSection
安装 Xfce4 桌面
安装 Xfce4 桌面,因为占用比 Ubuntu 自带的 gnome 更小,并且对 X server(远程桌面的依赖)支持更好。(Ubuntu 自带的 gnome 桌面理论上也行)
sudo apt install xubuntu-desktop
这里选择使用lightdm:
卸载屏幕保护程序,因为它会让VNC卡死:
sudo apt purge xfce4-screensaver
安装 X11VNC
打开终端,使用以下命令安装 X11VNC:
sudo apt install x11vnc
生成 VNC 密码
安装完成后,使用以下命令生成密码文件(建议不要使用sudo):
x11vnc -storepasswd
VNC的密码会被默认保存在 /home/[username]/.vnc/passwd
,具体请查看终端的输出。
(自行将 [username]
替换为你的用户名)
请注意,VNC的密码和你的帐户密码不是同一个东西,VNC的密码只用于连接VNC桌面。有了它,就可以直接控制你的桌面,因而VNC密码的重要程度与你的帐户密码相等!
创建 X11VNC 服务并运行
编辑X11VNC的服务配置文件:
sudo vim /etc/systemd/system/x11vnc.service
在文件中添加以下内容,注意几点:
- 将
-rfbauth
后的[username]
替换为你的用户名 - 将
-display
后的参数替换为你的显示器/虚拟显示器id(默认为0,如果多用户使用的话,请自己确认显示器id:xrandr --list-monitors
) - 确保 rfbport 后的端口号与本机其他人占用的不同,默认为
5900
,如果多用户使用的话,请商议好每个人的端口号) - 如果你使用gnome,注释掉
After=lightdm.service
,改为After=display-manager.service
[Unit]
Description="X11VNC Server"
Requires=display-manager.service
After=lightdm.service
#如果你使用gnome,注释掉After=lightdm.service
#After=display-manager.service
#如果你使用gnome,取消注释After=display-manager.service
[Service]
ExecStart=/usr/bin/x11vnc -xkb -noxrecord -noxfixes -noxdamage -display :0 -auth guess -rfbauth /home/[username]/.vnc/passwd -forever -ultrafilexfer -loop -shared -cursor most -cursor_drag -cursorpos -bg -rfbport 5900 -o /var/log/x11vnc.log
#-cursor most -cursor_drag -cursorpos与光标有关
#-shared为允许多个会话同时连接到同一个桌面
ExecStop=/usr/bin/killall x11vnc
[Install]
WantedBy=multi-user.target
使用:wq退出并保存文件,sudo reboot
重启。
执行以下命令,创建x11vnc服务,实现自启动/守护:
sudo systemctl enable x11vnc
sudo systemctl start x11vnc
sudo systemctl status x11vnc
现在,X11VNC服务已经在后台运行,并监听5900端口。
连接VNC远程桌面
现在你可以使用VNC客户端连接到你的Ubuntu系统的远程桌面。
在VNC客户端中输入你的设备的IP地址和VNC端口(默认5900
),然后输入之前生成的密码。
Windows
- 使用
Real VNC Viewer
- 使用Chrome浏览器的插件:
VNC Viewer for Google Chrome
- 使用“远程桌面
mstsc
” (仅安装xRDP后可用)
MacOS
- 使用系统自带的远程协助,在Safari浏览器或聚焦搜索Spotlight上输入
vnc://ip:port
,其中ip
和port
替换为你的设备的IP地址和VNC端口。 - 使用Chrome浏览器的插件:
VNC Viewer for Google Chrome
- 使用
Real VNC Viewer
- 使用
Microsoft Remote Desktop
(仅安装xRDP后可用)
Linux
- 使用
Real VNC Viewer
- 使用
Remmina
(可连接VNC/RDP) - 使用Chrome浏览器的插件:
VNC Viewer for Google Chrome
Android/iOS
- 使用
Real VNC viewer
- 使用
Microsoft Remote Desktop
(仅安装xRDP后可用)
请注意,VNC连接是不加密的,因此建议在安全的网络环境中使用。
最终效果及功能
目前功能:
- 双向剪贴板 (remote <-> client)
- 文件传输(待实现,可用sftp替代)
- 可变光标
- 多用户桌面隔离
- 可调整桌面分辨率
下面,我们来测试OpenGL是否调用了GPU:
glxinfo | grep "version"
如果得到输出包含NVIDIA,而不是mesa等,则成功,如图:
调整桌面分辨率
如果机器上没有连接显示器的话,那么在settings->display菜单里面是没有办法修改的。我们可以通过下面几种方式修改:
方法一 xrandr(最简单,推荐)
进入远程桌面后,打开终端,使用
sudo xrandr --fb 1920x1080
调整分辨率至1920 x 1080,其中x为英文字母,不能输入*。
方法二 nvidia-settings
使用nvidia-settings修改分辨率以及刷新率,命令如下所示:
sudo nvidia-settings
方法三(不推荐,nogui/虚拟显示器下可用)
修改/etc/X11/xorg.conf 配置文件
sudo vim /etc/X11/xorg.conf
可以将文件中原有的 分辨率 修改为你需要的分辨率,配置完成后请重启操作系统。
安装xRDP(可选)
为了更加方便的使用,我们还可以安装xrdp,这样就可以直接使用windows自带的远程桌面(mstsc)、macOS上的Microsoft Remote Desktop
、Linux上的Remmina进行连接。
- ubuntu22.04及以下系统,请安装0.9.12-1版的xRDP:
sudo apt install xrdp=0.9.12-1
- ubuntu23.04以下系统,请直接安装apt仓库中最新的xRDP:
sudo apt install xrdp
安装好后,直接使用rdp连接,帐户密码随便填,选择
英文版、xRDP配置等,还待填坑······
参考文档
参考文档:
- https://www.renyiwei.com/archives/1813.html
- https://forums.developer.nvidia.com/t/run-omniverse-create-on-server-remotely-using-vnc/217145/5
- https://gitee.com/mo2/linux/issues/I4QKYV
- https://blog.csdn.net/weixin_52033229/article/details/124013526
- https://gist.github.com/zzilch/33843124341712408e3f2d82c524b67c
- https://x-candy.github.io/2018/09/06/x11-conf/
- https://docs.google.com/document/d/1LGUJnEZ7c6VP3upGLUYFddncEqKEW4GCDJKc0esoJbw/
...