如何在 macOS 上连接 Linux 远程桌面呢?我的答案是:xrdp!
在苹果系统上使用微软的协议来连接 Linux 机器,无疑是一种比较扭曲的行为;但这确实是我目前为止尝试过无数方法中,效果最好的一种。这种方式非常流畅,甚至可以远程播放视频。
在此记录一下我配置 xrdp 时遇到的问题以及解决方案,供大家参考。
故障排查
如果你使用 xrdp 配置远程桌面时,遇到无法显示的问题,可以采用以下思路来排查:
- 查看 /var/log/xrdp.log 和 /var/log/xrdp-sesman.log。前者是 xrdp 程序本身的日志,而后者是 xrdp-sesman(会话管理器)的日志。前者负责处理 RDP 协议本身,通常不太可能出现问题(如果出问题,systemd 应该会报告启动失败);后者负责启动 Xorg 服务器及桌面管理器,问题一般都会出在这一环。如果遇到问题,应该首先查看 xrdp-sesman.log,检查是否成功启动了 Xorg 服务器。
- 查看 Xorg 服务器的日志(通常位于 ~/.xorgxrdp.10.log)。
- 首先需要检查 xrdp 相关的模块是否得到正确加载。xrdp 相关的模块有
xorgxrdp
、xrdpdev
、xrdpmouse
、xrdpkeyb
。如果加载这些模块时出现错误,则表明你的 xrdp 或 xorgxrdp 安装有问题,可以尝试重新编译安装。 - 其次需要检查 Xorg 是否有尝试访问物理屏幕。在 xrdp 中,我们应该向 xorgxrdp 创建的虚拟屏幕渲染,而不应当访问物理屏幕。如果 Xorg 尝试初始化物理屏幕,则表明系统中原有的 Xorg 配置与新的配置可能有冲突,此时可以按照下方第 2 条来解决。Xorg 服务器是以用户身份执行的,所以访问物理屏幕应该会因为权限不足而失败,请留意是否有 permission denied 信息即可。
- 首先需要检查 xrdp 相关的模块是否得到正确加载。xrdp 相关的模块有
- 检查 startwm.sh 是否有成功启动桌面管理器。如果 Xorg 服务器成功启动,但看不到任何画面,则可以在 ssh 中手动设置
DISPLAY
环境变量为:10
,然后再执行 startwm.sh,查看是否有错误消息,并根据错误消息进行修正。
一些经验
- 请使用 xrdp 的最新版本,而不是发行版自带的版本。发行版自带的版本较老,可能缺乏一些必要的功能,例如动态调整分辨率。在 Ubuntu 下,可以下载源码,使用 dpkg 自行打包。我为 Ubuntu 20.04 编译了 xrdp 最新版 0.9.18,如有需要可以自取:https://seafile.h.t123yh.xyz:3/d/649bf246d8764a61a1f0/
- 如果你的系统中有某些奇怪的配置(例如加载了 modesetting 模块),则 xrdp 的 Xorg 服务器可能受到干扰,无法正常运行。收到
parse_vt_settings: Cannot open /dev/tty0 (Permission denied)
报错就是典型的症状。遇到这类问题时,可以在 sesman.ini 的 Xorg 启动命令中增加这两行:param=-configdir
和param=/
,这样就可以使 Xorg 不要读取系统中原有的 Xorg 配置。 - 在 Ubuntu 系统下,如果出现登录后界面样式不对的情况,可在用户 home 目录下放置 .xsessionrc 文件,内容为
export GNOME_SHELL_SESSION_MODE=ubuntu export XDG_CURRENT_DESKTOP=ubuntu:GNOME export XDG_CONFIG_DIRS=/etc/xdg/xdg-ubuntu:/etc/xdg
- 在 /etc/xrdp/xrdp.ini 中,调整 buffer 大小及最大色深,可以提升性能。目前我使用的参数见下。
tcp_send_buffer_bytes=1048576 tcp_recv_buffer_bytes=262144 max_bpp=16
存在的问题
- 无法在 xrdp 连接下执行需要 sudo 的程序,如 gparted。
- https://github.com/neutrinolabs/xrdp/issues/2092 当前 xrdp 鼠标指针图标大小不能超过 32×32。因此,在高分屏下,可能会出现鼠标被截断的问题。
本作品使用基于以下许可授权:Creative Commons Attribution-ShareAlike 4.0 International License.
rdp yyds!