Calvinlin 发布的文章

最近,深度操作系统刚刚发布了 20.05,它添加的 人脸识别功能 引来了社区的关注。

抛开人脸识别的准确度、可靠性,以及是否实用等问题,我们是否可以在其它的 Linux 系统中也获得人脸识别/解锁的的功能呢?

答案是肯定的。这就是本文要介绍的 Howdy 提供的功能。

Howdy 是什么?

据该项目的说明

Howdy 为 Linux 提供了 Windows Hello™ 式的认证方式。使用内置红外发射器和摄像头,结合面部识别功能来证明你是谁。

它使用中央身份验证系统(PAM),适用于任何需要密码的地方,如登录、锁屏、sudosu 等等。

安装

对于 Ubuntu/Linux Mint,可以添加第三方仓库安装:

sudo add-apt-repository ppa:boltgolt/howdy
sudo apt update
sudo apt install howdy

对于 Debian Linux,请在 发布页 下载 deb 安装包:

wget https://github.com/boltgolt/howdy/releases/download/v2.6.1/howdy_2.6.1.deb

然后使用以下命令安装:

sudo dpkg -i howdy_2.6.1.deb  # 请将文件名代替为你下载的文件名
sudo apt install --fix-broken # 使用 --fix-broken 安装缺失的依赖

对于 Fedora Linux,通过 COPR 仓库安装:

sudo dnf copr enable principis/howdy
sudo dnf --refresh install howdy

对于 Arch Linux 和 openSUSE 请参照其 仓库的说明

安装时,会自动下载依赖包和 dlib 的模型。请保证网络通畅。

配置

安装后,运行如下命令来编辑配置文件:

sudo howdy config

请将配置文件中的 device_path = /dev/xxxx 改成你的摄像头路径,它通常是 /dev/video0

如果 /dev 下没有 videoX设备,请检查摄像头驱动是否已经安装。

Howdy 需要了解你的长相,以便以后能识别你。运行如下命令来添加一个面部模型:

sudo howdy add

如果没有出错,我们应该可以通过识别你的脸来运行 sudo。打开一个新的终端,运行 sudo -i 来看看它的运行情况。

排错

解决 Howdy 在 GNOME 锁屏界面不工作的问题

复制如下文件:

https://github.com/boltgolt/howdy/blob/caf244ce297d27d40168c40571b0fad6f7ee2596/src/compare.py

/lib/security/howdy/compare.py 代替即可。


作者简介:

calvinlin:一个普通的深圳初中生。


via: https://github.com/LCTT/Articles/pull/17

作者:calvinlin 编辑:wxy

本文由贡献者投稿至 Linux 中国公开投稿计划,采用 CC-BY-SA 协议 发布,Linux中国 荣誉推出

“用户态 Linux” 是什么?它是一种可以在用户态运行的 Linux 内核。(用户态是什么,这里就不解释了)

它有什么用?它用于内核隔离、替代 QEMU/Bochs 来调试 Linux 内核,也可以在低性能设备上代替 KVM 进行虚拟化。

但它也存在一些缺陷,比如不支持 ARM 架构以及多核系统。

编译 Linux 内核

首先通过 git 下载 Linux 内核源代码:

git clone --depth 1 https://mirrors.tuna.tsinghua.edu.cn/git/linux.git

(这里使用了清华大学的镜像站,kernel.org 也是可以的。)

然后采用如下步骤编译它:

$ cd linux
$ export ARCH=um # 非常重要 设置架构为用户态
$ make defconfig
$ make -j8

 LD      .tmp_vmlinux.kallsyms1
 KSYMS   .tmp_vmlinux.kallsyms1.S
 AS      .tmp_vmlinux.kallsyms1.S
 LD      .tmp_vmlinux.kallsyms2
 KSYMS   .tmp_vmlinux.kallsyms2.S
 AS      .tmp_vmlinux.kallsyms2.S
 LD      vmlinux
 SYSMAP  System.map
 LINK linux
 MODPOST modules-only.symvers
 GEN     Module.symvers

