Xrdp
xrdp 是一个支持微软 远程桌面协议 (RDP) 的守护进程。它使用 Xvnc 或 xorgxrdp 作为后端。
安装
安装 xrdpAUR 软件包。此版本仅支持 Xvnc 作为后端。
Xorg 后端
若要改用 xorgxrdp 作为后端,请 安装 xorgxrdpAUR 软件包。
用法
首先,启动 xrdp 服务。你应该能够使用 RDP 客户端连接到主机的默认 RDP 端口 (3389)。如果连接成功,你将看到 xrdp 会话管理器窗口,允许你在 Xorg 或 Xvnc 会话之间进行选择,并提供用户身份验证输入。可以通过修改 /etc/xrdp/xrdp.ini 来高度自定义会话管理器的界面。
用于启动 Xorg 和 Xvnc 显示服务器的参数可以在 /etc/xrdp/sesman.ini 中配置。
在成功启动显示服务器后,xrdp 默认将执行 /etc/xrdp/startwm.sh。该脚本旨在启动窗口管理器(类似于 .xinitrc),并且如果 ~/.xinitrc 或 /etc/X11/xinit/xinitrc 存在,它将从中读取。建议编辑 ~/.xinitrc 来启动你的桌面环境或窗口管理器,但你也可以编辑 /etc/xrdp/startwm.sh。
如果你只是关闭会话窗口和 RDP 连接,下次连接 RDP 时可以再次访问同一个会话。当你从会话窗口退出窗口管理器或桌面环境时,会话将关闭,下次连接时将开启一个新会话。
配置
以非特权用户和组运行
强烈建议将运行 xrdp 守护进程的用户和组设置为非特权用户。为此,首先创建 xrdp 用户和组
# useradd xrdp -d / -c 'xrdp daemon' -s /usr/bin/nologin
然后取消 xrdp.ini 中以下值的注释,以设置运行守护进程的用户
/etc/xrdp/xrdp.ini
runtime_user=xrdp runtime_group=xrdp
同时确保 /etc/xrdp/sesman.ini 中的 SessionSockdirGroup 的值与上述运行组一致。
做出这些更改后,使用脚本 /usr/share/xrdp/xrdp-chkpriv 检查守护进程所需的文件权限,并修正检测到的任何问题。
最后,重启 xrdp.service 守护进程。
技巧与提示
开机自启动
xrdpAUR 软件包包含用于 systemd 的服务文件。启用 xrdp.service。
图形加速
对于 Xorg 会话,你可以通过为 Intel 和 AMD GPU 安装 xorgxrdp-glamorAUR,以及为 NVIDIA GPU 安装 xorgxrdp-nvidiaAUR 来启用 OpenGL 和 Vulkan 图形加速。
声音
使用 pulseaudio-module-xrdpAUR 安装必要的 PulseAudio 模块。
对于 PipeWire 用户,请安装 pipewire-module-xrdpAUR。
非 root 用户
在 Xwrapper.config 中包含以下行
/etc/X11/Xwrapper.config
allowed_users=anybody needs_root_rights=no
如果上述行不存在,那么来自 Remmina 等应用程序的远程桌面连接将以空白屏幕启动。
通过 SSH 隧道访问
为了增加安全性,如果服务器提供 SSH 连接,你可以选择仅允许本地连接,然后通过 SSH 隧道传输连接。这样做的好处是你不需要将 xrdp 端口暴露在公共互联网上。
设置 xrdp 守护进程的端口以仅监听本地连接
/etc/xrdp/xrdp.ini
port=tcp://.:3389
在客户端,通过 TCP 转发建立到 xrdp 服务器的 SSH 连接
$ ssh user@host -L 3389:localhost:3389
在 RDP 客户端中,连接到 127.0.0.1:3389 以通过 SSH 隧道访问 xrdp。
欲了解更多信息,请参阅 OpenSSH#Forwarding other ports 和 ssh(1)。
故障排除
光标周围有黑框
如果你遇到鼠标指针周围有黑框的情况,请创建包含 Xcursor.core:1 这一行的 ~/.Xresources-xrdp 文件,并在 ~/.xinitrc 中像这样加载它
xrdb ~/.Xresources-xrdp exec startlxde
你可能需要安装 xorg-xrdb。
黑屏
在登录会话管理器后,你可能会遇到黑屏。
~/.xinitrc 的最后一行可能看起来像 exec $(get_session "$1")。如果在 /etc/xrdp/startwm.sh 中未提供默认参数,则需要一个默认参数。
你可以根据个人喜好将 ~/.xinitrc 的最后一行改为 exec $(get_session "${1:-"$SESSION"}") 或 exec $(get_session "${1:-xfce}")。
或者,你也可以编辑 /etc/xrdp/startwm.sh 中对 ~/.xinitrc 的调用;例如 . ~/.initrc xfce。这将影响所有用户。
带有桌面环境时黑屏
如果你使用桌面环境且出现黑屏,这可能是由于 D-Bus 未正确初始化导致的。某些桌面环境(如 KDE Plasma)可能能够从之前的会话中恢复完全可用的应用程序/窗口,这会让你觉得“只有 plasmashell”丢失了。
尝试在 ~/.xinitrc 文件中使用 dbus-launch --exit-with-session 运行桌面环境。对于 KDE Plasma,你可以使用命令 /usr/lib/plasma-dbus-run-session-if-needed startplasma-x11 或 dbus-launch --exit-with-session startplasma-x11。
绿屏
如果登录对话框出现,但点击确定后没有启动桌面环境,请将 /etc/xrdp/sesman.ini 中的 param=Xorg 改为 param=/usr/lib/Xorg。
loginctl 或 systemctl --user 不工作
尝试注释掉 /etc/pam.d/system-auth 中所有对 systemd-home 的引用。参见此 issue。
提示输入 gnome-keyring 或 KDE Wallet 密码
如果会话启动时提示你登录 gnome-keyring 或 [KDE Wallet],请按如下方式修改 /etc/pam.d/xrdp-sesman 文件
/etc/pam.d/xrdp-sesman
#%PAM-1.0 auth include system-remote-login -auth optional pam_gnome_keyring.so -auth optional pam_kwallet5.so account include system-remote-login password include system-remote-login -password optional pam_gnome_keyring.so use_authtok session include system-remote-login -session optional pam_gnome_keyring.so auto_start -session optional pam_kwallet5.so auto_start
然后,将 etc/pam.d/xrdp-sesman(没有前导斜杠)添加到 /etc/pacman.conf 的 NoUpgrade 中。如果你只使用 gnome-keyring,则无需包含 kwallet5 的行,反之亦然。
防止自启动项目启动
为了防止用户定义的 ~/.config/autostart 项目启动,你可以在 ~/.xinitrc 的会话中设置自启动目录参数,使其仅使用全局 /etc/xdg/autostart 目录。
get_session(){
local dbus_args=(--sh-syntax)
case "$SESSION" in
awesome) dbus_args+=(awesome) ;;
bspwm) dbus_args+=(bspwm-session) ;;
budgie) dbus_args+=(budgie-desktop) ;;
cinnamon) dbus_args+=(cinnamon-session -a /etc/xdg/autostart) ;;
无声音
如果你正在使用 pipewire 或 pulseaudio,请检查模块是否已安装。在 AUR 中,它们是 pipewire-module-xrdp 和 pulseaudio-module-xrdp。记得注销并重新登录以使它们生效
这也可能是 loginctl 问题的一个症状,因此请尝试上方的修复方法。在系统 日志中可能会遇到以下错误
Failed to load module "module-x11-publish" (argument: "display=:10.0 xauthority="): initialization failed.
这是由于 systemd 启动 PulseAudio 不正确导致的结果。一种解决方法是禁用为你自己或所有用户的 用户单元文件 pulseaudio.service 和 pulseaudio.socket,并通过在 /etc/pulse/client.conf 中将 autospawn 设置为 yes,使 PulseAudio 在需要时启动。
如果声音仍然不起作用,请尝试在 ~/.xinitrc 中通过 pulseaudio & 手动启动 PulseAudio。
双指滚动太快
使用 xorg 后端,确保 xorgxrdp 版本为 0.9.19 或更高。然后在 /etc/xrdp/sesman.ini 的 [SessionVariables] 部分添加 XRDP_XORG_TOUCHPAD_SCROLL_HACK=yes。
详情请参阅 上游 issue #150。
远程系统内功能受限
用户远程登录系统时的访问权限可能与本地登录时不同。可能需要对 polkit 权限策略进行额外配置以授予访问权限,包括访问挂载的驱动器或控制网络连接。
已挂载的驱动器
关于挂载驱动器的远程访问权限,请参阅 udisks#Permissions。
NetworkManager
关于 NetworkManager 的远程访问权限,请参阅 NetworkManager#Set up PolicyKit permissions。
H.264 编解码器
xrdp 0.10.2 及以后版本提供 H.264 作为首选编解码器。默认设置是为了性能,但根据 GPU 的不同,可能会导致视频质量下降或运行迟缓。你可以通过编辑 /etc/xrdp/gfx.toml 来调整。选项列表请参阅 man gfx.toml。通常,如果视频质量不佳,你可以尝试 preset="medium";如果你处于良好的网络环境且 H.264 导致更多延迟,可以尝试 order = ["RFX", "H.264"]。
无法使用 podman
podman 依赖于正确设置的 DBUS_SESSION_BUS_ADDRESS,例如 DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus。然而,xrdp 需要一个新的 dbus-session 并将其设置为临时位置。
解决方案是在你的 .bashrc 中重新设置它
.bashrc
export DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/$UID/bus export XDG_RUNTIME_DIR=/run/user/$UID