将 Linux 内核配置选项与特定模块相匹配

将 Linux 内核配置选项与特定模块相匹配

我在机器上启用了许多配置选项,以便利用新纳入的 wireguard模块输入Linux 5.6.0-rc1

这有点费力:我有一个最小的工作配置,并以我在尝试设置wireguard网络接口时收到的错误为指导,我必须一一启用我不熟悉的内核配置选项,直到wireguard工作为止(例如,选项,说,CONFIG_IP_NF_MANGLE)。

我现在想尽可能在​​另一台机器上自动复制此过程。而另一台笔记本电脑则有一个相对较小的定制配置内核;这是一台完全不同的机器,所以make localmodconfig当前的machine 并不是一个真正的选择,因为无论如何我都必须以某种方式合并这两个配置。

我想实现什么

我想要一个进程,它采用模块名称作为输入,如lsmod(例如iptable_mangle)列出的那样,并返回与启用它相关的内核选项(大概CONFIG_IP_NF_MANGLE=m在这种情况下?)。

我努力了

  • iptable_mangle在 Linux 源代码(克隆)中grep 查找内核模块github,希望能找到将其链接到相应内核选项的东西;

  • 在当前机器上运行modinfo <target module name>,希望显示的信息会提到内核配置选项。

这些都不起作用:输出CONFIG_IP_NF_MANGLE在任何一种情况下都没有提及。

答案1

啊哈!我相信我已经找到了一些相当可靠的东西。

浏览 Linux 树递归地配置和 grep 查找我的模块名称(例如iptable_rawxt_addrtype或您有的东西)总是会在许多匹配行中产生以下形式之一

<whatever>/Makefile:obj-$(<RELEVANT KERNEL CONFIG OPTION>) += <module name>.o`

具体来说,运行

grep -rE '\+\=\s*nf_defrag_ipv6'

在源树的根中产生

net/ipv6/netfilter/Makefile:obj-$(CONFIG_NF_DEFRAG_IPV6) += nf_defrag_ipv6.o

这告诉我这CONFIG_NF_DEFRAG_IPV6是启用nf_defrag_ipv6.

我已经在多个模块上尝试过此操作,并且总是有一个由 . 返回的这种形式的唯一行grep。现在这似乎非常容易编写脚本,粗略地说,可以生成一个哈希值

  • lsmod作为键返回的模块名称
  • 将内核配置选项匹配为值

编辑:

关于文档的一句话:原则上,上述模式可以通过所描述的 grep 发现,但真正让我注意到的是+= <object file name>中提到的语法Kconfig文档,我正在仔细阅读以获取灵感。

相关内容