Xrdp
xrdp 是一个守护进程,支持微软的 远程桌面协议 (RDP)。它使用 Xvnc 或 xorgxrdp 作为后端。
安装
安装 xrdpAUR 软件包(或者选择 xrdp-gitAUR 以获取开发版本)。这仅支持 Xvnc 作为后端。
Xorg 后端
要使用 xorgxrdp 作为后端,安装 xorgxrdpAUR 软件包。
用法
首先,启动 xrdp
服务。您应该能够使用 RDP 客户端连接到主机的默认 RDP 端口 (3389)。如果成功,您将看到 xrdp 会话管理器窗口,您可以在其中选择 Xorg 或 Xvnc 会话,并提供用户身份验证的输入。会话管理器 UI 可以通过修改 /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 连接时,您可以再次访问同一会话。当您从会话窗口退出窗口管理器或桌面环境时,会话将关闭,下次将打开一个新会话。
技巧与提示
开机自启动
xrdpAUR 软件包包含 systemd 的服务文件。启用 xrdp.service
。
图形加速
对于 Xorg 会话,您可以通过安装 xorgxrdp-glamorAUR (用于 Intel 和 AMD GPU) 和 xorgxrdp-nvidiaAUR (用于 NVIDIA GPU) 来启用 OpenGL 和 Vulkan 图形加速。
声音
安装必要的 PulseAudio 模块,使用 pulseaudio-module-xrdpAUR。
对于 PipeWire 用户,安装 pipewire-module-xrdpAUR。
非 root 用户
在 Xwrapper.config
中包含以下行
/etc/X11/Xwrapper.config
allowed_users=anybody needs_root_rights=no
如果以上行不存在,来自 Remmina 等应用程序的远程桌面连接将以空白屏幕启动。
故障排除
光标周围的黑框
如果您遇到鼠标指针周围出现黑框,请创建带有 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
。这将影响所有用户。
断开连接后退出
如果您的 ~/.xinitrc
在 dbus_args
中设置了 --exit-with-session
,您可能会在断开连接后退出窗口。
尝试将 ~/.xinitrc
复制到 ~/.xrdpinitrc
,删除 --exit-with-session
,并更新 /etc/xrdp/startwm.sh
以调用 ~/.xrdpinitrc
而不是 ~/.xinitrc
。
直接编辑 ~/.xinitrc
以删除 --exit-with-session
可能会导致使用非 xrdp 会话时出现意外行为。
- 将 dbus-launch 作为标准 X 会话一部分运行的发行版应在 X 服务器启动并可用后,运行
dbus-launch --exit-with-session
,作为“主”X 客户端(通常是会话管理器或窗口管理器)的包装器。
带有桌面环境的黑屏
如果您遇到黑屏并且您使用桌面环境,这可能是 D-Bus 未正确初始化的结果。某些 DE(如 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
的引用。请参阅 此问题。
提示 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
项启动,您可以将会话上的 autostart 目录参数设置为仅使用全局 /etc/xdg/autostart
目录在 ~/.xinitrc
中。
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) ;;
没有声音
这可能是 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 或更高版本。然后将 XRDP_XORG_TOUCHPAD_SCROLL_HACK=yes
添加到 /etc/xrdp/sesman.ini
的 [SessionVariables]
部分。
有关详细信息,请参阅 上游 issue #150。
远程系统内的功能受限
用户远程登录系统时可能不具有与本地登录时相同的访问权限。可能需要对 polkit 权限策略进行额外配置以授予访问权限,包括访问挂载的驱动器或控制网络连接。
挂载的驱动器
有关远程访问挂载驱动器的权限,请参阅 udisks#Permissions。
NetworkManager
有关远程访问 NetworkManager 的权限,请参阅 NetworkManager#Set up PolicyKit permissions。