Wind_Mask的博客

;

arch之乱

最后更新于

17 min read


缘起

不管怎么说装一个物理Linux系统总是码区一环……然而我其实是很风险厌恶的,一直到我的移动硬盘实在没有电脑以外稳定的供电(之前往路由器垃圾盒子上嗯插总是掉线)。那么这移动硬盘又能干什么呢,于是拿来乱装点系统也就算了。

本文不是那种正经的教程,而是一些我在安装中的乱舞的记述。 正经教程将在参考资料中给出。

看到本文注意一下时效性,安装的时候我是被论坛里那些帖子时间闹麻了。

准备

万物之源:arch download

正典:arch wiki

魔法:无法想象一根有魔法的网线给我省了多少力气,不可能保证无线网卡一开始就可用,还有稳定性和速度,更关键的是各种代理设置怎么比得了默认透明代理。即使你通晓各种镜像源和代理软件,也要设置各种环境变量代理方式,各种软件单独的设置……

开始

现在开始乱舞,首先,我不想刻录什么usb启动。因为当时我U盘刚好找不到了,移动硬盘应该可以但是反正系统都要装在上面,直接往里进就是了。 也懒得VMware了于是我翻出win上原来还有个Hyper-v姑且玩一下吧。 直接拿Hyper-V启动arch的iso,记得想办法把要装系统的硬盘通进去,其他虚拟机大约也可以支持的。

这么做好处自然是不用真的启动usb启动盘什么的,实际上我甚至直接在虚拟机里启动了arch,然后还能在实机上启动(当然有一堆硬件问题所以只是一开始调试用)……

安装

基本参考的是archlinux 简明指南,说到底就是把杂七杂八的配置改一下,硬盘该分区的分区该挂载的挂载。如果要系统加密这一步就得做了,linux实在不像win随便bitlocker加密有解密的,用了btrfs后来发现也没什么办法运行时加密,所以就算了。 搞定后就可以把安全启动一关,bios里启动项一改,就可以进入arch了。

但是这种系统是不足用的。图形界面随你心情也就算了,但是无奈现在笔记本这种双显卡而且我还是外接屏幕什么独显直连闹麻了。首先,我就没指望过optimus-manager这种东西,钻来钻去还好我们ASUS很厉害有个asus-linux,这种的管理显卡比较成功,顺便给大家推个nvidia-tweaks这种把nvidia的配置都搞完了反正我是不看了,然后就是prime-run往里进,反正集显平时差不多(实际上外接我后来被逼无奈还得想办法绕过独显)。

安全启动在win11上实在是得往里进的据说windows hello还有bitlocker都需要那我肯定跑不了,但是配一堆钩子什么自己生成什么签名每次更新都得注意什么的实在太魔。所以sbctl用一下试试。这个自然有赖于bios的实现了,至少在我电脑上可用就是了。

排错

从一开始双显卡加外接屏幕就置我于各种怪象没办法这种场景毕竟想想也没人在意的。

一开始独显通过一个C口dp接外接屏幕也没什么。就是bios改成集成显卡外接屏幕就没有了,这也是自然因为我知道我电脑那个C口是独显直连的。然而混合模式bug就来了,外接屏幕帧率掉到36帧,似乎是输出要经过cpu复制还是集显复制什么的bug,思来想去没有办法,电脑调成独显模式就好了,算了反正是接电源的独显就独显吧。

我姑且这样几天后。不幸的,滚了一哈nvidia驱动或者linux内核?,独显模式桌面全都渲不出来了,只能在tty等死。调了半天没有办法,此时才让我觉醒了我自己电脑的知识:原来另一个C口接的是集显……那么就把外接屏幕接在另一个C口就是了,于是不仅集显模式能了,混合也好了(而且外接屏幕也不卡了),独显模式我就不试了。

硬件加速什么的真的确实不太行,intel的能用不错了。

转移

怎么可能真的装在移动硬盘主要还是usb速度真不行,可怜我那可是nvme的固态啊!读3000的硬盘跑个二三十这种的根本不是正经系统强度嘛……这样根本不可能真的使用arch的。

所以还是把根目录发送到电脑内的硬盘上把,反正其实空闲很多的。于是也促使我整理了电脑的硬盘,并且把没必要的bitlocker加密解了(为了两个系统间的文件共享)。

于是在电脑的一块固态中腾出来142G空间,之前说了arch装在btrfs上了这东西有个快照发送功能直接把根分区快照发送国区展开改一下fstab里挂载的UUID就好了。

然后把ESP分区也在硬盘上腾点地在建就是了,当然有tpm+安全启动情况下换启动分区甚至efi文件都是会触发bitlocker恢复的就是了。

快照

是的我使用Timeshift(尽管说真的它没救过我几次成功,毕竟安装过程中经常嗯造/boot,快照也救不了你)。 一个小bug,至少到前几周,当时我按它指定了子卷布局还是快照不了,结论是fstab中挂载用的不是uuid改成uuid就好,不知道现在如何了。

休眠

我竟然做过这种梦幻:可以自由地同时休眠win和arch。~~事实上我其实快成功了,但是nvidia显卡和win休眠时的一些异象实在还是超出了我的能力。~~好的现在已经胜利,不管怎么说大部分情况可以做到了!两个系统可以独立休眠这种切换速度已经比肩虚拟机。

现在的结论是一般说可以休眠win而打开arch(事实上这已经比一般的说法好一些了,至于此时在arch上读写ntfs分区会怎么样……哈哈哈哈,反正那里是我onedrive文件夹,嗯造吧)

pacman与AUR配置

镜像大家都知道不用说,但是加速肯定还得继续。

/etc/pacman.conf中注意:

  • ParallelDownloads:并行下载。

