在 Linux 下配置 xrdp 的一些经验

如何在 macOS 上连接 Linux 远程桌面呢?我的答案是:xrdp!

在苹果系统上使用微软的协议来连接 Linux 机器,无疑是一种比较扭曲的行为;但这确实是我目前为止尝试过无数方法中,效果最好的一种。这种方式非常流畅,甚至可以远程播放视频。

在此记录一下我配置 xrdp 时遇到的问题以及解决方案,供大家参考。

故障排查

如果你使用 xrdp 配置远程桌面时,遇到无法显示的问题,可以采用以下思路来排查:

  1. 查看 /var/log/xrdp.log 和 /var/log/xrdp-sesman.log。前者是 xrdp 程序本身的日志,而后者是 xrdp-sesman(会话管理器)的日志。前者负责处理 RDP 协议本身,通常不太可能出现问题(如果出问题,systemd 应该会报告启动失败);后者负责启动 Xorg 服务器及桌面管理器,问题一般都会出在这一环。如果遇到问题,应该首先查看 xrdp-sesman.log,检查是否成功启动了 Xorg 服务器。
  2. 查看 Xorg 服务器的日志(通常位于 ~/.xorgxrdp.10.log)。
    1. 首先需要检查 xrdp 相关的模块是否得到正确加载。xrdp 相关的模块有xorgxrdpxrdpdevxrdpmousexrdpkeyb。如果加载这些模块时出现错误,则表明你的 xrdp 或 xorgxrdp 安装有问题,可以尝试重新编译安装。
    2. 其次需要检查 Xorg 是否有尝试访问物理屏幕。在 xrdp 中,我们应该向 xorgxrdp 创建的虚拟屏幕渲染,而不应当访问物理屏幕。如果 Xorg 尝试初始化物理屏幕,则表明系统中原有的 Xorg 配置与新的配置可能有冲突,此时可以按照下方第 2 条来解决。Xorg 服务器是以用户身份执行的,所以访问物理屏幕应该会因为权限不足而失败,请留意是否有 permission denied 信息即可。
  3. 检查 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=-configdirparam=/ ,这样就可以使 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。因此,在高分屏下,可能会出现鼠标被截断的问题。

CC BY-SA 4.0 本作品使用基于以下许可授权:Creative Commons Attribution-ShareAlike 4.0 International License.

《在 Linux 下配置 xrdp 的一些经验》有一个想法

评论已关闭。