如何使用支持多机硬件的localmodconfig构建自定义内核?

Pro*_*kup 9 make kernel-modules linux-kernel

将服务器配置为运行单个任务(如设备)时,可能需要构建自定义内核。例如节省磁盘空间。

Ubuntu Core 13.10 amd64 根文件系统是38 MB 的下载,其中包含所需依赖项的“linux-image-generic”元包将下载79 MB的档案,而 kernel-image-xyz-generic 包的大小仍然是14 MB .

要构建从硬件不使用的模块中剥离的内核,该make localmodconfig命令是完成这项工作的正确工具。但是,运行构建和测试环境的虚拟机加载的模块与目标部署硬件不同。和/或一段时间后,您的部署硬件可能会停产,并使用不同的硬件。并且在内核更新发布的频率上,为每个不同的硬件配置构建自定义内核可能会变得太麻烦。

如何快速构建运行在几个不同硬件盒上的自定义 Linux 内核?

Pro*_*kup 11

make localmodconfig命令仍然是该工作的正确工具。事实上make localmodconfig运行scripts/kconfig/streamline_config.pl

文件输入

在阅读streamline_config.pl(perl)源代码时,有一个未公开的功能my $lsmod_file = $ENV{'LSMOD'};允许加载模块检测的文件输入而不是lsmod命令的输出。

现场CD

因为 localmodconfig 使用输出lsmod来检测加载的模块。我们在每个不同的硬件设置上运行Ubuntu的的Live CD,打开一个终端(Ctrl+ Alt+ T),运行lsmod和保存它的输出。

连接输出

通过lsmod在剥离连续的头行的同时连接输出文件,您可以快速创建一个包含所有所需内核模块的输入文件。我们喜欢手动查看模块列表并使用更手动的方法:

  1. $ cd linux-3.11.0/
    或转到您将运行 make 命令的目录

  2. $ lsmod > lsmod.txt
    使用您加载的模块创建一个文本文件

  3. $ nano lsmod.txt
    将打开nano文本编辑器,当然你可以使用你最喜欢的编辑器应用程序

  4. 将所需的尚未存在的模块附加到此文件的底部(例如,请参见此 anwer 的底部),并在准备好后保存。
    注意:使用空格而不是制表符来匹配列制表符位置。

  5. $ make LSMOD="lsmod.txt" localmodconfig
    这将告诉 localmodconfig 使用您的 lsmod.txt 文件作为加载模块检测的输入

关于 Steven Rostedt - steamline_config.pl 的作者 - 在步骤 5 中建议使用更短的符号。


附加和不附加到 lsmod.txt 的示例(步骤 4):

因为 Intel D33217CK 主板有我们想读取的 Intel 热传感器,所以我们附加以下几行:

x86_pkg_temp_thermal   13810  0
intel_powerclamp       14239  0
Run Code Online (Sandbox Code Playgroud)

但是我们不想在这个硬件上运行虚拟机,这就是我们跳过这些行的原因:

kvm_intel             128218  0
kvm                   364766  1 kvm_intel
Run Code Online (Sandbox Code Playgroud)

它有一个 Apple (Broadcom) Gibabit 以太网适配器连接到它的 Thunderbolt 端口,所以我们附加:

tg3                   152066  0
ptp                    18156  1 tg3
pps_core               18546  1 ptp
Run Code Online (Sandbox Code Playgroud)

我们认为我们不需要卷镜像,因此不添加:

dm_mirror              21715  0
dm_region_hash         15984  1 dm_mirror
dm_log                 18072  2 dm_region_hash,dm_mirror
Run Code Online (Sandbox Code Playgroud)

而且我们也不需要图形输出(文本将在无头服务器上进行),因此我们不包括:

i915                  589697  3
i2c_algo_bit           13197  1 i915
drm_kms_helper         46867  1 i915
drm                   242354  4 i915,drm_kms_helper
Run Code Online (Sandbox Code Playgroud)

对于另一台机器,我们还需要这个 Realtek 以太网驱动程序:

r8169                  61434  0
mii                    13654  1 r8169
Run Code Online (Sandbox Code Playgroud)