本文主要记录内核编译配置的相关内容。

/proc/config.gz

1
zcat /proc/config.gz

Linux 可以在内核本身存储用于内核构建的 gzip 内核配置文件副本,并通过 /proc/config.gz 提供给用户。也就是说,/proc/config.gz 就是当前的 Linux 内核配置文件,并且是用 gzip 格式压缩过的。

但不是所有的 Linux 发行版都有 /proc/config.gz 文件,大部分常见的 Linux 发行版就没有提供,比如 Ubuntu。只有当内核配置 CONFIG_IKCONFIGCONFIG_IKCONFIG_PROCy,才会在 /proc 中出现 config.gz 文件。当然,即使大多数发行版没有提供 /proc/config.gz,仍然可以通过 /boot 查看内核配置信息。

/boot 内核配置信息

1
2
3
cat /boot/config-5.4.0-80-generic

cat /boot/config-$(uname -r)

make oldconfig

It reads the existing .config file that was used for an old kernel and prompts the user for options in the current kernel source that are not found in the file. This is useful when taking an existing configuration and moving it to a new kernel.

使用其他 (通常是较旧的) 内核版本的 .config 文件时,需要先更新它。可以使用 make oldconfig 命令,以交互方式询问对新配置的选择。

make olddefconfig 的含义为:采用已有的.config文件的参数作为默认参数,同时升级依赖属性,新属性设置为默认值不再提醒。

mkinitramfs

1
2
3
mkinitramfs -o /boot/initrd.img 2.6.24-16

mkinitramfs -o <full_path_to_initrd> <kernel_version>

Note: 2.6.24-16是需要创建initramfs的kernel版本号,如果是给当前kernel制作initramfs,可以用uname -r查看当前的版本号。提供kernel版本号的主要目的是为了在initramfs中添加指定kernel的驱动模块。mkinitramfs会把/lib/modules/${kernel_version}/目录下的一些启动会用到的模块添加到initramfs中。

load a module in initrd

1
2
3
4
5
6
7
8
9
10
11
12
cat /etc/initramfs-tools/modules
# List of modules that you want to include in your initramfs.
# They will be loaded at boot time in the order below.
#
# Syntax: module_name [args ...]
#
# You must run update-initramfs(8) to effect this change.
#
# Examples:
#
# raid1
# sd_mod

Add the names of the modules to /etc/initramfs-tools/modules . This added the modules to the initrd file. Update the initrd file by update-initramfs -u

update-initramfs -u更新当前kernel的initramfs。在添加模块时,initramfs tools只会添加一些必要模块,用户可以通过在/etc/initramfs-tools/modules文件中加入模块名称来指定必须添加的模块。

INSTALL_MOD_PATH

1
make modules_install INSTALL_MOD_PATH=out/

The INSTALL_MOD_PATH variable is needed to install the modules in the target root filesystem instead of your host root filesystem.

Linux 内核编译 LOCALVERSION 配置

  • LOCALVERSION 可以在版本号之后追加后缀信息, 如果再定义 CONFIG_LOCALVERSION_AUTO, 将在最后进一步追加 git 版本号为后缀信息.

  • 不定义CONFIG_LOCALVERSION_AUTO 将不显示 git 仓库信息, 如果此时 LOCALVERSION 变量也未定义, 将追加 “+”.

  • 如果既不想添加后缀, 又不想有 "+" 号 : 不定义CONFIG_LOCALVERSION_AUTO, 将 LOCALVERSION 变量定义为空 : LOCALVERSION=.

    1
    make -j8 bindeb-pkg LOCALVERSION=

参考资料:

  1. Linux内核编译和替换小结
  2. /proc/config.gz 是什么
  3. What does “make oldconfig” do exactly in the Linux kernel makefile?
  4. How to load a module in initrd?
  5. 制作initramfs/initrd镜像
  6. Linux 内核编译 LOCALVERSION 配置(分析内核版本号自动添加的”+”号)