#kernel #configuration #lua #kconfig #config-file #file-change

bin+lib autokernel

Autokernel 是一个管理内核配置的工具,它保证了语义的正确性。它通过创建到内核 Kconfig 接口的本地桥接来检查符号分配的有效性,并确保您的配置在内核更新期间不会静默地损坏

2 个稳定版本

2.0.2 2023 年 3 月 3 日
2.0.1 2022 年 11 月 14 日

#2073命令行工具

MIT 许可证

125KB
3K SLoC

Rust 2.5K SLoC // 0.0% comments Lua 188 SLoC // 0.0% comments C 142 SLoC // 0.2% comments Shell 58 SLoC // 0.0% comments

Tutorial Crates.io MIT License

关于 autokernel

Autokernel 是一个管理内核配置的工具,它保证了语义的正确性。它通过创建到内核 Kconfig 接口的本地桥接来检查符号分配的有效性,并确保您的配置在内核更新期间不会静默地损坏。下次配置选项被移除或重命名时,就像当 CONFIG_THUNDERBOLTCONFIG_USB4 合并时一样,您会注意到。

它提供了一个配置框架,该框架理解符号背后的语义,它们的依赖关系和允许的值,并在生成最终的 .config 内核配置文件时强制执行这些规则。它能够自动解析符号依赖关系,并显示有用的诊断信息以帮助您解决配置错误。

配置本身可以使用传统的 kconfig 文件编写,或者使用更灵活、功能更强大的 lua 脚本 API。这允许更复杂的逻辑和与多个内核版本的兼容性。所有回溯到 v4.2.0 的内核版本都受到支持。

安装 & 快速入门

Autokernel 可以使用 cargo 安装

$ cargo install autokernel

之后,您需要创建一个 /etc/autokernel/config.toml(参考请见 examples/config.toml)。在这里,您可以配置用于生成内核配置的脚本,以及如何使用 autokernel build --install 将工件安装到您的系统中。

[config]
#script = "/etc/autokernel/legacy.config"
script = "/etc/autokernel/config.lua"

现在您可以编写您的内核配置了。您可以使用经典 kconfig 文件(如注释所示,只需更改上面的配置),或者使用推荐的 Lua 接口。提供的 Lua API 是一种更强大、更灵活的方式来编写您的配置。使用它,您将能够创建更结构化、更复杂和可重用的配置。请参阅tutorial.lua以了解 API 介绍。这里有一个非常小的示例config.lua

-- Begin with the defconfig for your architecture
load_kconfig_unchecked(kernel_dir .. "/arch/x86/configs/x86_64_defconfig")
-- Change some symbols
NET "y"
USB "y"

最后,运行 autokernel 生成一个 .config 文件。如果您的配置中包含任何错误,autokernel 将中止并打印相关的诊断信息。

# Just generate the {kernel_dir}/.config file
$ autokernel generate-config
# Or directly build the whole kernel
$ autokernel build

如果您想为您最喜欢的发行版维护一个软件包,请随意这样做,并让我们知道!

介绍

要设置一个符号,您可以使用以下语法。

-- This will set `CONFIG_NET` to yes.
NET "y"

您还可以尝试分配一个不允许的值

-- `CONFIG_NET` is a boolean symbol, so mod isn't allowed.
NET "m"

内核通常会完全忽略此类语句。相反,autokernel 将中止并显示错误诊断,告诉您只有 ny 是允许的

Invalid assignment

内核选项也只有在它们可见时才能分配,这意味着它们的依赖关系必须得到满足。如果您尝试启用一个具有未满足依赖关系的选项,autokernel 将检测到并自动建议解决方案。

-- This requires WLAN=y and NETDEVICES=y
WLAN_VENDOR_REALTEK "y"

Automatic dependency resolution

您不仅可以将这些分配盲目地复制到您的配置中,还可以直接从 Lua 调用求解器。这仅在解决方案是明确的情况下才有效,否则 autokernel 将引发错误并告诉您缺少什么。

-- Enable WLAN_VENDOR_REALTEK and any required dependencies
WLAN_VENDOR_REALTEK:satisfy { y, recursive = true }

您还可以使用autokernel satisfy --recursive WLAN_VENDOR_REALTEK作为一次性命令,先查看您在配置中不会引发错误必须更改的内容。

One-shot dependency resolution

还有一些符号不能手动设置,如 RTLWIFI_USB。直接尝试分配它们将导致错误

RTLWIFI_USB "y"

Manual assignment error

相反,这些需要通过设置另一个依赖于 RTLWIFI_USB 的符号来启用。自动求解器也能解决这些问题,所以您可以像上面一样使用相同的命令来查找所需的分配,或者再次直接从 Lua 使用 satisfy

RTLWIFI_USB:satisfy { y, recursive = true }

最后,您可能想要构建更复杂的脚本,这是 Lua 发挥作用的地方。它将允许您进行类似这样的条件赋值

if kernel_version >= ver("5.6") then
	USB4 "y"
else
	THUNDERBOLT "y"
end

请参阅tutorial.lua以了解 API 的详细介绍。

强化示例

有关内核强化的示例配置,请参阅hardening.lua

依赖关系

~7–22MB
~292K SLoC