10

我现在正在开发内核模块,构建时间已经开始在我的皮肤之下。作为一个副作用,我在构建过程中需要太多的“咖啡”休息时间。

所以我一直在寻找一种方法来只构建我的平台所需的东西。“linux kernel in a nutshell”的第 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 里面。这些 vbox 模块是在我选择安装“virtualbox guest addtion”时安装的。

并且 netfilter 模块可能是一个特定于发行版的模块(很多 netfilter 模块不是主线内核的一部分,所以这对我来说并不令人震惊),它不包含在主线内核中。

现在的解决方法显然是卸载这些模块并重试。但我在想是否有补丁streamline_config.pl可以让用户在她/他想要的时候排除某些模块。问题是我对 perl 的了解为零,我喜欢这样。

所以简而言之我的问题

  1. 修补streamline_config.pl,以便我可以提供模块名称列表作为参数,它将从处理配置文件中排除。

    该脚本位于kernel.org

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

4

1 回答 1

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-get或安装它yum。在 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

于 2012-07-14T11:41:53.897 回答