只要是我自己的机器安装的Linux,内核肯定要自己重新编译的。因为看到/lib64/modules/下面特定版本的文件夹包罗万象,就替cpu感到累,替内存感到撑得慌,虽然知道这是错觉,但一定要去做点事让心理好受点。起码,我就这点外围硬件,顶多插个U盘,留这么多驱动干啥?

关于内核的支持情况可参考:
Active kernel releases 关于内核的编译可参考:
Arch Linux Kernel/Traditional compilation

ArchLinux 官方会说使用Arch Build System有多省事。但我最省事的方式还是通用的方式,因为各种发行版定制内核的方法大同小异,还不用专门去看Arch Linux System的文档。

通常定制内核可按下面几步:

  • 下载选定版本的内核
  • 为系统安装内核编译时必须的编译工具
  • 配置内核、编译(make help查看各选项)
  • 安装内核模块(make modules_install),copy编译的内核以及制作的初始化内存盘到/boot目录
  • 更新引导程序的配置

archLinux提供了一个名为mkinitcpio的工具来方便生成初始化内存盘:

archlinux kvm gpu虚拟 archlinux kernel_stm32


下载的内核为5.4.142(当时眼花了,本来应该下载5.10版本的),使用make localmodconfig 为基础选项编译,在制作初始化内存盘时会报错(具体错误会因个人设置有差异),反正最后也成功生成需要的initramfs了,就没管它。然后更新grub启动配置(grub-mkconfig -o /boot/grub/grub.cfg)也一切正常,但启动系统出问题了:

archlinux kvm gpu虚拟 archlinux kernel_stm32_02


开始时认为第二条是关键点:

Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,0)

这种错误常见,通常是由于没能加载磁盘驱动或者磁盘格式驱动造成的,惯性思维让我认为错误就在此处,而且第一条错误也与此有关。但检查选项并重新编译内核后问题依旧,期间试过搜索过的很多类似情况的解决方式,比如更新系统提供的处理器微码,也试过按默认选项重新编译内核,甚至挪到实体机上做比较,错误依旧。中间Intel nuc的760P莫名其妙坏了,还是挑刚刚将一年来的代码工程移动到它上面的第一天…消停了几天后,忽然就觉得第一条错误应该重新审视:

Initramfs unpacking failed: invalid magic at start of compressed archive

初始化内存盘解压缩错误,除了磁盘文件损坏或者空间不足外,也可能是因为解压缩算法和实际压缩模式对不起来造成的。检查内核编译选项,没发现支持zstd压缩模式的选项,就留了个LZMA,其他的全取消了。

archlinux kvm gpu虚拟 archlinux kernel_linux_03


因为archLinux默认安装的mkinitcpio默认是当下最新版本,其初始化内存盘的压缩格式默认为zstd,需要在/etc/mkinitcpio.conf配置中更改为被内核支持的模式,此处为LZMA:

archlinux kvm gpu虚拟 archlinux kernel_archlinux kvm gpu虚拟_04


重新生成启动盘后就一切正常了。问题出在我真的没关注过Linux内核从那个版本开始支持zstd压缩模式的(貌似长期支持版本5.10打头的是支持的,但5.4打头的不行),也不关注archLinux提供的mkinitcpio工具从哪个版本开始默认使用zstd压缩。

其实自己查找过的资料中有人遇到过同样的问题,而且解决了:
[SOLVED]initramfs: unpacking failed: invalid magic at start of compres 但当时因为自己半桶水的英文理解能力,认为是archLinux的内核/硬件板块的版主说的“默认压倒一切”解决了问题,就没去看倒数第二位小伙子的详细解答。