Arch Linux + KDE Plasma + Wayland:解决 RustDesk 远程桌面无法控制的问题,并实现开机自动锁屏

本文由 AI 辅助整理,根据实际故障排查过程编写,记录 Arch Linux + KDE Plasma + Wayland 环境下 RustDesk 远程桌面故障的排查、修复及自动锁屏配置过程。

一、问题背景

最近在一台 Arch Linux 机器上部署 RustDesk,发现无法正常使用远程桌面功能。

RustDesk 提示:

1
2
远程设备上的桌面门户缺少屏幕共享或远程控制所需的功能,
可能没有安装它的后端。

这类问题通常与 Linux 桌面环境的 Portal、PipeWire、Wayland 会话及远程桌面权限有关。

与传统 X11 不同,Wayland 对屏幕捕获和远程输入有更严格的权限管理。应用程序不能简单地直接读取桌面画面,而需要通过桌面门户(XDG Desktop Portal)等组件申请相应能力。

因此,排查重点放在以下几个组件:

  • KDE Plasma:桌面环境。
  • XDG Desktop Portal:桌面门户接口。
  • KDE Portal Backend:KDE 桌面门户后端。
  • PipeWire:屏幕内容传输。
  • WirePlumber:PipeWire 会话管理。
  • RustDesk:远程桌面服务及客户端。

二、环境信息

本次故障环境如下:

项目 版本或配置
操作系统 Arch Linux
桌面环境 KDE Plasma 6
显示协议 Wayland
RustDesk 1.5.0
xdg-desktop-portal 1.22.1
xdg-desktop-portal-kde 6.8.1
xdg-desktop-portal-gtk 1.15.3
PipeWire 1.6.10
WirePlumber 0.5.18
登录管理器 Plasma Login Manager

系统通过 SSH 远程管理,排查过程中尽量避免重启桌面服务或机器,以免丢失唯一的管理通道。

三、检查桌面门户配置

首先检查用户级 Portal 配置。

配置文件:

1
~/.config/xdg-desktop-portal/portals.conf

配置内容:

1
2
[preferred]
default=kde

这里指定 KDE 作为默认 Portal 后端。

需要注意,Portal 不同接口可能由不同后端实现,并不意味着所有接口都必须由同一个后端处理。

本次环境同时安装了 KDE 和 GTK Portal 后端。

四、确认实际使用的登录管理器

最初尝试通过 SDDM 配置自动登录:

1
2
3
4
5
# /etc/sddm.conf.d/autologin.conf

[Autologin]
User=kdeuser
Session=plasma

但检查发现:

1
systemctl status sddm

返回:

1
Unit sddm.service could not be found

说明系统并没有使用 SDDM。

实际使用的是 Plasma Login Manager。

因此,改为创建:

1
/etc/plasmalogin.conf.d/autologin.conf

配置内容:

1
2
3
[Autologin]
User=kdeuser
Session=plasma.desktop

其中:

  • User:指定自动登录的 Linux 用户。
  • Session:指定 Plasma Wayland 会话。

之后通过以下命令检查会话:

1
loginctl list-sessions

以及:

1
loginctl show-session <SESSION_ID>

重点检查:

1
2
3
4
Name=kdeuser
Type=wayland
Class=user
State=active

确认图形用户会话已经正常建立。

五、检查 PipeWire、WirePlumber 和 Portal

由于 RustDesk 需要使用桌面门户和 PipeWire 实现屏幕共享,因此需要确认这些服务运行在正确的用户会话中。

本次桌面用户 UID 为 1000,SSH 登录使用 root。

特别注意:不能直接使用 root 的 systemctl --user 检查桌面用户服务,否则检查的不是目标用户的服务。

通过以下方式检查:

1
2
3
4
runuser -u kdeuser -- env \
XDG_RUNTIME_DIR=/run/user/1000 \
DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus \
systemctl --user status pipewire.service

检查 WirePlumber:

1
2
3
4
runuser -u kdeuser -- env \
XDG_RUNTIME_DIR=/run/user/1000 \
DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus \
systemctl --user status wireplumber.service

检查 Portal:

1
2
3
4
runuser -u kdeuser -- env \
XDG_RUNTIME_DIR=/run/user/1000 \
DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus \
systemctl --user status xdg-desktop-portal.service

最终确认:

1
2
3
pipewire.service                 active (running)
wireplumber.service active (running)
xdg-desktop-portal.service active (running)