经过漫长的编译之后,你获得了一个 vmlinux 文件。它和正常的 Linux 内核的区别是,这个 vmlinux 可以在用户态运行。

准备根文件系统

先别着急启动,先来准备内核所使用的根文件系统。

以下内容以 Debian Linux 为例。

首先安装 debootstrap 软件包:

sudo apt install debootstrap

以下命令皆需要 root 权限,先切换到 root 用户:

$ sudo su

然后构建根文件系统,存放在 rootfs 文件中:

# dd if=/dev/zero of=rootfs seek=2G # 创建一个 2GB 大小的空 rootfs 文件
 2000000000字节(2 GB,2 GB)已复制,0.137825 s,570 MB/s`

# mkfs.ext4 rootfs # 将其格式化为 ext4 格式
 mke2fs 1.46.5 (30-Dec-2021)
 Discarding device blocks: done                            
 Creating filesystem with 76748 1k blocks and 19200 inodes
 Filesystem UUID: 9dc7f1f6-8b16-4c64-9e22-94ede327c532
 Superblock backups stored on blocks: 
      8193, 24577, 40961, 57345, 73729

Allocating group tables: done                            
Writing inode tables: done                            
Creating journal (4096 blocks): done
Writing superblocks and filesystem accounting information: done 

然后挂载 rootfs/mnt 下:

# mount rootfs /mnt

在其中创建 Debian Linux 的根文件系统(/):

# cd /mnt
# debootstrap sid ./ https://mirrors.tuna.tsinghua.edu.cn/debian
 I: Configuring python-central... 
 I: Configuring ubuntu-minimal... 
 I: Configuring libc-bin... 
 I: Configuring initramfs-tools... 
 I: Base system installed successfully.

通过 chroot 将其改变为根目录:

# chroot ./

设置 root 密码:

# passwd 
 New password: 
 Retype new password: 

然后退出 chroot 环境,并卸载:

# exit # 退出 chroot 环境
# cd ..
# umount /mnt
# exit # 退出 sudo 环境

设置 rootfs 的所有权为普通用户:

$ sudo chown `whoami` rootfs

这样,这个用户态 Linux 的根文件系统就准备好了。

测试用户态 Linux

然后就可以用这个内核启动了,只需要一行命令:

$ screen ./vmlinux mem=1G root=/dev/root rootfstype=hostfs hostfs=./rootfs  con=null con0=null,fd:2 con1=fd:0,fd:1

启动后,使用你前面设置的 root 用户/密码登录,便可以进入到用户态 Linux 容器中了。

有别于 Docker,这个容器的内核和宿主的内核是隔离的,可以使用这个容器作为一个调试内核的工具,如:

echo 1 > /proc/sys/kernel/sysrq
echo c > /proc/sysrq-trigger

即可手动触发一个“ 内核恐慌 Kernel Panic ”错误。

延伸阅读:

作者简介:

calvinlin:一个普通的深圳初中生。


via: https://www.bilibili.com/read/cv15626523

作者:calvinlin 编辑:wxy

本文由贡献者投稿至 Linux 中国公开投稿计划,采用 CC-BY-SA 协议 发布,Linux中国 荣誉推出

编者按:本文系 Linux 中国公开投稿计划所接受的第一篇投稿,而且投稿作者是一位初中学生,让我们为他点赞!

一般来说,安卓设备和 Windows 设备投屏使用的是 miracast 协议,但是该协议要求网卡支持 p2pwifi,而 Linux 下大多数网卡驱动不支持 p2pwifi。

于是我用 Python + FFmpeg + DLNA 完成了一个在 Linux 下的投屏方案。这个方案的不足是延迟有点大。

设置

下面是如何实现。

先装这个 DLNA 库:

pip3 install dlna

然后用 pactl 查找 “监视器信源”(中文输出) 或 “Monitor Source”(英文输出):

pactl list sinks

示例输出:

Sink #0
    State: RUNNING
    Name: alsa_output.pci-0000_05_00.6.HiFi__hw_Generic_1__sink
    Description: Family 17h (Models 10h-1fh) HD Audio Controller Speaker + Headphones
    Driver: module-alsa-card.c
    Sample Specification: s16le 2ch 44100Hz
    Channel Map: front-left,front-right
    Owner Module: 9
    Mute: no
    Volume: front-left: 53814 /  82% / -5.14 dB,   front-right: 53814 /  82% / -5.14 dB
            balance 0.00
    Base Volume: 65536 / 100% / 0.00 dB
    Monitor Source: alsa_output.pci-0000_05_00.6.HiFi__hw_Generic_1__sink.monitor
    Latency: 16676 usec, configured 16000 us...

然后创建一个 CGI 脚本 screen.flv。首先。建立放置该脚本的目录:

mkdir screencast
mkdir screencast/cgi-bin

然后通过 cat 来直接创建该脚本:

cat <<eof>screencast/cgi-bin/screen.flv
#!/bin/bash
echo "Content-Type:video/x-flv"
echo

ffmpeg -f pulse -i <监视器信源>   -f x11grab -i :0  -vcodec h264_nvenc  pipe:.flv
eof

请用上面获得的监视器信源替换文件中的 <监视器信源>

并为它设置可执行权限:

chmod +x screencast/cgi-bin/screen.flv 

注意:如果没有 Nvidia 显卡,或者要使用其他的硬件加速,请把编码方案 h264_nvenc 替换为相应的编码方案。不建议采用软解方式,延迟非常高。

投屏

需要投屏时,首先启动本地 Web 服务器:

cd screencast
python3 -m http.server --cgi 9999&

然后,找到你的 DLNA 设备,然后把 location 后面的 URL 复制下来:

dlna device

示例输出:

=> Device 1:
{
    "location": "http://192.168.3.118:1528/",
    "host": "192.168.3.118",
    "friendly_name": "Kodi",
...

找到你的 Linux 电脑的局域网 IP 地址:

ip addr

示例输出:

3: wlp2s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether 74:4c:a1:82:2e:3f brd ff:ff:ff:ff:ff:ff
    inet 192.168.3.117/24 brd 192.168.3.255 scope global dynamic noprefixroute wlp2s0
       valid_lft 58283sec preferred_lft 58283sec
    inet6 240e:3b3:2ee3:9530:d005:e492:6243:9/128 scope global dynamic noprefixroute 
       valid_lft 6738sec preferred_lft 3138sec
    inet6 240e:3b3:2ee3:9539:f289:6043:c56a:4e7b/64 scope global dynamic noprefixroute 
       valid_lft 7189sec preferred_lft 3589sec
    inet6 240e:3b3:2ee3:9539:3714:eaf0:c549:b8c9/64 scope global dynamic mngtmpaddr noprefixroute 
       valid_lft 7188sec preferred_lft 3588sec
    inet6 fe80::c746:2540:ab7b:20aa/64 scope link 
       valid_lft forever preferred_lft forever
    inet6 fe80::3543:2637:e0fc:3630/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever

启动投屏的命令如下:

dlna play -d <URL> http://<局域网 IP>:9999/cgi-bin/screen.flv

请相应替换其中的 <URL><局域网 IP> 参数,此处我替换后的命令是:

dlna play -d http://192.168.3.118:1528/ http://192.168.3.117:9999/cgi-bin/screen.flv

然后在你的电视上设置接受投屏,各种电视设备设置投屏方式不同,请参照具体设备说明。

稍等片刻,视频就会出现在电视上了。投屏效果如下:


作者简介:

calvinlin:一个普通的深圳初中生。


via: https://www.bilibili.com/read/cv15488839

作者:calvinlin 编辑:wxy

本文由贡献者投稿至 Linux 中国公开投稿计划,采用 CC-BY-SA 协议 发布,Linux中国 荣誉推出