上篇讲了在当前这台笔记本电脑(Yoga 14s 2021 ITL)上系统安装相关的一些细节。本篇聊聊我所用的一些用户侧的软件,其中有不少都是由于新硬件带来的,还有一些则是美化。
本文大部分作于7月9日。然而最后一部分修修改改,就到了19日……以后还是一点一点一个话题一个话题的写,不写这种长的了……
开关机动画(plymouth)
有过其他发行版经历的人,应该都看到过发行版相应的开关机动画。它们是通过一个叫做Plymouth的软件完成的(当然也需要对应的内核机制支持,但这个现在基本不用操心)。
Note
内核部分,似乎主要是得支持KMS。我以前用Acer 5745G的时候,由于有个Geforce GT 330M独显,启动时似乎没法启用KMS,所以一直没能成功启用plymouth。
它的安装和配置过程在对应wiki页面写得很详细。 安装没有什么特别的,按照正常方式即可。在AUR有其对应的包,同时ArchlinuxCN倉庫也有。而安装后需要进行一些设置,不然没法使用。
安装完毕后,首先需要编辑/etc/mkinitcpio.conf
来将plymouth
加入HOOKS
(参见wiki页面这一节),然后重新制作initramfs:
# mkinitcpio -P
Note
关于mkinitcpio,可以参考这个wiki页面。
在此之外,还需要编辑内核参数,需要增加quiet splash
这两者(在上篇中提到过)。其wiki页面还说需要增加vt.global_cursor_default=0
,不过在我这似乎没有区别。
这样其实就已经启用了。再然后就是一些细节的调整了,可以参照wiki找寻自己喜欢的。我主要调整了这些:
- 主题选用arch-charge,会显示一个逐渐填满(在关机时则是变空)然后闪亮的Arch的logo。
- 按wiki所说,启用了sddm-plymouth这个systemd服务,以期望流畅转换。然而这一步对我似乎没有任何区别,也没能找到别的方案。
- 调整HiDPI缩放为2倍。
类似Windows Hello的人脸认证(Howdy)
这台电脑有一个我以前电脑都没有的功能(设备),就是红外补光的摄像头。它同时也是为了支持Windows Hello,就是那个可以通过人脸认证来登录、认证及解锁的功能。 (不知道它是否需要及/或支持所谓的结构光?)
当然这个功能在Windows上存在了几年了,但仍然并不属于我之前的电脑所具有的功能,于是之前也就没配置过。这回碰上了,自然要好好利用,在Linux上也支持之。
抱着这个目的,我找到了Howdy这个软件。它的说明非常直白:「Linux上的Windows Hello」。
内核显示检测到了两个摄像头,一个是彩色的(/dev/video0
,名称叫Integrated C
,其中C应当是代表color)一个是红外的(/dev/video2
,名称叫Integrated I
,其中I应当是代表infrered)。所以我直接去装了Howdy。
> 很有意思的是,我这里还有video1和video3这两个额外的设备。但不知道它们是做什么的,也没法读出数据。
装上Howdy并测试时才发现,我的红外补光灯在Linux下居然无法打开!于是红外摄像头的画面几乎无法分辨任何东西。虽然彩色摄像头版的也可以用,但红外有在夜间也能正常使用的优势,所以还是希望可以用它。
然后反复搜找,终于找到了linux-enable-ir-emitter这个脚本,可以开启红外补光灯。
需要注意的是,这个脚本会尝试各种已知配置,来寻找当前电脑所支持的模式,而不是具有某种完全通用的机制来支持所有设备。很幸运,我的电脑在最初的版本就有支持的。
说一个题外话:我看到的时候正值该项目刚发布,我也就给这个项目写了PKGBUILD,然后在AUR创建并维护这个包(由于项目作者不熟悉Arch)。但后来项目作者始终希望在该脚本中处理一切,包括生成、安装及管理其systemd服务,而似乎不太喜欢(或者不太理解)使用静态的服务文件加上配置文件的模式。于是在3.2之后的版本中,该项目不再提供systemd服务文件。我也是在那前后不再为主负责其AUR包,且我在自己系统中标记了不去升级更新版本。
配置好了红外补光灯,就可以切换Howdy到对应的摄像头了——红外补光灯会自动亮起(闪烁)。然后重新训练我的面部模型,这样Howdy本体部分就配置好了。
但这还不够,我还需要编辑PAM配置文件以允许在适当的时候通过Howdy验证。整体而言,类似Windows Hello,在Linux上有这么几个地方比较有必要支持:
- 登录
- 解锁
- sudo认证/鉴权时
- polkit认证/鉴权时
例如,为了在进行sudo时使用Howdy来认证,需要修改/etc/pam.d/sudo
,在其中加上这么一句:
auth sufficient pam_python.so /lib/security/howdy/pam.py
其他的部分使用Howdy也类似:
登录认证需要修改对应的DM的文件;
解锁认证需要修改对应的桌面环境或锁屏器的文件,如KDE Plasma就是修改
/etc/pam.d/kde
;polkit认证需要修改
/etc/pam.d/polkit-1
。由于我的HOME分区进行了加密,且配置了自动解密(需要密码),于是登录时我不能使用Howdy认证,也就没修改SDDM的配置。另外,这里说SDDM最好不要用Howdy。
注意这些文件中条目的顺序会影响处理方式,因为PAM是按从上到下的顺序执行它们的。你可以在任意位置增加上述条目,但一个简单的rule of thumb规则是:
- 如果希望一上来就用Howdy,那么加到第一条;
- 如果希望先密码验证,如果失败再用Howdy,那么要保证上述Howdy条目前要有这么几行以首先尝试密码:
auth sufficient pam_unix.so try_first_pass nullok
关于Howdy的配置资料目前有不少,但并不够全面。我主要参考了其wiki页面这部分以及这个gist(KDE使用Howdy)。
个人猜测,其资料缺乏的一个原因应当是PAM的资料缺乏。比如我最初就花费了不少时间去查PAM的资料,试图弄明白其中加入的那些参数是什么意思。后来最终弄明白,那些参数是传给模块的,要去查模块的文档而非PAM的文档。比如try_first_pass nullok
这两个参数传给了pam_unix.so
这个模块,那么我就应该去看pam_unix的手册,即man pam_unix
。
从文档看,这两个参数对调整Howdy表现来说应该没什么意义。但我还是保留了,一是它们对我没有害处,二是担心万一它们有什么意义而只是我不知道。
自动亮度
说到摄像头,那么自然也要说说光线传感器以及自动调整屏幕亮度。
我之前在用XPS 13的时候,由于并不自带光线传感器但又想用自动亮度,于是使用calise——它通过分析抓取的照片来估计环境亮度,并设置屏幕亮度。由于是估计,时不时会出现错误。
到了Yoga 14s,有了内置的光线传感器,可以摆脱估计错误的情况了。那么就需要找相应工具来正确利用它。
虽然不会有估计错误了,但仍然存在前后光线不一致的情况。不过这就不是在传感器本身效果上面下工夫能解决的了。最近这些年有一些手机逐渐配备了前后双光线传感器,应当可以改善这个问题。
在找任何工具前,首先要确定自己的光线传感器被正确识别且有读数。这一步着实花费了我不少时间。最终发现,其信息在/sys/bus/iio/devices/iio:device0/
之下。其中in_illuminance_raw
即是我要的读数。
然后就简单多了:寻找工具以
- 监测读数并估测合适屏幕亮度;
- 设置屏幕亮度。
我找到了autolight这个工具来监测传感器读数并估测合适亮度。但这个工具有一些bug(最要命的是在特定情况下无法更改屏幕亮度),且许多年没更新。最初我手动修复了这些问题,且打算增加其他计算函数。但后来发现有smartlight这个活跃的fork(当然现在也有一年没更新了),就切换到了它上面。
至于设置屏幕亮度,则是按照autolight/smartlight的说明,使用了Light。当然,由于autolight的bug,我一开始手动测试了一段时间看light是不是有问题……
总而言之,UNIX的一切皆文件(Everything is file)原则的优势体现得很明显,不需要编程就可以检查传感器是否被识别,读数是否合理,以及编写工具去利用传感器数据。但该小众需求缺乏文档使得该优势并不能在一开始立即发挥出来。
触摸板多点手势(touchegg)
之前在用XPS 13 (9343)时,就已经折腾过触摸板的多点手势。当时的方法比较繁琐,需要安装并切换使用xf86-input-mtrack驱动,并进行系统全局设置。
这台Yoga 14s的触摸板也还算不错,手感接近XPS 13的。同时它支持(至少)四指触控,而我的XPS 13似乎只能支持到三指。有这样的条件,怎能不配置一下多指手势?
现在已经不需要专门安装特别的驱动,而可以直接使用常规的libinput,而且也不需要对驱动进行额外设置。取而代之的是,需要使用一个用户层级的事件监听及响应程序。我使用的是touchégg,并使用touché来配置它。
出于省事考虑,下文将会使用普通的字母e。
需要注意的是,touchegg需要首先作为守护进程/服务运行在后台,监听触摸并转换为多点手势事件(对应命令是touchegg --daemon
)。它需要相应权限来监听触摸板的输入事件,所以需要启动配套的系统级服务:
# systemctl enable --now touchegg.service
然后在用户层面,需要以客户端形式启动touchegg,以和前面启动的服务交互。由于我用的是KDE Plasma (5),它在启动时会自动开启该客户端服务,不需要我操心。但假如不想登出再登入,或所用的DE/WM不支持,那么可以手动启动:
$ touchegg
但这时候也只会进行默认的响应,我没弄明白究竟是哪些手势。我直接使用了touche进行配置——touche提供图形界面来对手势进行配置。
这里的可调项有很多。我主要是根据个人喜好,尽量保证语义统一,设置了这些:
- 三指是窗口操作
- 向左向右是后退前进
- 向上向下是最大化/还原和最小化
- 四指是工作区操作
- 向左向右是调整窗口平铺位置
- 向上向下是切换工作区(虚拟桌面)
- 向外是显示桌面
防火墙配置
从接触并简单学习Linux上的防火墙之后(大约2012年?),我就一直在用iptables——它的理念还是很好理解的,个人场景也比较容易理清需求。后来nftables替换了iptables,我便将自己电脑上的迁移了过去,但服务器的仍然保留。
iptables和nftables都是建于内核里的防火墙,都是netfilter项目(在不同阶段)的产物。据我所知,nftables的内核部分比iptables更灵活,功能上更强大(以便同时支持{ip,ip6,arp,eb}tables),同时提供向iptables的兼容层。表现上看,它们的主要区别在于上层用户空间的程序(即iptables和nft命令)及语法(还有语义)的差别。
在此期间,我发现Ubuntu的服务器使用ufw来作为前端配置防火墙,而非是用iptables命令。它的背后仍然是内核的netfilter,但对于普通防火墙配置任务来说更好理解和使用一些。
在本回系统配置过程中,我专门搜了一下各种防火墙配置前端,尤其是具有图形界面的那些。最后选用了firewalld。
我的需求并不多(毕竟是个人用的),所以其实裸用nftables或iptables本身是足够了的:
- 标准防火墙功能:按端口允许或封锁传入传出连接,及允许相关连接
- 正常支持Docker、zerotier等会自己建立虚拟接口的软件
在换用了firewalld之后,我额外获得了这些用上的功能:
- 按网络属性(尤WiFi名称)设置不同的防火墙规则(组)
- 设置不同的防火墙规则组
- 按照预置的服务/软件来配置防火墙规则
当然,由于我还用了不少额外的软件,预置的规则并不足够,于是自己添加了几个。不过在撰写本文时发现,其中一些已经被加入官方预置服务规则中了。
Kodi的防火墙规则
在给各个程序(服务)创建规则时,最麻烦的是给Kodi创建规则,因为缺少文档。
我的需求很明确:用Kodi来接收Android的DLNA媒体投射(如各类视频软件的投屏)。
然而查了许久也没有人指明其相关的端口是什么或防火墙规则如何设置。 查到了一些相关讨论,但没有明确的结论。(参见我在arch wiki的kodi的讨论页的留言。)
最后综合并尝试了很久,发现需要开启UDP 1900和TCP 1489端口。再追查下去,UDP 1900是UPnP的客户端端口(很合理,因为DLNA基于UPnP),但TCP 1489是什么就没弄明白了。
我并不能完全保证这是正确的,因为kodi的表现似乎并不一致。有可能我仍然漏了一些端口。而且其实DLNA、UPnP等协议的关系和细节我也没有弄明白。
缺憾
按照上面设置,我的防火墙已经足够日常使用了。但仍然存在一些缺憾。
其中最主要的,就是我希望可以按程序(或进程)来创建规则。然而这似乎并不被iptables或nftables等支持,于是也没有希望被其配置前端支持。
确实,对于服务器来说,这个功能没什么意义。对于普通用户来说,其或许根本没有开启防火墙的意识。但对于我这种日常+半专业使用人士来说,这就是一个很令人难受的问题——典型服务软件的端口和使用一般都比较清晰,但一些日常软件所需要开的端口并没有足够的文档或讨论来解释。如果可以按程序来,那么应当会省掉很多事情。
希望哪天有哪个框架可以补上这个缺憾。
Plasma配置
由于有了更大的内存(16G),我便换回了KDE Plasma (5),并尝试了一些美化。
除了美观外,换到Plasma的部分因素是我的AwesomeWM配置无法简单重用于新的电脑上(尤其是HiDPI的细节),另一部分因素是awesome不支持wayland而我在考虑什么时候全盘换到wayland上。
然而由于各种问题(主要是一些软件的崩溃,以及桌面环境时不时出一些小毛病),直到现在我也没换到wayland,而只是时不时去试试(然后发现还有问题)。
谈到美化,主要就是调整主题,以及使用latte dock取代Plasma自己的面板。另外,我还采用了动态桌布。
初版风格
我最初使用的是Orchis (Dark)全局主题(不要忘记单独设置Kvantum部分)。其主要好处是暗色调,似乎有助于眼睛。而且我也比较喜欢半透明效果,它也有提供。 鼠标指针使用的是Layan指针。
最初Orchis似乎并不能完整半透明,所以我搭了个Glassy应用程序风格,使得如Dolphin等有毛玻璃特效。一开始看着还行,截图也是这个时期进行的。但后来用用觉得不好看,换回了Orchis自己,发现半透明有了,只不过alpha值(不透明度)非常高。
然后面板用的是Plasma原生的面板,只不过我给拆成了三部分:顶部居中以作为AppMenu,左侧下部作为任务调度区,底部居右显示系统及全局信息。当然,它们都设置了自动隐藏或窗口可覆盖以免挡住窗口。
这样的好处是可以最大化利用屏幕空间。AppMenu使得菜单移至窗口之外,使得窗口可以显示更多内容。
原生面板的自定义功能还是有限,而且右下角的系统托盘需要时不时将指针移动过去才能看到,偶尔觉得不太方便。后来随着再次主题及风格调整,我对面板也进行了大规模改变。
后期风格
看久了暗色,就想换回亮色。后来发现了Nova这一系列主题,终于决定还是将所有东西都改改。整个系列有多个颜色可选,我选了绿色款。 除了配色和显示风格的不同外,我还换成了Latte Dock及其面板。
我之前一直尽量避免Mac OS X风格的顶部全局面板,其中最初是纯粹感情因素(不喜欢苹果因而不喜欢向它靠的行为),但后来也有了更多实际因素的考量:浪费宝贵的竖向空间。
Note
这一设计在更早期屏幕是4:3的时代或许问题不大,但随着2006年前后个人电脑全部转向16:10或16:9的屏幕,这一设计占用空间的问题就体现出来了。当然了,比起微软那边从Windows 7起更加巨大的任务栏来说,Mac OS X的顶部面板倒是更省空间一点。
Ubuntu的Unity桌面环境在这里处理得就比较好。它很早(印象中是从Ubuntu 10.10上网本版本开始加入Unity那时候就是)就将最大化窗口的标题栏合并入顶部面板,而在后来也加入了AppMenu(全局菜单)的支持。这样,显示空间不会因为有了顶部面板而被浪费,反而会有额外的全局信息栏。当然,Unity上也有一点缺陷:没办法将窗口标题栏放在顶部面板后边,导致多窗口平铺时必须浪费空间。(虽然我也没设置好自动平铺时不浪费,但至少可以手动来。)
而这回我之所以加入了顶部面板,则是由于之前发现了一些窗口操作按钮的plasmoid(即Plasma小部件)。这回则是组合了Latte Dock作者所维护的几个小部件,支持进行窗口操作,显示应用程序名称,以及显示全局菜单。
Note
它们还有一些有意思的组合用法,比如当光标进入和离开时显示或不显示标题和菜单。我更喜欢Active Window Control(另一个类似部件)所支持的光标移入时显示窗口操作,然而很可惜它对AppMenu的组合支持不够好,会有空白。
顶部面板的其他部分大都很直观:中间是日期时间;右侧则依次是系统负载信息(CPU、内存、硬盘、网络、温度),托盘。而在托盘右边则是切换边栏的按钮,以及图中看不到但存在的(Win7风)显示桌面。边栏是Latte的一种特殊面板——平时隐藏但仅在被激活时显示。边栏按钮就是为了配合这个机制而存在的,可以用来激活(和隐藏)边栏。更多细节请参考其pling页面的视频。
左侧面板仍然和以前一样,是任务调度用的。最主要的区别就是移动到了中间,并增加了一些常驻的按钮。之前和底部对齐是因为要放置「显示桌面」按钮,而它现在移到了顶栏上,那么在这里就不再需要了。
动态壁纸
除了上述主题相关美化以外,我还使用了动态壁纸。这里的动态并非指幻灯片式的切换,而是会根据时间变化。
我其实找到了两个项目来实现这一功能:
- plasma5-wallpapers-dynamic,使用自己的基于动态图片的格式(avif,之前为heif/heic)。
- plasma-wallpapers-xml,使用和Gnome动态壁纸相兼容的XML格式。
由于两者所支持的格式不同,所以它们的壁纸库也不同:
- plasma5-wallpapers-dynamic的仓库给出了一个壁纸库。其中只有有限的几个资源,且新旧格式互不兼容;但它们可以直接下载使用(因为是单个文件)。
- Gnome的XML格式壁纸则可以去看这个壁纸库。其中包含许多壁纸;但需要按照结构安装到本地才能使用(我顺便打了个AUR包,但不知道上游不存在明确的license是否影响)。
在我看来,plasma5-wallpapers-dynamic切换格式并放弃支持旧格式一事比较迷,毕竟本来壁纸资源也有限。不过询问后,作者说精力有限所以不打算支持多格式。
另外,我偶然在KDE的仓库发现了这些提交,似乎预示着KDE团队想让Gnome XML格式动态壁纸进入官方支持。
然而我简单对比发现,avif格式的动态壁纸比heif格式的动态壁纸小一些,而二者都要比Gnome XML动态壁纸的小。这或许算是我对这些格式的最大怨念了……
运行Android程序(Anbox)
有点相关知识的人应当都知道,Android的底层就是Linux。犹记得当年有过Android算不算GNU/Linux或Android算不算Linux的讨论,但基本上在一些代码进入Linux内核后不再讨论了——Android算Linux,但不算GNU/Linux。
既然算Linux,那么按理说其他Linux也可以跑Android,只不过要装备其非GNU的那套上层框架。这时候就可以请出Anbox了——它致力于直接在Linux上跑Android框架及应用程序,并将其限制在容器内以增强安全性。
不过要跑Android,就需要一些Android特有的内核特性。Anbox需要这两个内核模块:binder和ashmem。
注意这些内核模块有时候没法在一些(新)内核上编译,因为它们用了一些比较特别的调用,出于安全考虑会被禁用。如上篇所说,我用了linux-lily内核,所以不用再操心自行编译的问题了。
当然了,要跑Android应用,仍然需要安装对应的Android框架,在Anbox来说就是Android映像。基础映像不带任何软件仓库/商店,所以需要依赖adb安装应用;当然也可以考虑使有带Google服务的映像。
除此之外,Anbox就是正常使用,其实没太多好说的。而且过了新鲜之后,我其实也不太经常用——国产没Linux版的软件(其Android版)一般也不支持x86,而外国没Linux版的软件大多有网页版(或者我用不上)。多说一句:「支持x86」不是什么需要他们特别处理的,因为Android本身编程是支持任意平台的(这也是他们一开始选Java的原因);反倒是「不支持x86」是因为他们做了什么(一般应当是使用NDK,但只为一小部分架构编译)。
其他软件及结语
以上就是换到这台电脑后对软件和美化方面的一些个人折腾了。写一写以了自己对新近硬件上GNU/Linux使用体验文章匮乏的感叹。希望对读者有用,吧……
折腾的时候发现了Plasma Customization Saver这个小部件。它可以帮助迅速保存并切换Plasma配置风格。对经常想换换Plasma风格的人极其利好。
除了它们之外,我其实还尝试了一些其他软件。有的在以前的文章中写过,有的则不知道该如何写,因为就那么用就行。 不过还是简单写个推荐吧,毕竟当年刚接触Linux不久的我应当会很希望看点这类经验的(另可参考Arch wiki上的应用程序列表页面)。如果读者有更好的推荐,也可以改进我的工具链。
- 桌面和Android多机同步:KDEConnect(这个我其实从它刚诞生不久就开始在用,到现在应该有六七年了)
- 不只是一对一,而是可以多对多
- 还有开放文件系统(远程挂载)这个我很常用的功能
- 但由于Android 11(?)的限制,
/sdcard/Android/
没法显示了
- 但由于Android 11(?)的限制,
- 笔记软件:trilium
- 我是拿它来当个人wiki用的
- 以前试过zim、TiddlyWiki
- 最大缺憾是数据存在数据库内而非纯文件
- 工作记录:superProductivity
- 记录工作时长;会自动检测是否在使用电脑(目前仅限X11)
- 有多种同步方式
- 最大缺憾是记录不带时间而仅有时长
- 密码管理:Bitwarden或Pass
- Pass算是极简风格但又有扩展性的密码管理器
- 纯文件存储,允许自定义字段;自动通过git维护历史;使用GPG加密;支持多设备多密钥
- 可通过插件支持TOTP(许多动态验证码都是它)
- 有浏览器插件提供检索密码库并填写
- Bitwarden是一个开源的图形界面的密码(及其他类似私密信息)管理器
- 它有自己的同步服务器;服务端开源,可自建;也有一些兼容服务器
- 支持TOTP,有一些高级功能(如添加附件),但需要付费(不过不算贵);我不清楚自建服务器是否也需要付费,估计不用
- 也有一些兼容的命令行客户端
- 官方提供浏览器插件,但插件需要登录并会自己存储密码库,而不是和系统上的进行交互
- 虚拟局域网:Zerotier
- Zerotier可以让网络上两个或多个设备处于同一个虚拟的局域网之中,拥有稳定的局域网IP地址
- 和交换机上的VLAN并不同,而更接近programmable network
- 对我来说,其主要用途是在IPv6并不普及的状况下,允许我的两台(在不同网关后的)设备之间建立连接(或者说内网穿透)
好了,以上就是最近新用的以及以前没找到合适地方写的一些软件了。其中许多都有替代品可用,我只是出于我的需求和喜好选了其中的一个,也许你们更喜欢别的也说不定呢?
您可以在Hypothesis上的該群組內進行評論,或使用下面的Disqus評論。