尝试使用shell脚本查找我的机器所需的所有内核模块

时间:2012-07-13 12:24:01

标签: linux perl kernel kernel-module

我正在开发内核模块,构建时间开始受到我的影响。作为副作用,我在构建期间采取了太多的“咖啡”休息时间。

所以我一直在寻找一种方法来构建我的平台所需的东西。 “Linux内核简介”的第7章和第8章详细介绍了如何手动完成。好读:http://www.kroah.com/lkn/

但是虽然我理解这些东西,但仍然需要进行大量的调整才能实现这一目标。

2.6.32及更高版本的内核添加了新目标make localmodconfig。它会扫描lsmod并相应地更改.config。所以我以为我找到了“自动化”。但是这个perl脚本也存在一些问题。

此主题描述了问题:https://bbs.archlinux.org/viewtopic.php?pid=845113

还有一个显然适用于其他人的建议解决方案是直接运行脚本而不是使用make的目标。

虽然对我来说,make localmodconfig根本不起作用。因为以下原因:

make clean
make mrproper
cp /boo/config-'uname -r' .config
make localmodconfig

然后停止

vboxguest config not found!!
nf_defrag_ipv6 config not found!!
vboxsf config not found!!
vboxvideo config not found!!

问题是我的内核开发环境是在virtualbox里面。当我选择安装“virtualbox guest addtion”时安装了这些vbox模块。

netfilter模块可能是一个特定于分发的模块(许多netfilter模块不是主线内核的一部分,因此对我来说不是一件令人震惊的事),这不包含在主线内核中。

现在解决方法明显卸载这些模块并再次尝试。但我在想是否有streamline_config.pl的补丁,这将使用户能够在他/她想要时排除某些模块。问题是我对perl有知识,我喜欢这样。

所以我在 nutshell

中的问题
  1. 修补streamline_config.pl所以我可以给出一个模块名称列表作为参数,它将从处理配置文件中排除。

    该脚本位于kernel.org

  2. 编辑:删除了有关未运行的perl脚本的内容。正如mugen kenichi指出的那样(我多么愚蠢?)。但仍然使localmodconfig无效,因为源树下没有一些模块代码。修补streamline_config.pl仍然是有效的要求。

1 个答案:

答案 0 :(得分:10)

其他任何尝试构建最小内核映像的人也在寻找减少构建时间,应该执行以下操作:

1)在源树中复制分发内核配置。可以使用以下任一命令完成:

$zcat /proc/config.gz > .config

$cp /boot/config-'uname -r' .config

2)使用localmodconfig目标。

$make localmodconfig

它将使用lsmod来查找此时加载的模块。然后它将搜索发行版的.config以启用它们并禁用其他。

重要的是要知道它并不总是完美无缺。因此,您应该使用make menuconfig进一步调整配置。您将看到仍然标记了一些模块,这对您的系统来说实际上是不必要的。

有时,树模块可能会导致make localmodconfig失败。如果是这种情况,您可以通过两种方式解决该问题:

a)卸载树模块并再次尝试make localmodconfig。 b)直接运行perl脚本:

$chmod +x script/kconfig/streamline_config.pl
$perl script/kconfig/streamline_config.pl > .config

3)安装ccache [1]。它将显着改善您的构建时间。它缓存对象。因此,它将减少后续构建。

ccache可能包含在发行版的存储库中,因此您可以通过apt-getyum进行安装。在CentOS中,它可以在EPEL回购中找到[2]

4)为构建作业提供尽可能多的内核

$make -j8 CC="ccache gcc"

我的结果是:

real 3m10.871s
user 4m36.949s
sys 1m52.656s

[1] http://ccache.samba.org/ [2] http://fedoraproject.org/wiki/EPEL