同时检查进程:

1
2
ps -ef | grep -E \
'pipewire|wireplumber|xdg-desktop-portal'

可以看到:

  • PipeWire 已启动。
  • WirePlumber 已启动。
  • xdg-desktop-portal 已启动。
  • xdg-desktop-portal-kde 后端已启动。
  • xdg-desktop-portal-gtk 后端也已启动。

此前日志中出现过:

1
Failed to connect to PipeWire: Couldn't connect to PipeWire

但这是历史启动日志,并非本次检查时的当前错误。

另外,日志中的:

1
2
RTKit error:
org.freedesktop.DBus.Error.ServiceUnknown

属于实时调度服务不可用的警告。在本次环境中,PipeWire 已经正常运行,不能仅凭这条警告认定 PipeWire 故障。

六、配置 Plasma Login Manager 自动登录

为了让机器开机后能够自动建立 KDE 用户会话,使 PipeWire、Portal 和 RustDesk 等组件正常启动,配置自动登录。

创建配置目录:

1
mkdir -p /etc/plasmalogin.conf.d

创建配置文件:

1
2
3
4
5
cat > /etc/plasmalogin.conf.d/autologin.conf <<'EOF'
[Autologin]
User=kdeuser
Session=plasma.desktop
EOF

配置完成后,机器开机即可自动登录指定用户并进入 Plasma 桌面。

自动登录的安全问题

自动登录意味着任何能够接触机器的人,都可能在开机后直接进入该用户的桌面。

尤其需要注意:

  • 用户目录中的文件可能被访问。
  • 浏览器登录状态可能被利用。
  • 用户保存的 SSH 密钥可能面临风险。
  • 如果 RustDesk 配置了无人值守访问,远程访问风险也会增加。

因此,自动登录并不意味着应该让桌面一直保持解锁状态。

本次采用的方案是:

开机自动登录 → Plasma 初始化 → 检查远程服务 → 自动锁屏 → 通过 RustDesk 远程解锁。

七、验证 KDE 锁屏功能

在配置自动锁屏之前,先验证 KDE 自身的锁屏接口是否正常。

通过 SSH 执行:

1
2
3
4
runuser -u kdeuser -- env \
XDG_RUNTIME_DIR=/run/user/1000 \
DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus \
qdbus6 org.freedesktop.ScreenSaver /ScreenSaver Lock

命令执行后,KDE 桌面立即锁屏。

随后通过 RustDesk 连接远程机器,可以看到 KDE 锁屏界面,并输入用户密码成功解锁。

<此处可插入 RustDesk 锁屏界面截图>

这一步非常重要。

它验证了:

  1. SSH 可以通过用户 D-Bus 调用 KDE 锁屏接口。
  2. KDE 锁屏功能正常。
  3. RustDesk 可以连接锁屏状态下的桌面。
  4. 可以通过 RustDesk 输入密码解锁。

至此,自动锁屏方案具备了基本条件。

八、实现开机后自动锁屏

如果仅仅使用:

1
2
sleep 60
qdbus6 org.freedesktop.ScreenSaver /ScreenSaver Lock

存在一定风险。

例如:

  • PipeWire 尚未启动。
  • Portal 尚未启动。
  • RustDesk 尚未启动。
  • RustDesk 用户级远程桌面进程尚未启动。

如果此时直接锁屏,可能导致远程连接不可用。

因此,需要增加服务检查逻辑。

1. RustDesk 实际进程结构

首先检查 RustDesk:

1
ps -eo user,pid,args | grep -i '[r]ustdesk'

本次环境观察到的进程结构:

1
2
3
4
5
6
7
8
9
10
root  /usr/bin/rustdesk --service

root sudo -E XDG_RUNTIME_DIR=/run/user/1000 \
-u kdeuser /usr/share/rustdesk/rustdesk --server

kdeuser /usr/share/rustdesk/rustdesk --server

kdeuser /usr/share/rustdesk/rustdesk --tray

kdeuser /usr/share/rustdesk/rustdesk --cm

其中:

进程 作用
rustdesk –service 系统级服务
rustdesk –server 用户级远程桌面服务
rustdesk –tray 桌面托盘
rustdesk –cm RustDesk 子进程

系统服务状态:

1
systemctl status rustdesk

确认:

1
Active: active (running)

因此,自动锁屏脚本不仅检查 RustDesk 系统服务,还检查用户级 --server 进程。

