2 个稳定版本
2.0.2 | 2023 年 3 月 3 日 |
---|---|
2.0.1 | 2022 年 11 月 14 日 |
#2073 在 命令行工具
125KB
3K SLoC
关于 autokernel
Autokernel 是一个管理内核配置的工具,它保证了语义的正确性。它通过创建到内核 Kconfig 接口的本地桥接来检查符号分配的有效性,并确保您的配置在内核更新期间不会静默地损坏。下次配置选项被移除或重命名时,就像当 CONFIG_THUNDERBOLT
与 CONFIG_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 将中止并显示错误诊断,告诉您只有 n
或 y
是允许的
内核选项也只有在它们可见时才能分配,这意味着它们的依赖关系必须得到满足。如果您尝试启用一个具有未满足依赖关系的选项,autokernel 将检测到并自动建议解决方案。
-- This requires WLAN=y and NETDEVICES=y
WLAN_VENDOR_REALTEK "y"
您不仅可以将这些分配盲目地复制到您的配置中,还可以直接从 Lua 调用求解器。这仅在解决方案是明确的情况下才有效,否则 autokernel 将引发错误并告诉您缺少什么。
-- Enable WLAN_VENDOR_REALTEK and any required dependencies
WLAN_VENDOR_REALTEK:satisfy { y, recursive = true }
您还可以使用autokernel satisfy --recursive WLAN_VENDOR_REALTEK
作为一次性命令,先查看您在配置中不会引发错误必须更改的内容。
还有一些符号不能手动设置,如 RTLWIFI_USB
。直接尝试分配它们将导致错误
RTLWIFI_USB "y"
相反,这些需要通过设置另一个依赖于 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