Arch Linux 升级 KDE Plasma 6.7 之后,本地桌面登录正常,但远程桌面(KRDP)无法登录,输入正确密码后认证失败。本文记录问题的排查过程、根因分析、以及两种修复方案。
问题现象
升级后从远程客户端连接 KRDP,输入正确密码后连接被拒绝。查看日志:
journalctl --user -b 0 -p err..warning -f
关键错误:
krdspserver[1202]: pam_unix(login:auth): authentication failure; logname=xxdl uid=1000 euid=1000 tty= ruser= rhost= user=xxdl
krdpserver[1202]: pam_authenticate failure: 身份验证服务无法检索神身份验证信息
- 本地通过 SDDM 登录完全正常
- SSH 登录也正常
- 只有 KRDP 远程桌面认证失败
排查过程
1. 确认 PAM 配置
首先检查 KRDP 使用的 PAM 服务名。通过查看 libKRdp.so 的符号:
strings /usr/lib/libKRdp.so | grep -i pam
输出:
pam_start
pam_authenticate
login
pam_start failure:
pam_authenticate failure:
int KRdp::pam_conv(int, const pam_message**, pam_response**, void*)
Attempting authenticating user with PAM
KRDP 有自己的 PAM 对话函数 KRdp::pam_conv,使用 pam_start("login", ...) 硬编码调用 login 服务。
跟踪 /etc/pam.d/login 的完整认证链:
/etc/pam.d/login
└─ pam_nologin.so (requisite)
└─ system-local-login
└─ system-login
└─ pam_shells.so (required)
└─ pam_nologin.so (requisite)
└─ system-auth
└─ pam_faillock.so (preauth)
└─ pam_systemd_home.so (optional, default=ignore)
└─ pam_unix.so (try_first_pass nullok)
└─ ...
2. 排除 PAM 配置变更
对比升级前后的 system-auth:
# 旧版(pambase 20250719-1)
tar xf /var/cache/pacman/pkg/pambase-20250719-1-any.pkg.tar.zst \
--strip-components=3 etc/pam.d/system-auth -O
# 新版(pambase 20260616-1)
cat /etc/pam.d/system-auth
两个版本完全相同。 pam_systemd_home.so 和 pam_faillock.so 在升级前就已经存在,不是新引入的。
3. 确认升级范围
查看 pacman.log 升级时间线:
6月16日: pambase 20250719-1 → 20260614-1
6月16日: freerdp 2:3.26.0-1 → 2:3.27.0-1 ← 同一次交易
6月18日: pambase 20260614-1 → 20260616-1
6月21日: freerdp 2:3.27.0-1 → 2:3.27.1-1
6月21日: krdp 6.6.5-1 → 6.7.0-1 ← 同一次交易
关键发现:krdp 从 6.6.5 升级到 6.7.0,同时 FreeRDP 从 3.26.0 升级到 3.27.x。
4. 锁定根因
在排查过程中,通过搜索引擎发现其他人也遇到了同样的问题:
Reddit r/cachyos: “KRDP broken after kde plasma 6.7”
“At first it would not authenticate, but making a local krdp login, the system login was disabled and authentication went fine.”
结合以上分析,根因确定:
krdp 6.7.0(Plasma 6.7)中 KRdp::pam_conv 自定义 PAM 对话函数存在 regression,导致密码未能正确传递给 pam_unix.so。这不是 PAM 配置变更导致的,而是 krdp 自身的 bug。
解决方案
方案 A:降级 krdp 和 freerdp(推荐)
这是最直接的修复方式,且不会影响系统其他部分——只有 plasma-meta(元包)依赖 krdp,降级不影响任何功能:
# 使用本地缓存降级
sudo pacman -U /var/cache/pacman/pkg/freerdp-2:3.26.0-1-x86_64.pkg.tar.zst \
/var/cache/pacman/pkg/krdp-6.6.5-1-x86_64.pkg.tar.zst
# 重启 krdp 服务
systemctl --user restart app-org.kde.krdpserver.service
如果缓存中没有旧包,可以从 Arch Linux Archive 获取。
方案 B:禁用 PAM,改用 KRDP 本地用户
编辑 ~/.config/krdpserverrc:
SystemUserEnabled=false
然后通过 系统设置 → 远程桌面 添加本地用户名和密码,重启 krdp 服务。
⚠️ 方案 B 绕过了系统密码,存在安全隐患,仅在方案 A 不可用时作为临时 workaround。
防止自动升级
在 /etc/pacman.conf 中临时忽略这两个包:
IgnorePkg = krdp freerdp
等上游修复后再移除这两行,正常升级。
后续监控
如何判断上游已修复?
1. 查看 KDE/krdp 提交记录
关注与 PAM 认证相关的 commit: https://github.com/KDE/krdp/commits/master
搜索关键词:pam、auth、conv、authenticate
2. 关注相关帖子
Reddit 原帖如果收到修复通知会更新: https://www.reddit.com/r/cachyos/comments/1u9wgqb/krdp_broken_after_kde_plasma_67
3. 定时检查 Arch 仓库
# 手动检查
checkupdates | grep -E "krdp|freerdp"
# 或设置 systemd timer 每日检查
当 krdp 推出 6.7.1 或更高版本,且 changelog 提及 PAM 修复时,即可移除 IgnorePkg 并正常升级。