前言
Linux的kernel config非常复杂,Loong Arch Linux作为Arch Linux的龙芯移植,其kernel config既需要能够支持龙芯的硬件及相关驱动,又需要能够及时从Arch Linux的kernel config中同步新的配置。
本文介绍了笔者近期探索出的Loong Arch Linux的kernel config维护方法。
历程
在此前,笔者曾经尝试过这些维护方法:
- 单独维护一个Loong Arch Linux的kernel config(
config.loong64
),再从Arch Linux的kernel config中同步新的配置。- 但是编辑工作量较大,且在维护者不熟悉kernel config的情况下十分困难。
- 维护Loong Arch Linux的kernel config与Arch Linux的kernel config的
diff
。- 直接生成的
diff
文件几乎每次在上游更新时都会有大量的冲突,导致维护困难。
- 直接生成的
- 先使用
make olddefconfig
根据上游的kernel config生成一个新的config,维护维护Loong Arch Linux的kernel config与这一新config的diff
。- 仍然会有大量的冲突,导致维护困难。
- 先使用
make savedefconfig
根据上游的kernel config生成一个新的config,再添加龙芯架构相关选项与硬件支持,维护Loong Arch Linux的kernel config与这一新config的diff
。- 内容相比之前大大简化,但仍然有冲突风险。
新方法
由于适配龙芯的kernel config实际上主要涉及的是功能与驱动支持的开启,笔者想办法对维护进行了进一步的简化。
笔者分别利用Arch Linux上游的kernel config与已知可以良好支持龙芯的AOSC的kernel config,使用make savedefconfig
生成了两者的简化配置文件defconfig.arch
与defconfig.aosc
。
随后,使用cat defconfig.aoac defconfig.arch > .config
将两者合并,再运行make savedefconfig
,优先利用Arch Linux的默认配置覆盖AOSC的默认配置。这样处理以后生成了一个新的defconfig
文件。
这一文件仍然混入了不少来自AOSC的发行版相关配置,笔者进一步对其进行了系统化清理。生成defconfig.arch
与新的defconfig
的diff
,并进行提取:
- 仅提取以
+CONFIG_
开头的行 - 仅提取以
y
或m
结尾的行 - 去掉开头的
+
以此便系统性地清理了部分AOSC的发行版配置(比如休眠、zswap压缩算法配置,部分数值设定等),得到了需要开启的新的配置项列表,命名为loong-addition.config
。
笔者在PKGBUILD
的prepare()
函数中,插入了一段逻辑,用于将loong-addition.config
合并到config
的末尾:
echo "Setting config..."
cp ../config .config
+ if [ $CARCH == loong64 ]; then
+ make savedefconfig
+ cat defconfig ../loong-addition.config > .config
+ fi
make olddefconfig
diff -u ../config .config || :
这样,我们得以完全避免与上游的冲突,同时,也将维护的内容由整个config文件或者diff
文件,变为了配置项列表,大大降低了维护的难度。
后续,我们只需要手动对loong-addition.config
进行进一步清理,移除不需要的配置项,并实时添加新增的需要额外支持的硬件,即可得到合理的Loong Arch Linux的kernel config。这一工作仅为可选,至少不会影响使用。目前,笔者仅对非常少量的配置项进行了清理,在以后,随着维护力量的增强,可以进一步完善。