Arch Linux 升级 KDE Plasma 6.7 之后,本地桌面登录正常,但远程桌面(KRDP)无法登录,输入正确密码后认证失败。本文记录问题的排查过程、根因分析、以及两种修复方案。
✅ 2026-08-05:问题已修复。上游在 krdp 6.7.4 中移除了
NoNewPrivileges(Bugzilla #521776),升级并清理 drop-in 后即可正常登录,详见文末更新。
问题现象
升级后从远程客户端连接 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. 锁定根因(⚠️ 2026-07-28 更新:此分析不准确,真正根因见文末)
在排查过程中,通过搜索引擎发现其他人也遇到了同样的问题:
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
等上游修复后再移除这两行,正常升级。
2026-07-28 更新:找到真正根因
2026-07-28 再次排查(krdp 已升级到 6.7.3,问题依旧),发现真正的根因不是 KRdp::pam_conv 内部 regression,而是 systemd service 中的 NoNewPrivileges=true。
真正根因
查看 /usr/lib/systemd/user/app-org.kde.krdpserver.service:
[Service]
NoNewPrivileges=true # ← 这才是元凶
NoNewPrivileges=true 阻止了进程获得任何新权限,导致 PAM 的 unix_chkpwd(setuid helper)无法运行,密码验证直接失败。
KDE Bugzilla 已有报告:#521776 — NoNewPrivileges breaks KRDP PAM login(2026-07-16 提交)。
新方案(推荐,不降级任何包)
用 systemd drop-in 覆盖 NoNewPrivileges:
mkdir -p ~/.config/systemd/user/app-org.kde.krdpserver.service.d
cat > ~/.config/systemd/user/app-org.kde.krdpserver.service.d/no-new-privs-fix.conf <<'EOF'
[Service]
NoNewPrivileges=false
EOF
systemctl --user daemon-reload
systemctl --user restart app-org.kde.krdpserver.service
验证后即可移除之前的 IgnorePkg,正常升级 krdp 和 freerdp。
2026-08-05 更新:上游已修复,升级到 6.7.4 即可
问题已解决。 krdp 6.7.4-1 已进入 Arch extra 仓库,官方修复了 NoNewPrivileges 回归。
上游修复
2026-07-16,KDE 提交 66a98cd6(David Edmundson,cherry-pick 到 Plasma/6.7 分支)回退了引入该问题的 “Set NoNewPrivileges on the krdpserver systemd service” 提交,理由:The PAM backend needs privs to check(PAM 后端需要特权来校验密码)。
验证
下载 Arch extra 仓库的 krdp-6.7.4-1-x86_64.pkg.tar.zst 检查,包内 usr/lib/systemd/user/app-org.kde.krdpserver.service 已无 NoNewPrivileges 行(6.7.3-1 中仍存在)。
现在的做法
# 1. 升级
sudo pacman -S krdp # 6.7.3-1 → 6.7.4-1
# 2. 清理本地 drop-in(上游已修复,不再需要)
rm -r ~/.config/systemd/user/app-org.kde.krdpserver.service.d
systemctl --user daemon-reload
systemctl --user restart app-org.kde.krdpserver.service
# 3. 移除 /etc/pacman.conf 中的 IgnorePkg = krdp freerdp(如有)
RDP 连接验证登录成功后即完成,无需任何 workaround。若升级后仍异常,可重建 drop-in(NoNewPrivileges=false)作为兜底。
状态时间线
- 2026-06-22:发现问题(krdp 6.7.0 升级后远程登录失败),最初误判为
KRdp::pam_convregression - 2026-07-16:上游提交
66a98cd6回退NoNewPrivileges,cherry-pick 到 Plasma/6.7 分支 - 2026-07-28:定位真正根因(systemd service 的
NoNewPrivileges=true阻止unix_chkpwd运行),用 drop-in 绕过 - 2026-08-05:krdp 6.7.4-1 进入 Arch extra 仓库,
NoNewPrivileges已移除,问题正式修复