2. 完整自动锁屏脚本

脚本实现以下保护:

  • 检查当前运行用户。
  • 检查 Wayland 会话。
  • 检查用户 D-Bus。
  • 检查 PipeWire。
  • 检查 WirePlumber。
  • 检查 Portal。
  • 检查 PipeWire Socket。
  • 检查 RustDesk 系统服务。
  • 检查 RustDesk 用户级 Server 进程。
  • 最多等待 180 秒。
  • 服务未就绪则放弃锁屏。
  • 锁屏前再次检查关键服务。
  • 记录运行日志。

创建目录:

1
2
install -d -o kdeuser -g kdeuser \
/home/kdeuser/.config/autostart-scripts

创建脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
cat > /home/kdeuser/.config/autostart-scripts/lock-after-login.sh <<'EOF'
#!/bin/bash

# KDE Plasma 自动锁屏保护脚本
# Arch Linux + KDE Plasma 6 + Wayland

set -u

USER_ID=1000
RUNTIME_DIR="/run/user/${USER_ID}"
LOG_DIR="/home/kdeuser/.local/state"
LOG_FILE="${LOG_DIR}/lock-after-login.log"

MAX_WAIT=180
CHECK_INTERVAL=5
INITIAL_DELAY=15

mkdir -p "$LOG_DIR"
chmod 700 "$LOG_DIR"

log() {
echo "[$(date '+%F %T')] $*" >> "$LOG_FILE"
}

log "========== 自动锁屏检查开始 =========="

# 1. 用户检查
if [ "$(id -u)" != "$USER_ID" ]; then
log "ERROR: 当前用户不匹配,退出"
exit 1
fi

# 2. Wayland 检查
if [ -z "${WAYLAND_DISPLAY:-}" ]; then
log "ERROR: 未检测到 Wayland 会话,退出"
exit 1
fi

# 3. D-Bus 检查
if [ ! -S "${RUNTIME_DIR}/bus" ]; then
log "ERROR: D-Bus Socket 不存在,退出"
exit 1
fi

export XDG_RUNTIME_DIR="$RUNTIME_DIR"
export DBUS_SESSION_BUS_ADDRESS="unix:path=${RUNTIME_DIR}/bus"

# 4. 锁屏命令检查
if [ ! -x /usr/bin/qdbus6 ]; then
log "ERROR: qdbus6 不存在,退出"
exit 1
fi

# 5. 等待桌面初始化
sleep "$INITIAL_DELAY"

# 6. 等待各项服务就绪
ELAPSED=0
READY=0

while [ "$ELAPSED" -lt "$MAX_WAIT" ]; do

PIPEWIRE_OK=0
WIREPLUMBER_OK=0
PORTAL_OK=0
PIPEWIRE_SOCKET_OK=0
RUSTDESK_SERVICE_OK=0
RUSTDESK_SERVER_OK=0

systemctl --user is-active --quiet pipewire.service \
&& PIPEWIRE_OK=1

systemctl --user is-active --quiet wireplumber.service \
&& WIREPLUMBER_OK=1

systemctl --user is-active --quiet xdg-desktop-portal.service \
&& PORTAL_OK=1

[ -S "${RUNTIME_DIR}/pipewire-0" ] \
&& PIPEWIRE_SOCKET_OK=1

systemctl is-active --quiet rustdesk.service \
&& RUSTDESK_SERVICE_OK=1

pgrep -u "$USER_ID" -f \
'^/usr/share/rustdesk/rustdesk --server$' >/dev/null \
&& RUSTDESK_SERVER_OK=1

if [ "$PIPEWIRE_OK" -eq 1 ] &&
[ "$WIREPLUMBER_OK" -eq 1 ] &&
[ "$PORTAL_OK" -eq 1 ] &&
[ "$PIPEWIRE_SOCKET_OK" -eq 1 ] &&
[ "$RUSTDESK_SERVICE_OK" -eq 1 ] &&
[ "$RUSTDESK_SERVER_OK" -eq 1 ]; then

READY=1
break
fi

log "等待服务:PipeWire=${PIPEWIRE_OK} WirePlumber=${WIREPLUMBER_OK} Portal=${PORTAL_OK} PipeWireSocket=${PIPEWIRE_SOCKET_OK} RustDeskService=${RUSTDESK_SERVICE_OK} RustDeskServer=${RUSTDESK_SERVER_OK}"

