之前在Arch社区遨游的时候,偶然发现了Howdy这个有趣的项目,于是mark一下准备有空的时候试试。正好最近毕设的设计阶段结束,可以来玩玩这个期待已久的App。 😀


howdy_logo.png
howdy_logo.png

Howdy provides Windows Hello™ style authentication for Linux. Use your built-in IR emitters and camera in combination with facial recognition to prove who you are.

从介绍就能看出来,作者这上来就是直接对标Window Hello,可谓是雄心勃勃,确实能让开源社区的各位眼前一亮。不过我现在也不知道Howdy这个名字是怎么来的XDD

背靠强大的AUR,瞟一眼PKGBUILD看看安装配置,然后直接yay装好社区打的包。嗯,一切顺利,至少到现在是这样。

然而在配置硬件摄像头模块时出现了一点小问题。顺着万能的Archwiki配置,我一并重新了解了一下手上的yoga Slim 7 Pro的摄像头配置。

❯ v4l2-ctl --list-devices       
Integrated Camera: Integrated C (usb-0000:03:00.3-3): 
     /dev/video0 
     /dev/video1 
     /dev/video2 
     /dev/video3

当时看到这个输出很疑惑,明明是只有两个摄像头设备,为什么会有四个可用的设备,之后查阅了一番才知道,Linux内核在4.16版本之后加入了一个额外的device node用于提供metadata,相当于将原来单节点里的metadata提取出来,以提供更好的用户接口。media: uvcvideo: Add a metadata device node

再详细的打一下输出就能发现,/dev/video0和/dev/video1表示RGB摄像头,这里为Integrated C,规格为1280x720,输出格式为MJPG;/dev/video2和/dev/video3表示IR摄像头,这里为Integrated I,规格为640x360,输出格式为8比特的GREY。

❯ v4l2-ctl --device=/dev/video0 --all
Driver Info:
        Driver name      : uvcvideo
        Card type        : Integrated Camera: Integrated C
        Bus info         : usb-0000:03:00.3-3
        Driver version   : 5.11.10
        Capabilities     : 0x84a00001
                Video Capture
                Metadata Capture
                Streaming
                Extended Pix Format
                Device Capabilities
        Device Caps      : 0x04200001
                Video Capture
                Streaming
                Extended Pix Format
❯ v4l2-ctl --device=/dev/video2 --all
Driver Info:
        Driver name      : uvcvideo
        Card type        : Integrated Camera: Integrated I
        Bus info         : usb-0000:03:00.3-3
        Driver version   : 5.11.10
        Capabilities     : 0x84a00001
                Video Capture
                Metadata Capture
                Streaming
                Extended Pix Format
                Device Capabilities
        Device Caps      : 0x04200001
                Video Capture
                Streaming
                Extended Pix Format

虽然Howdy支持RGB光学摄像头进行人脸识别,但是既然手上的yoga搭配了IR摄像头,这不用就有点说不过去。

  • IR摄像头,也即是红外摄像头,能够捕捉外部红外线强度分布,与红外线发射器(IR Emitter)配合,相较于RGB摄像头,其捕获的图像不受外界环境可见光的影响,模式更稳定。

在进行了一番配置开始测试后,发现直接调用IR摄像头获取到的图像一直很暗。回到Windows下观察Windows Hello工作状态,发现IR摄像头旁边的红点就是红外发射器,但是在howdy下并没有在工作,于是开始翻issue。

正所谓万事万物终有起点,社区内许多人都遇到了这种情况,而解决方案最终归于一个issue。其中@PetePriority参考Windows 10 SDK文档中对ir-torch-control的描述并使用wireshark对USB总线抓包分析,找出了控制ir-torch的控制字URB_CONTROL。看完ta的解决方案,只能说妙!妙!妙!这里给出ta写的IR-Torch模式控制代码

由于使用的IR控制设备不一样,yogaSlim7上为Bus 001 Device 002: ID 13d3:5419 IMC Networks Integrated Camera,需要回到windows系统上用wireshark重新抓取对应USB控制器的控制字段,这里用Windows的虚拟机也可以。具体方法为:

  • 开启Wireshark内的USB Cap;
  • 进入Windows Hello内增强识别;
  • 在出现弹窗后Windows驱动会触发IR发射器,再分析抓取到的Setup Data,得到对应的控制字

WiresharkUSBCap.png
WiresharkUSBCap.png

WindowsHelloTriger.png
WindowsHelloTriger.png

最后成功开启IR发射器,并实现了Linux Hello的不完全体。由于Howdy可以使用PAM对权限进行配置,因能够使用场景包括Login、Screenlock、sudo等等,但是由于目前不同的DE下对PAM的支持不尽相同,实际体验因DE而异。这里的实际配置情况还是有很大的提升空间,首先是SDDM对与PAM的支持不太好,不能够“并行”执行passkey和Howdy,在输入正确的passkey后依然会进行howdy的识别;其次是KDE锁屏kscreenlock,需要对howdy文件夹赋予755读写权限。Refer:Proper PAM Configuration for Howdy w/ Kscreenlocker?)

20210329T110747.jpg
20210329T110747.jpg