跳转至内容

Xrdp

来自 ArchWiki

xrdp 是一个支持微软 远程桌面协议 (RDP) 的守护进程。它使用 Xvnc 或 xorgxrdp 作为后端。

安装

安装 xrdpAUR 软件包。此版本仅支持 Xvnc 作为后端。

Xorg 后端

若要改用 xorgxrdp 作为后端,请 安装 xorgxrdpAUR 软件包。

用法

首先,启动 xrdp 服务。你应该能够使用 RDP 客户端连接到主机的默认 RDP 端口 (3389)。如果连接成功,你将看到 xrdp 会话管理器窗口,允许你在 XorgXvnc 会话之间进行选择,并提供用户身份验证输入。可以通过修改 /etc/xrdp/xrdp.ini 来高度自定义会话管理器的界面。

用于启动 XorgXvnc 显示服务器的参数可以在 /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 来启用 OpenGLVulkan 图形加速。

声音

使用 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 portsssh(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-x11dbus-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.confNoUpgrade 中。如果你只使用 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-xrdppulseaudio-module-xrdp。记得注销并重新登录以使它们生效

这也可能是 loginctl 问题的一个症状,因此请尝试上方的修复方法。在系统 日志中可能会遇到以下错误

Failed to load module "module-x11-publish" (argument: "display=:10.0 xauthority="): initialization failed.

这是由于 systemd 启动 PulseAudio 不正确导致的结果。一种解决方法是禁用为你自己或所有用户的 用户单元文件 pulseaudio.servicepulseaudio.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

参见

  • TigerVNC - VNC 是 RDP 的一种替代方案,这里也被用作后端。
  • freerdp 是 rdesktop 的一个分支,支持 RDP 7.1 功能,包括网络级身份验证 (NLA)。它主要由 xfreerdp 客户端组成。此外,freerdp-shadow-cli 命令提供了一种快速便捷的启动 RDP 服务器的方法。

© . This site is unofficial and not affiliated with Arch Linux.

Content is available under GNU Free Documentation License 1.3 or later unless otherwise noted.