终极指南:在 Arch Linux + i3/bspwm 下实现完美的 i3lock 指纹解锁

和AI一起写的。

作者:Gemini & 一位富有探索精神的 Arch 玩家 N1nEmAn
时间:2025年6月27日,深夜

你是否也曾梦想着,在极简的 i3 或 bspwm 环境下,像使用现代笔记本一样,指尖轻触,屏幕应声而解?这不仅是为了便捷,更是一种对极致体验的追求。然而,如果你曾尝试过,你可能会发现,现实是一条布满陷阱的崎岖之路。

你可能会遇到“模块未知”的错误导致被锁在系统之外,可能会被“先按回车才能用指纹”的怪异行为所困扰,甚至在系统挂起后发现指纹功能神秘失效。

这篇指南,将终结所有这些问题。它不是简单的命令罗列,而是我们从一次次失败中总结出的、经过验证的最佳实践。我们将采用一种“混合动力”的脚本方案,绕过 i3lock 自身的设计缺陷,打造一个既能用指纹秒开,又能用密码稳妥解锁的终极锁屏。

核心思想

我们将弃用 i3lock 自带的、问题频出的 PAM 功能来处理指纹。取而代之的是:

  1. 启动一个 i3lock 实例,让它只负责处理密码输入
  2. 同时,在后台运行一个独立的循环,只负责检测指纹
  3. 这两条路并行运行,谁先成功,谁就解锁屏幕

第一步:安装所有“武器装备”

我们需要一个“特供版”的 i3lock 来解决最基础的兼容性问题,以及一些辅助工具。

# 安装一个专门为 PAM 打过补丁的 i3lock 版本
yay -S i3lock-pam-git

# 安装指纹服务、截图、图像处理和锁屏事件管理工具
sudo pacman -S fprintd scrot imagemagick xss-lock

第二步:录入你的指纹

如果你的设备是初次配置,需要先让系统“认识”你的指纹。

# 启动并使能指纹服务
sudo systemctl enable --now fprintd.service

# 开始录入指纹,根据提示操作
fprintd-enroll

第三步:配置一个“密码专用”的 PAM 规则

我们将为 i3lock 创建一个极简的 PAM 规则,它的唯一作用就是当用户输入密码时,去验证密码的正确性。

  1. 创建文件:

    sudo nvim /etc/pam.d/i3lock 
    

    (你可以把我这里的 sudo nvim 换成你习惯的 suvi 或其他编辑器)

  2. 写入以下内容:

    #%PAM-1.0
    # 此文件仅用于 i3lock 的密码回退(fallback)方案
    auth      required    pam_unix.so
    

第四步:编写“混合动力”锁屏脚本

这是我们整个方案的核心。它将所有工具串联起来,实现了完美的解锁逻辑。

  1. 在你喜欢的位置创建一个脚本文件,例如 ~/.config/bspwm/scripts/lock.sh

  2. 将以下脚本完整复制进去:

    #!/bin/sh
    
    # 防止脚本重复运行
    if pidof i3lock > /dev/null; then
        exit 0
    fi
    
    # --- 美化阶段 ---
    # 定义图标和临时截图的路径
    ICON_PATH="$HOME/.config/bspwm/scripts/lock_icon.png" # 你需要自己准备一个锁头图标
    TMP_IMG="/tmp/screen_locked.png"
    
    # 1. 截图并处理成带图标的模糊背景
    scrot -o "$TMP_IMG"
    convert "$TMP_IMG" -blur 0x8 "$ICON_PATH" -gravity center -composite "$TMP_IMG"
    
    # --- 锁定与解锁阶段 (核心逻辑) ---
    
    # 2. 启动 i3lock (密码通道),让它使用 PAM 规则并显示我们刚制作的图片
    #    它会在这里等待用户输入密码...
    i3lock --pam-service=i3lock -i "$TMP_IMG" &
    
    # 3. 启动指纹轮询 (指纹通道)
    #    这个循环会与 i3lock 并行运行
    while pidof i3lock > /dev/null; do
        # fprintd-verify 会等待指纹触摸,成功后其输出包含 "verify-match"
        if (timeout 5 fprintd-verify | grep -q 'verify-match'); then
            # 指纹验证成功,立即杀死 i3lock 进程,实现解锁
            pkill i3lock
        fi
        # 短暂休眠,避免不必要的CPU占用
        sleep 0.1
    done
    
    # 4. 解锁后清理临时文件
    rm "$TMP_IMG"
    
  3. 赋予脚本执行权限chmod +x ~/.config/bspwm/scripts/lock.sh

第五步:系统集成

  1. 绑定锁屏快捷键
    编辑 ~/.config/sxhkd/sxhkdrc,添加:

    # Lock screen
    super + l
        ~/.config/bspwm/scripts/lock.sh
    

    别忘了用 pkill -USR1 -x sxhkd 重新加载配置。

  2. 集成系统挂起
    编辑 ~/.config/bspwm/bspwmrc,添加 xss-lock 的自启项:

    # 在 bspwmrc 的后台任务区
    killall -q xss-lock && sleep 1
    xss-lock --transfer-sleep-lock -- ~/.config/bspwm/scripts/lock.sh &
    

    这会让你在执行 systemctl suspend 或笔记本自动休眠时,都能优雅地调用我们的完美锁屏脚本。

极致sudo

可以随便设置强密码了因为,只需要在/etc/pam.d/sudo顶上添加一行auth sufficient pam_fprintd.so就可以在sudo或者yay等需要密码的时候直接刷指纹获得权限!
image

另外如果说不让录入指纹,在enroll后面加上用户名即可。

结语

至此,你已经完成了一项足以让许多 Linux 用户望而却步的挑战。这不仅仅是一个教程,更是我们从一次次失败中总结出的最佳实践。你的锁屏体验,既拥有原生密码的稳固,也拥有了独立脚本带来的、一触即发的敏捷。

这,才是真正的、属于你自己的、无懈可击的桌面哲学。

posted @ 2025-06-26 23:11  .N1nEmAn  阅读(196)  评论(0)    收藏  举报