【问题标题】:Why am am able to load a kernel module when the kernel config says "not set" for that module?当内核配置为该模块显示“未设置”时,为什么能够加载内核模块?
【发布时间】:2022-10-19 08:03:43
【问题描述】:

我在目标系统上有一个内核(4.14.136),其中 netfilter 多端口匹配支持未配置为内置或可加载模块:

$ zgrep MULTIPORT /proc/config.gz
# CONFIG_NETFILTER_XT_MATCH_MULTIPORT is not set

正如预期的那样,尝试将multiportiptables 一起使用不起作用:

$ iptables -A OUTPUT -o eth1 -p udp -m multiport --dports 1111,2222 -j LOG
iptables v1.8.2 (legacy): Couldn't load match `multiport':No such file or directory

在开发机器上,我将内核重新配置为支持multiport 作为模块,运行make modules 并将新的模块文件net/netfilter/xt_multiport.ko 复制到目标机器。我没有重新启动目标,所以内核仍然是没有配置multiport 模块的“旧”内核。

在目标上,新的 multiport 模块加载没有问题或错误:

$ zgrep MULTIPORT /proc/config.gz
$ CONFIG_NETFILTER_XT_MATCH_MULTIPORT is not set
$ insmod /root/xt_multiport.ko
$ lsmod
Module                  Size  Used by
xt_multiport            4921  

我现在可以添加之前失败的iptables 规则。现在,当我将数据包发送到端口 1111 或 2222 时,该规则会将条目发送到 syslog,因此 multiport 模块似乎正在工作。

这是为什么?如果您尝试加载在内核配置中设置为“未设置”的模块,我认为内核会给您错误。

【问题讨论】:

  • .config 由内核在构建时使用,而不是在运行时使用。请注意,定义可能会在其他地方使用,因此您的计划在某些情况下会失败。
  • 我不明白你的问题。在第一部分,您没有编译模块。内核尝试加载模块并找不到匹配模块并给您一个错误。所以你有一个错误。模块通常独立于主内核(因此有用),因此内核不应该知道您编译了哪些模块。
  • @stark 我的问题是基于我的(错误的)假设,即内核只能加载内核.config 中设置为=m 的模块。因此我很困惑为什么不是这样。首先,我不确定您对我们的评论是什么意思,但现在在阅读了@MarcoBonelli 的回答后,我明白了您的意思。
  • @GiacomoCatenazzi 我以为我有问题,但实际上一切都按预期工作! :D 关于缺少模块的第一个错误是预期的。我感到困惑的是关于没有问题的模块加载的后半部分。但这是由于我对内核 .config 和模块加载的误解。

标签: linux linux-kernel


【解决方案1】:

配置未设置或设置为=n 并不意味着内核将无法加载模块。这仅意味着在配置和构建内核时,该模块没有构建(否则您会看到=y=m)。如果您获得适当版本的内核源代码并自己配置和构建模块,您仍然可以将其加载到内核中。

事实上,这正是任何外部模块添加到现有内核的方式。例如,当 Wireguard 仍未合并到内核源代码中时,安装它也需要编译和安装 wireguard 内核模块。

【讨论】:

  • 谢谢,我在想也许是这样,但想不出好的搜索词会导致任何确认。我一直假设当一个模块配置为=m 时,内核是用一个特殊的“连接点”构建的,以便可以在运行时加载特定的模块。这也是一个很大(但令人愉快!)的惊喜,即使内核配置和构建时模块设置为=n,仍然可以稍后编译模块并且内核将加载它。
猜你喜欢
  • 2018-03-09
  • 2016-03-25
  • 2018-12-24
  • 2018-06-18
  • 1970-01-01
  • 2018-08-28
  • 1970-01-01
  • 2019-05-18
  • 2012-03-14
相关资源
最近更新 更多