fprint
来自 fprint 主页
- fprint 项目旨在填补 Linux 桌面的一项空白:对消费级指纹读取设备的支持。
其构想是利用某些笔记本电脑内置的指纹读取器,通过 PAM 进行登录。本文还将解释如何使用普通密码作为备份登录方法(出于多种原因,不建议仅使用指纹扫描仪)。
前提条件
您可以通过查看 支持设备列表 或 不支持设备列表 来确认您的设备是否受支持。要查看您拥有的是哪款设备,请输入
$ lsusb
lsusb 工具包含在 usbutils 软件包中。
安装
安装 fprintd 软件包。可能还需要安装 imagemagick。
某些设备需要不同分支的 libfprint,这些分支(尚未?)合并到主线 libfprint 中
- libfprint-tod — 用于触控式传感器。
- libfprint-elanmoc2 — 用于 ELAN
04f3:0c4c,等待 合并。
此列表并非详尽无遗。在 AUR 中可以找到针对其他设备的更多分支。
配置
上游建议 使用 S2Idle 睡眠而非 S3,但根据您的设备情况,S3 可能同样有效。
登录配置
- 如果您使用 GDM,登录菜单中已提供指纹选项(如果没有,请将自己添加到
input用户组)。您可以跳过本节! - 如果您使用 SDDM,请参阅 SDDM#Using a fingerprint reader。
将 pam_fprintd.so 作为 sufficient(充分)添加到 /etc/pam.d/system-local-login 的 auth 部分顶部
/etc/pam.d/system-local-login
auth sufficient pam_fprintd.so auth include system-login ...
这将首先尝试使用指纹登录,如果失败或在指定用户的主目录中未找到指纹签名,则继续进行密码登录。
您也可以用同样的方式修改 /etc/pam.d/{login,gdm,lightdm} 中的其他文件。
KDE 已经在 /etc/pam.d/kde-fingerprint 中配置了指纹认证,因此您无需编辑该文件。对于一个简单的可用配置(在 KDE Plasma 中先请求指纹,失败后再要求密码认证),只需将 /etc/pam.d/system-auth 中的以下行进行修改
-auth [success=3 default=ignore] pam_systemd_home.so auth [success=2 default=ignore] pam_fprintd.so auth [success=1 default=bad] pam_unix.so try_first_pass nullok
在 /etc/pam.d/ 的任何配置文件中将 pam_fprintd.so 添加为 sufficient 时,如果存在指纹签名,系统将仅提示指纹认证。如果您无法 Ctrl+c 取消指纹认证(由于缺乏 shell),这将导致无法使用密码。为了在图形界面中使用密码或指纹,请在所需文件的顶部添加以下行
auth sufficient pam_unix.so try_first_pass likeauth nullok auth sufficient pam_fprintd.so ...
这将提示输入密码;在空白字段中按下 Enter 将进入指纹认证。
如果您希望同时提示指纹和密码输入,可以使用 pam-fprint-grosshackAUR。对于某些不允许空白密码输入的图形程序(如 Gnome 内置的 polkit 代理),这可能是必要的。要使用此软件包,请在所需文件的顶部添加以下行
auth sufficient pam_fprintd_grosshack.so auth sufficient pam_unix.so try_first_pass nullok ...
创建指纹签名
在能够注册之前,您需要运行一个 认证代理。
要为某个手指添加签名,运行
$ fprintd-enroll
或者为所有手指创建新签名
$ fprintd-delete "$USER"
$ for finger in {left,right}-{thumb,{index,middle,ring,little}-finger}; do fprintd-enroll -f "$finger" "$USER"; done
系统将要求您扫描指定手指。请将右食指滑动五次。之后,签名将被创建在 /var/lib/fprint/ 中。
您也可以在没有认证代理的情况下进行注册
# fprintd-enroll user
要验证新创建的指纹,使用
$ fprintd-verify
更多信息请参阅 fprintd(1)。
限制注册
默认情况下,任何用户都可以在不提示密码或指纹的情况下注册新指纹。您可以使用 polkit 规则更改此行为。
Polkit 配置文件包含在两个位置
/etc/polkit-1/rules.d//usr/share/polkit-1/rules.d/
/usr/share/polkit-1/rules.d/ 下的文件,因为它们在更新时会被覆盖。请先将它们复制到 /etc/polkit-1/rules.d/。在以下示例中,只有 root 用户可以注册指纹
/etc/polkit-1/rules.d/50-net.reactivated.fprint.device.enroll.rules
polkit.addRule(function (action, subject) {
if (action.id == "net.reactivated.fprint.device.enroll") {
return subject.user == "root" ? polkit.Result.YES : polkit.Result.NO
}
})
故障排除
无可用设备
如果无法找到您的 支持设备,或提示设备已被占用(in use),请检查 journal 中的 fprintd.service 日志。
您可能会发现如下日志条目
fprintd[2936592]: Corrupted message received fprintd[2936592]: Ignoring device due to initialization error: unsupported firmware version
请确保使用 Fwupd 更新设备的固件。
暂停唤醒后显示登录提示时 GDM 卡死
此问题在 libfprint 仓库 中有描述。开发者的回答是
- 我目前的猜测是我们是在蓝牙 USB 适配器初始化时将其断开连接。然后,当 btusb 尝试加载固件时,一切都卡住了(这有一个 10 秒的超时,解释了我们看到的略低于 10 秒的卡死)。像这样断开蓝牙适配器在切换 rfkill 开关时是预期会发生的,所以这是正常的。只是设备突然断开连接的情况似乎没有被正确处理,导致了超时。
建议的修复方法是 创建
/etc/modprobe.d/bluetooth-blacklist.conf
blacklist btusb
或者直接执行
# rmmod btusb
这样它就不应该尝试初始化该设备。
暂停设备时出现意外错误
此问题在 libfprint 仓库 中有描述
- 您需要将笔记本电脑设置为不使用 Suspend-to-RAM,而使用 s2idle。您可能需要将 BIOS 切换到“Windows 模式”。
指纹认证在 Polkit 代理中未生效
在将指纹规则添加到 Linux PAM 后,指纹识别仅对 SDDM 和 sudo 有效,但对 polkit 无效。
将 50-default.rules 文件复制到 /etc/polkit-1/rules.d/,并将组名 wheel 更改为您的用户组。
# cp /usr/share/polkit-1/rules.d/50-default.rules /etc/polkit-1/rules.d/
/etc/polkit-1/rules.d/50-default.rules
polkit.addAdminRule(function(action, subject) {
return ["unix-group:wheel"];
});
Debug
使用以下环境变量和命令行标志
# G_MESSAGES_DEBUG=all /usr/lib/fprintd -t
从睡眠恢复后 fprintd 在指纹读取设备初始化之前启动
创建以下 udev 规则以启用 USB 设备持久化,将 ID 替换为通过 lsusb 找到的指纹读取器 ID
/etc/udev/rules.d/01-fingerprint.rules
ACTION=="add", SUBSYSTEM=="usb", DRIVERS=="usb", ATTRS{idVendor}=="06cb", ATTRS{idProduct}=="00fc", ATTR{power/persist}="1", RUN="/usr/bin/chmod 444 %S%p/../power/persist"
在 fprintd 仍在运行时进入睡眠会导致 fprintd 崩溃
fprintd 在成功登录后会等待 30 秒才退出,因此在此期间进入睡眠可能会导致 fprintd 崩溃。如果发生这种情况,请创建并 启用 以下 systemd 服务
/etc/systemd/system/kill-fprintd.service
[Unit] Description=Kill fprintd before sleep Before=sleep.target [Service] ExecStart=killall fprintd [Install] WantedBy=sleep.target
注册成功但验证失败
某些触控式指纹读取器生成的图像太小,导致 fprint 的算法无法正常工作。一个常见的解决方法是用“滑动”代替“触摸”传感器,但生成优质图像的滑动速度可能有所不同。有些传感器需要慢速滑动,有些则需要快速滑动。这里有一些关于 优质图像应具有的样子 的技巧。
如果您想尝试不同的速度以查看哪个能生成更好的图像,可以尝试使用脚本 examples/img-capture 导出图像,并将其与上面的示例进行比较(您需要从源代码编译 libfprint)。
另请参阅 https://gitlab.freedesktop.org/libfprint/libfprint/-/issues/174
无法以用户身份注册
如果您收到类似 EnrollStart failed: GDBus.Error:net.reactivated.Fprint.Error.PermissionDenied: Not Authorized: net.reactivated.fprint.device.enroll 的错误,请确保 您的认证代理(用于提示被注册用户的密码)运行正常。不过,可以通过以 root 身份运行命令来绕过此问题
sudo fprintd-enroll "$(whoami)"
重要的是要传递普通用户的名称,否则指纹将被关联到 root 用户,这对于大多数用例来说是反效果的。
如果您收到“enroll-duplicate”错误,说明该手指已经以 root 身份注册。您可以注册另一个手指,或使用 fprintd-delete 从 root 用户中删除该手指。
之后,您应该能够以普通用户身份运行 fprintd-verify 而不会出现权限错误。