
小米Book Pro 14 Linux使用体验
解决小米Book Pro 14 Linux使用中的一些问题
入手这台 Xiaomi Book Pro 14 的理由其实挺简单:我已经有一台 MacBook Pro 了,日常用着很顺手,但总有些事是 Mac 干不了、或者干起来别扭的。我需要一台 x86 的轻薄本,来补上那些“只有 x86 才好办”的活儿。
作为一个不折腾不舒服的人,拿到新机器的第一件事,自然是给它装上 Arch Linux。过程中踩了几个坑,也把指纹这个我从没用过的功能认真折腾了一遍,现在整理出来,给自己留个记录,也给遇到类似问题的人一个参考。
我这台的配置先放在这儿:
- SoC:Intel Ultra X7 358H
- 内存:32GB LPDDR5x 9600MT/s(板载)
- GPU:Intel Arc B390
问题一:屏幕花屏
刚装好系统就发现屏幕会花。查了一圈,原因是 Intel 的 Panel Self Refresh 技术。
解决方法也很直接,在内核参数里加上这一行就行:
xe.enable_psr=0问题二:键盘不识别
这个问题更诡异一点:在 BIOS 和 GRUB 里面键盘明明能用,一进入系统,键盘就完全没反应了。装系统的时候卡在这一步会非常难受。
解决方案同样是加内核参数:
i8042.nopnp=1 i8042.dumbkbd=1屏幕和键盘搞定之后,系统基本就可用了。接下来是我花时间最多的部分——指纹。
指纹:这次折腾的重头戏
坦白说,我之前从没用过带指纹的设备,所以这一块我摸索得比较细,也踩了不少坑,值得单独写一写。
为什么 sudo 不能像 macOS 那样弹出指纹 GUI?
这是这次折腾里最让我不爽的地方。macOS 上 sudo 可以用 Touch ID,为什么 Linux 就不行?
不是“没人想过”,而是架构本身就不一样。
sudo 的认证链路是这样的:
sudo → PAM → 终端会话或 askpass而 KDE 那个漂亮的指纹认证弹窗,走的是另一条路:
应用 → Polkit → KDE Polkit Agent → PAM → fprintd那个 GUI 是 Polkit agent 提供的,不是 PAM 自己弹出来的,也不是 sudo 自带的。PAM 模块只能参与认证流程,没法凭空把终端里的 sudo 变成一个 KDE 风格的身份验证弹窗。
sudo -A 配合 SUDO_ASKPASS 确实能弹出图形密码框,但那依然是 sudo 自己的 askpass 路径,跟 KDE Polkit agent 不是一回事。所以它顶多让“输密码”这一步变成 GUI,指纹那套体验是带不进来的。
macOS 能做到,是因为 Apple 把 sudo、PAM、Touch ID、Secure Enclave、LocalAuthentication 这些组件从系统层面就集成到了一起。Linux 这边,这些组件分属不同项目,天然就不会有一致的体验。
pam_fprintd 的关键限制:PAM 栈是串行的
pam_fprintd 还有一个很根本的限制:在普通的 PAM 栈里,它和密码认证是串行执行的。
我一开始理想中的体验是这样的:
同一个 sudo 提示下,同时等我输密码和按指纹,哪个先完成就用哪个。
但实际上做不到。登录管理器可以用更复杂的方式启多条 PAM 会话来模拟并行,但普通的 sudo 并不会这么干。
所以现实选择只能在下面几种体验里挑:
- 方案 A:先指纹,失败后密码
- 方案 B:先密码,空回车后指纹
- 方案 C:只用 Polkit GUI,不在 sudo 上强求指纹
- 方案 D:用第三方 hack 模块(不推荐,别拿 root 认证开玩笑)
我最后选的是方案 B,但方案 A 也试过,先说说它为什么翻车了。
方案 A:先指纹,失败后密码(翻车记录)
一开始的直觉配置是这样的,/etc/pam.d/sudo:
#%PAM-1.0
auth sufficient pam_fprintd.so max-tries=3 timeout=8
auth include system-auth
account include system-auth
session include system-auth逻辑上看起来没毛病:先试指纹,成功就直接过,失败再让你输密码。
但实际用起来就出问题了。我故意让指纹识别失败,然后输入正确的密码,sudo 还是过不去。日志里出现了这样的东西:
pam_unix(sudo:auth): conversation failed
pam_unix(sudo:auth): auth could not identify password for [...]
pam_faillock(sudo:auth): Consecutive login failures ... account temporarily locked同时 fprintd 那边也在报:
Device was already claimed
Verification was in progress, stopping it看起来是 sudo、终端 PAM conversation、pam_fprintd 和后续的密码栈之间交互状态乱了。指纹失败之后,密码 fallback 并没有干净利落地接上,还顺手触发了 faillock 的失败计数,导致账号被暂时锁定。
这类问题最危险的地方在于,你改的是 root 提权入口。如果把 /etc/pam.d/sudo 改坏了,又没有别的 root 通道,就很容易把自己锁在外面。
我当时恢复的方法,是走还能用的 Polkit:
pkexec sh -c 'cat > /etc/pam.d/sudo <<EOF
#%PAM-1.0
auth include system-auth
account include system-auth
session include system-auth
EOF
faillock --user 用户名 --reset
systemctl restart fprintd
'这个回滚思路建议记一下:先把 sudo 恢复到 Arch 默认的密码路径,再清理 faillock,最后重启 fprintd 释放可能残留的设备占用。关键时刻能救命。
方案 B:先密码,空回车后指纹(目前采用的方案)
后来换了一种思路:正常情况就是普通的 sudo 密码提示,如果直接按 Enter 提交空密码,再进入指纹验证。
当前的 /etc/pam.d/sudo 配置:
#%PAM-1.0
# 先提示输密码,按 Enter 空密码则尝试指纹
auth sufficient pam_unix.so try_first_pass likeauth nullok
# 避免在非 tty 的后台 sudo 里弹指纹
auth [success=1 default=ignore] pam_succeed_if.so service in sudo:su:su-l tty in :unknown
-auth sufficient pam_fprintd.so max-tries=3 timeout=8
# Arch 默认的 fallback
auth include system-auth
account include system-auth
session include system-auth交互效果是这样的:
[sudo] password for user:想输密码就直接输,想用指纹就空回车,这时候会变成:
Place your right index finger on the fingerprint reader这个方案比“先指纹后密码”更符合终端里的直觉,但它也有自己的小毛病。
方案 B 的坑:空回车可能留下失败记录
空回车这一步,本质上是先经过了 pam_unix.so。从 pam_unix 的视角看,空密码不是正确密码,所以它会先产生一次认证失败记录,然后 PAM 流程才走到 pam_fprintd。
实际检查 faillock 的时候能看到类似这样的记录:
user:
When Type Source Valid
2026-05-08 ... TTY /dev/pts/1 V也就是说,即使后面指纹认证通过了,空回车这一步也可能被当成一次失败尝试记下来。
所以用这个方案的话,有几点要注意:
1. faillock 的失败阈值别设太低。 2. 调试 PAM 的时候一定留一个可用的 root 后门,比如当前还能用的 pkexec。 3. 连续失败之后记得检查:
faillock --user "$USER"必要的时候手动重置:
faillock --user "$USER" --reset另外说一句,如果追求最稳的图形提权体验,日常还是优先用 Polkit,不用把所有事情都压在 sudo 上。
KWallet:为什么不能用指纹直接解锁
这是另一个容易误解的地方。
kwallet-pam 的作用是,在你用密码登录的时候,把登录密码传给 KWallet,用同一个密码自动解锁钱包。
日志里有这样一句:
pam_kwallet5(plasmalogin-autologin:auth): Empty or missing password, doing nothing这句话已经把问题说清楚了:自动登录或者指纹登录,都没有提供“用户密码”这个明文材料,KWallet 拿不到它需要的密钥。
指纹认证只回答一个问题:
这个人是不是这个用户?
KWallet 解密需要的是另一个问题的答案:
用来打开钱包的密钥或密码是什么?
指纹设备不会把用户的登录密码吐出来,它只告诉系统认证是否成功。所以,KWallet 没有办法单靠指纹解锁。
可选的解决思路有几个:
1. 关掉自动登录,用密码登录,并且让 KWallet 密码和登录密码保持一致。 2. 接受现实,首次进桌面后手动输一次 KWallet 密码。 3. 降低钱包安全性,比如用空密码钱包——但这绝对不建议,尤其是存重要密钥的时候。
所以这里不是 KDE 没接好,而是“认证”和“解密”在性质上就是两回事。
fprintd 设备占用问题
折腾过程中还遇到过这种报错:
Device was already claimed
Verification was in progress, stopping it这通常说明上一次验证没干净结束,或者好几个认证请求同时在抢同一个指纹设备。
处理方法也不复杂:
systemctl restart fprintd如果普通用户权限不够,用确认可用的 Polkit 来操作:
pkexec systemctl restart fprintd这也是为什么我不建议把太多认证入口都配置成自动去抢指纹。指纹设备一次只能服务一个验证请求,多个 PAM 或 Polkit 请求搅在一起的时候,体验会变得非常诡异。
最终状态整理
折腾完一圈,现在这台机器的指纹和认证相关配置是这样的:
- fprintd:能正常识别 Goodix 设备,已录入右手食指
- KDE 用户设置:可以通过 kcm_users 管理指纹
- Polkit:优先指纹,失败后回退密码
- kio-admin:已安装,可以用
admin://做图形化 root 文件操作 - sudo:先密码,空回车后指纹,最多尝试 3 次
- Plasma Login Manager:PAM 已接入指纹,但自动登录会绕过
- KWallet:不能单靠指纹解锁
总结
这台小米 Book Pro 14 的 Linux 兼容性比我想象中好很多,几个问题都有清晰的原因和解决路径,整体用下来挺顺手。
还有一个感受是,现在调系统比以前快太多了。以前遇到问题要翻一堆 ArchWiki 和 man 文档,现在可以直接问 ChatGPT“xxx 问题怎么解决”,效率完全不一样。这次连 OpenAI Codex 也用上了,整体调试过程比过去顺畅了不止一个量级。