/etc/makepkg.conf中注意:

  • CFLAGS中可以改-march=native
  • MAKEFLAGS可以改-j$(nproc)

维护

我甚至写了个pacman钩子确保每次安装都会更新pkglist。 (yay本来是pacman当然可以换其他的)

yay -Qqe > pkglist.txt  #所有明确安装的软件包的列表

重装的话(我不会容许的!)可以这样:

yay -S --needed - < pkglist.txt

强迫症必须指令:

yay -Sc -Qtdq | yay -Sc -Rns - #孤立包往外退
yay -Sc #清除缓存

dotfiles:我选择使用yadm,加上git-crypt加密再放私有仓库,勉强安全吧……

字体:字体会暴露一切失败,我是说把win里的C:\windows\fonts全拾走就是了。

强上wayland:即使现在也还是要配置一些,远未达到默认都可用,我有:

/etc/environment:

SDL_VIDEODRIVER=wayland 
XDG_SESSION_TYPE=wayland
QT_QPA_PLATFORM="wayland;xcb"
EGL_PLATFORM=wayland
GTK_IM_MODULE=wayland

这种一大堆,即使如此xwayland也还是要用的……

hyprland

很闹嘛的东西使用感觉还行其实反正可以与kde共存死不了就是了。不过官方不考虑nvidia得用且用。 其间的麻烦配置想玩就玩不喜欢可以找现成的比如Arch-Hyprland,再去github拾点dotfile就是了。

安全

好吧我容忍不了这种惶恐,这是被害妄想症。那么就重造根分区全加密吧。

没妄想可以原地加密,把整个/全部先转移到移动硬盘存着。按理此时需要进iso仿佛重装怎么可能哈哈,改下root的内核参数直接换个地方操作就是了(然而此时才看到grub的可恶!很会钦定我的root在哪……)。

所以我觉醒了,喜欢钦点我的内核参数的bootloader闹麻了,Unified kernel image往里进。不过暂时还没有摆脱就是了,这就看出人的奇异本性:如果没有grub-mkconfig只要自己嗯写bootloader的配置文件其实反而可以容忍,然而有了以后看着它钦点我的启动项和内核参数浑身难受(当然如果找不到好的替代还是可能要自己改grub-mkconfig的各种脚本罢……)。

不过安全当然是一整条链,此处大概述为:

  • 安全启动

    首先安全启动还是sbctl原样即可,签署了bootloader和UKI(可见bootloader在此只是多余的攻击侧,毕竟UKI可以直接启动,但是我还想给一个选择win的机会……)。

  • 全盘加密

    把TPM也加进去搞成TPM+PIN的解密磁盘(模仿Bitlocker就是了),结论是默认测量7差不多就这样吧。加上一个物理FIDO2密钥+PIN很安全很再加上一个recover key很可恢复就是了。

    然后是分区沿用之前的状态也就是一个一百多G作为根分区,现在是作为一整个加密块里面还是一个btrfs,@和@home子卷。然后在这个加密块后面还有个swap的块(因为之前就是swap分区),也改成luks的块里面放个swap的分区,而且我还要休眠,不然直接随机密钥打开就行了。

    看来看去还是system的initramfs厉害于是把mkinitcpio的钩子换掉(见dm-crypt/System configuration - ArchWiki),根目录肯定要在initramfs里就解密掉。看wiki按理crypttab.initramfs是和rd.luks一样都会进initramfs的,然而我只能用rd.luks的内核参数来解密也不知为何。

    然后是swap分区如果不用resume其实可以推到系统启动后再解密然而要resume那么也得进initramfs,解法还是rd.luks嗯写,但是不想在启动阶段输入两次,也不想用同一个密钥。我一开始就决定用链式解锁,即把swap分区的keyfile保存在根分区里,于是这就变成在initramfs阶段就按序解锁加载keyfile了……幸好这居然是可以的,写的是rd.luks.key=SWAP-UUID=/@/keyfilepath:/dev/mapper/root这种鬼话。

    此处一发现:rd.luks加的根分区不必在option里指定tpm加入有TPM的key就会尝试调用,我option里只是FIDO2,无插卡时自动先TPM,option并无TPM。

然后是把全部内核参数拉出来放到生成UKI要用,mkinitcpio生成UKI,在sbctl里sign注册。

于是linux的内核镜像和微码什么就不存在/boot占用空间了,改一下linux.preset什么的把什么ALL_kver什么ALL_microcode的移到加密目录里不要露出。

于是grub总算侦测不到启动项,那么手动往/etc/grub.d/40_custom(当然40被改了优先级不能这么低排序很低)加UKI的启动项(链式引导)。

这样一来总算是的win下没法直接访问arch的系统啦(本来有个WinBtrfs)太可喜可贺太安全了……个鬼。。。(不过还是可以wsl解luks)

由此整条linux的启动链还算可靠了。

美化

顺手加了个Plymouth并且把loglevel,quiet全拉上了,启动时再也不看黑屏了……

急救

我去今天是真的爆了。

几天不看今天一启动就进不去系统,一看内核镜像里没有解密钩子?怎么会事呢明明感觉记得上次生成时hook配置正确的,反正总之爆了得恢复。

看了上文就知道我根目录加密……不过有恢复key,从我的离线存储(找了半天丢哪里了)打开多级加密,才能找到key。往U盘写个arch iso,关了安全启动进入,然后手动解密根目录(btrfs还得分次挂载),arch-chroot进入改一下hook重新生成镜像,完毕。

这次意外倒也证明了我的恢复设计无误,安全性也可接受。但是意外的是,重新打开安全启动(按理每次操作安全启动状态都会不可逆改变PCR)竟然并无触发TPM(考虑到有PIN码所以也不致命?),真是奇异……

参考资料