sleep "$CHECK_INTERVAL"
ELAPSED=$((ELAPSED + CHECK_INTERVAL))
done

# 7. 超时保护
if [ "$READY" -ne 1 ]; then
log "ERROR: 等待 ${MAX_WAIT} 秒后服务仍未就绪,放弃锁屏"
exit 1
fi

# 8. 锁屏前再次检查
if [ ! -S "${RUNTIME_DIR}/bus" ] ||
[ ! -S "${RUNTIME_DIR}/pipewire-0" ] ||
! systemctl is-active --quiet rustdesk.service ||
! pgrep -u "$USER_ID" -f \
'^/usr/share/rustdesk/rustdesk --server$' >/dev/null; then

log "ERROR: 锁屏前检查失败,放弃锁屏"
exit 1
fi

# 9. 执行锁屏
if /usr/bin/qdbus6 \
org.freedesktop.ScreenSaver \
/ScreenSaver Lock; then

log "SUCCESS: 自动锁屏命令执行成功"
else
log "ERROR: KDE 自动锁屏失败"
exit 1
fi

log "========== 自动锁屏检查结束 =========="
EOF

设置权限:

1
2
3
4
5
chown kdeuser:kdeuser \
/home/kdeuser/.config/autostart-scripts/lock-after-login.sh

chmod 700 \
/home/kdeuser/.config/autostart-scripts/lock-after-login.sh

KDE Plasma 会在用户登录时执行:

1
~/.config/autostart-scripts/

目录中的启动脚本。

因此,不需要额外创建 systemd 服务。

3. 查看运行日志

自动锁屏脚本的日志位置:

1
/home/kdeuser/.local/state/lock-after-login.log

查看日志:

1
tail -f /home/kdeuser/.local/state/lock-after-login.log

如果所有服务正常,最终应该看到:

1
SUCCESS: 自动锁屏命令执行成功

如果服务在 180 秒内没有全部就绪,则会记录错误并放弃锁屏。

九、如何取消自动锁屏

如果出现 RustDesk 无法连接、无法解锁等问题,可以通过 SSH 删除自动启动脚本:

1
rm -f /home/kdeuser/.config/autostart-scripts/lock-after-login.sh

这样后续登录就不会再自动锁屏。

注意:删除脚本不会取消 Plasma Login Manager 的自动登录配置。

如果需要同时取消自动登录,可以删除:

1
rm -f /etc/plasmalogin.conf.d/autologin.conf

之后重新启动机器,就会恢复正常的登录界面。

十、最终方案与注意事项

整个流程如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
         电脑开机
|
v
Plasma Login Manager
|
v
自动登录用户
|
v
KDE Plasma
|
v
初始化桌面相关服务
|
v
执行自动锁屏脚本
|
v
检查 PipeWire / Portal
|
v
检查 RustDesk 服务
|
v
等待服务就绪
|
+-----+-----+
| |
检查成功 检查失败
| |
v v
自动锁屏 放弃锁屏
|
v
RustDesk 远程连接
|
v
输入用户密码解锁

安全注意事项

  1. 自动登录仍然绕过了开机时的本地用户密码验证,物理接触机器的人仍有机会访问桌面。
  2. 自动锁屏并不能代替磁盘加密。如果设备丢失,未加密磁盘上的数据仍可能被读取。
  3. RustDesk 无人值守访问应设置独立的强密码,并限制不必要的访问权限。
  4. 自动锁屏脚本检查的是本机服务状态,并不能证明外部网络已经可以连接 RustDesk。
  5. 首次重启测试时,建议保留 SSH 管理通道,不要关闭唯一的远程管理入口。

最后说明: 本次排查已经实际验证了 KDE 通过 D-Bus 锁屏,以及 RustDesk 连接锁屏界面后输入密码解锁的功能。自动锁屏脚本也已完成配置方案,但完整的开机自动登录、服务检查、延迟锁屏流程仍需要通过一次实际重启测试来确认。


总结

这次问题的关键不只是安装 RustDesk 或 PipeWire,而是确保 Wayland 桌面环境、Portal、PipeWire 和 RustDesk 都在正确的用户会话中运行。

对于需要无人值守运行的 Linux 桌面主机,可以考虑采用:

自动登录 + 服务就绪检查 + 自动锁屏 + RustDesk 远程解锁。

这样既能减少开机后人工干预,也能避免桌面长期处于未锁定状态。