如何编译并测试 Linux 内核

编译 Linux 内核,并在用户态 Linux 进程(User Mode Linux)或实际环境中进行测试。

获取内核源码

  • https://www.kernel.org 下载最新版本的内核代码,如 linux-4.19.12.tar.xz
  • 使用 tar -xvf linux-4.19.12.tar.xz 解压。

User Mode Linux(UML)

介绍

用户态 Linux 在 http://user-mode-linux.sourceforge.net 有比较详细的介绍,其主要目的在于将内核编译为独立的可执行文件 linux,并作为用户态的进程运行,从而允许比较方便地对内核进行调试。为了使用编译用户态 Linux,需指定环境变量 ARCHum,或在每次 make 命令中添加 ARCH=um 参数。不过因为指定了特殊的架构,用户态 Linux 的缺点就在于一些仅由其他架构如 x86-64arm 等支持的特性就无法使用了。

编译

  • 设置编译架构 export ARCH=um
  • 清理编译环境 make mrproper
  • 设置默认编译选项 make defconfig
  • 通过菜单设置编译选项 make menuconfig
  • 最终编译 make

文件系统

仅依靠 Linux 的可执行文件是无法启动的,还需要提供至少一个文件系统,并挂载为系统内的根目录 / 或某个设备 /dev/ubda 上。这里所说的文件系统实际上是一个镜像文件(Image),包含了默认 Linux 文件系统的一些内容,根据情况还可能嵌入了一些工具包,如 Glibc 等,但是会导致镜像文件偏大。可以参考在 http://fs.devloop.org.uk 列出的一些文件系统。

此处选择 64 位的 Gentoo,使用 bunzip -d Gentoo-AMD64-root_fs.bz2 解压后即可得到其镜像文件。

启动

  • 使用命令 ./linux ubda=Gentoo-AMD64-root_fs 启动用户态 Linux 进程。
  • 其他更详细的启动参数可以参考 ./linux --help

实际环境

介绍

在实际环境部署内核时,需要将新编译的内核安装至系统目录,修改引导项,重新启动后才能进入新编译的内核。

编译

  • 整体编译流程和 UML 相同,只是不需要另外指定 ARCH
  • 可以生成默认的配置文件,也可以从 /boot 目录下复制当前系统的配置文件。

安装

  • 安装模块 make modules_install
  • 安装内核 make install

启动

若使用 Grub 进行引导启动,则引导文件为 /boot/grub/menu.lst,并且在安装内核的过程中会提示是否自动修改。之后可以选择把新内核放在第一个,并设置 fallback=1,从而在新内核启动失败后自动切换为旧内核。