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.sopam_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

搜索关键词:pamauthconvauthenticate

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 并正常升级。