前言
Howdy 是 Linux 上的 Windows Hello 替代方案,可以通过摄像头进行人脸识别来验证 sudo 权限和系统登录。但是在国内网络环境下安装会踩不少坑,本文记录在 Ubuntu 24.04 上的完整安装过程。
环境信息
| 项目 | 版本 |
|---|---|
| 操作系统 | Ubuntu 24.04.4 LTS (noble) |
| 内核 | 6.17.0-35-generic |
| 架构 | x86_64 |
| Python | 3.12.3 |
| 摄像头 | SunplusIT HD Webcam(普通 RGB,非 IR) |
| 网络 | 位于中国深圳,本地 VPN 代理(端口 7897) |
安装步骤
第一步:添加 Howdy PPA
bash
sudo add-apt-repository ppa:boltgolt/howdy
sudo apt update
第二步:安装 Howdy 及依赖
bash
sudo apt install -y libopenblas-dev # Howdy 推荐的优化库
sudo apt install -y howdy
复制专用 一行装完:
bash
sudo apt install -y libopenblas-dev howdy
此时不要以为安装完了就直接用 --- 安装脚本里 pip install dlib 那一步在国内大概率会失败。
第三步:配置 pip 国内镜像
先给当前用户配:
bash
mkdir -p ~/.config/pip
cat > ~/.config/pip/pip.conf << 'EOF'
[global]
index-url = https://pypi.tuna.tsinghua.edu.cn/simple
trusted-host = pypi.tuna.tsinghua.edu.cn
EOF
复制专用 一行写入:
bash
mkdir -p ~/.config/pip && printf '[global]\nindex-url = https://pypi.tuna.tsinghua.edu.cn/simple\ntrusted-host = pypi.tuna.tsinghua.edu.cn\n' > ~/.config/pip/pip.conf
关键坑 :sudo pip3 install 使用的是 root 用户的配置,必须再配一份:
bash
sudo mkdir -p /root/.config/pip
sudo tee /root/.config/pip/pip.conf << 'EOF'
[global]
index-url = https://pypi.tuna.tsinghua.edu.cn/simple
trusted-host = pypi.tuna.tsinghua.edu.cn
EOF
复制专用 一行写入:
bash
sudo mkdir -p /root/.config/pip && printf '[global]\nindex-url = https://pypi.tuna.tsinghua.edu.cn/simple\ntrusted-host = pypi.tuna.tsinghua.edu.cn\n' | sudo tee /root/.config/pip/pip.conf
第四步:手动安装 dlib 和 face_recognition
dlib 是编译型包,其源码 tarball 实际下载自 files.pythonhosted.org,清华镜像也会重定向到这里。国内直连下载极大概率超时,必须走代理:
bash
# --proxy 参数一定要加,这是最大的坑
sudo pip3 install --proxy=http://127.0.0.1:7897 dlib
sudo pip3 install --proxy=http://127.0.0.1:7897 face_recognition
复制专用 一行装完:
bash
sudo pip3 install --proxy=http://127.0.0.1:7897 dlib && sudo pip3 install --proxy=http://127.0.0.1:7897 face_recognition
如果遇到 dpkg 中断错误(比如之前 Ctrl+C 过):
bash
sudo dpkg --configure -a
第五步:补充缺失的模型文件
Howdy 需要 3 个 dlib 预训练模型文件,存放在 /lib/security/howdy/dlib-data/。但安装脚本经常下载不全 ------ 我遇到的是前两个文件下好了,第三个 dlib_face_recognition_resnet_model_v1.dat.bz2 静默失败。
检查:
bash
ls -la /lib/security/howdy/dlib-data/
需要看到这三个文件:
mmod_human_face_detector.dat(~729 KB)shape_predictor_5_face_landmarks.dat(~9.1 MB)dlib_face_recognition_resnet_model_v1.dat(~22.5 MB)
如果缺了,手动下载(同样需要走代理):
bash
cd /lib/security/howdy/dlib-data
sudo wget -e use_proxy=yes -e https_proxy=http://127.0.0.1:7897 \
https://github.com/davisking/dlib-models/raw/master/dlib_face_recognition_resnet_model_v1.dat.bz2
sudo bzip2 -d dlib_face_recognition_resnet_model_v1.dat.bz2
复制专用 一行下载并解压:
bash
cd /lib/security/howdy/dlib-data && sudo wget -e use_proxy=yes -e https_proxy=http://127.0.0.1:7897 https://github.com/davisking/dlib-models/raw/master/dlib_face_recognition_resnet_model_v1.dat.bz2 && sudo bzip2 -d dlib_face_recognition_resnet_model_v1.dat.bz2
第六步:配置摄像头路径
编辑 /lib/security/howdy/config.ini,把 device_path = none 改成你的实际摄像头:
bash
sudo sed -i 's/^device_path = none/device_path = \/dev\/video0/' /lib/security/howdy/config.ini
不确定用哪个设备的话:
bash
for dev in /dev/video*; do
echo "=== $dev ==="
udevadm info --query=all --name="$dev" 2>/dev/null | grep "ID_MODEL"
done
复制专用 一行版:
bash
for d in /dev/video*; do echo "=== $d ===" && udevadm info -q all -n "$d" 2>/dev/null | grep ID_MODEL; done
第七步:修复 CLI 命令入口
howdy 的 deb 包安装后并没有创建 howdy 命令的符号链接,手动创建:
bash
sudo ln -sf /lib/security/howdy/cli.py /usr/local/bin/howdy
第八步:配置 PAM 模块
在 /etc/pam.d/common-auth 文件头部添加一行,让人脸识别作为 sudo 和系统登录的认证方式:
bash
sudo sed -i '1i auth sufficient pam_python.so /lib/security/howdy/pam.py' /etc/pam.d/common-auth
用的是 sufficient 而不是 required,这样人脸失败后会自动回退到密码输入,不会锁死系统。
第九步:添加人脸模型
bash
sudo howdy add
面对摄像头,系统会采集你的人脸数据。
第十步:修复 GDM 登录界面的 Python 2/3 兼容问题
前面验证 sudo howdy test 正常、人脸也添加了,但重启后登录界面还是不扫脸,直接问密码。
检查日志:
bash
sudo journalctl -u gdm --no-pager | grep howdy
如果看到 ModuleNotFoundError: No module named 'ConfigParser',说明中招了。
根因 :howdy 2.6.1 的 /lib/security/howdy/pam.py 第 10 行写了 import ConfigParser,这是 Python 2 的写法。但 Ubuntu 24.04 上的 libpam-python 已经跑在 Python 3 环境,所以 PAM 模块加载直接崩溃,静默 fallback 到密码输入。
修复 --- 运行这段脚本:
bash
sudo python3 -c "
import re
with open('/lib/security/howdy/pam.py', 'r') as f:
content = f.read()
old = '''# pam-python is running python 2, so we use the old module here
import ConfigParser
# Read config from disk
config = ConfigParser.ConfigParser()'''
new = '''# pam-python might be running python 2 or 3, support both
try:
import configparser
except ImportError:
import ConfigParser as configparser
# Read config from disk
config = configparser.ConfigParser()'''
content = content.replace(old, new)
with open('/lib/security/howdy/pam.py', 'w') as f:
f.write(content)
print('done')
"
复制专用 一行修复:
bash
sudo python3 -c "f=open('/lib/security/howdy/pam.py','r');c=f.read();f.close();c=c.replace('import ConfigParser','try:\n import configparser\nexcept ImportError:\n import ConfigParser as configparser').replace('config = ConfigParser.ConfigParser()','config = configparser.ConfigParser()');f=open('/lib/security/howdy/pam.py','w');f.write(c);f.close();print('done')"
修复后重启,登录界面就会出现人脸识别了。
踩坑总结
| 序号 | 报错 / 现象 | 原因 | 解决方法 |
|---|---|---|---|
| 1 | E: dpkg 被中断 |
安装过程被 Ctrl+C 打断 | sudo dpkg --configure -a |
| 2 | No module named 'dlib' |
howdy 的 postinst 脚本中 pip install 静默失败 | 手动 sudo pip3 install --proxy=http://127.0.0.1:7897 dlib face_recognition |
| 3 | dlib pip 下载超时 Read timed out |
files.pythonhosted.org 国内直连极慢 |
加 --proxy 参数走 VPN |
| 4 | Unable to open dlib_face_recognition_resnet_model_v1.dat |
安装脚本下载模型文件时第三个静默失败 | 手动 wget + proxy 下载并解压 |
| 5 | sudo: howdy:找不到命令 |
deb 包未在 /usr/bin 创建符号链接 | 手动 ln -sf 到 /usr/local/bin/howdy |
| 6 | pip3 install 时还是走 PyPI 官方源 |
sudo pip3 用 root 配置而非用户配置 |
单独给 root 配 /root/.config/pip/pip.conf |
| 7 | 重启后登录界面不扫脸,仍需输密码 | pam.py 中 import ConfigParser 是 Python 2 语法,Ubuntu 24.04 的 libpam-python 用 Python 3 导致模块崩溃 |
改为 try/except 兼容写法(见第十步) |
验证安装
bash
sudo howdy test # 打开摄像头测试人脸识别
sudo howdy list # 列出已注册的人脸模型
复制专用 一行版:
bash
sudo howdy test && sudo howdy list
日常命令
bash
sudo howdy add # 添加人脸
sudo howdy remove 0 # 删除编号为 0 的模型
sudo howdy clear # 清空所有模型
sudo howdy disable 1 # 临时禁用 howdy
sudo howdy disable 0 # 重新启用
sudo howdy snapshot # 拍一张照片看看摄像头效果
复制专用 纯命令版:
bash
sudo howdy add
sudo howdy remove 0
sudo howdy clear
sudo howdy disable 1
sudo howdy disable 0
sudo howdy snapshot
注意事项
-
普通 RGB 摄像头不支持红外 :Howdy 针对 IR 红外摄像头优化,普通 RGB 在暗光环境下可能识别不准。可以降低
/lib/security/howdy/config.ini中certainty的值来放宽要求(默认 3.5,可调至 2.5)。 -
安全性:人脸识别存在被照片/视频欺骗的风险,howdy 不应用于高安全性场景。
-
PAM 不会锁死系统 :因为我们用的是
sufficient策略,人脸失败会自动 fallback 到密码。
参考链接
- Howdy GitHub: https://github.com/boltgolt/howdy
- dlib 模型文件: https://github.com/davisking/dlib-models
- 清华 PyPI 镜像: https://mirrors.tuna.tsinghua.edu.cn/help/pypi/
本文基于 Ubuntu 24.04 + Python 3.12 + Howdy 2.6.1 + dlib 20.0.1 + face_recognition 1.3.0 撰写。