3. 内核编译与安装:从源码到可引导系统

完成内核配置后,下一步是将配置转化为可执行的二进制文件,并将其安装到系统中。本章节详细讲解 make 系列命令的完整流程,包括并行编译、模块编译与安装、内核安装以及引导更新,确保你能够正确、高效地完成内核部署。

3.1 编译内核:make -jN

make -jN 是编译内核的核心命令,其中 N 代表并行编译的作业数。合理设置 N 值可以显著缩短编译时间。

参数 说明 推荐值
-jN 并行作业数 CPU 物理核心数 + 1 或 2
make 默认单线程编译 不推荐,速度极慢
make -j$(nproc) 自动使用所有 CPU 核心 最常用,平衡负载
性能提示: 使用 nproc 命令可查看当前 CPU 核心数。对于大型服务器(如 64 核),建议使用 make -j$(nproc) 或 make -j$(nproc-2) 以避免内存耗尽。
# 进入内核源码目录
cd /usr/src/linux

# 使用所有 CPU 核心并行编译内核
make -j$(nproc)

# 或者手动指定作业数(例如 4 核 CPU)
make -j5

编译过程会生成 vmlinux(未压缩的内核映像)和 arch/x86/boot/bzImage(压缩后的可引导内核)。

常见错误: 如果编译过程中断,重新执行 make -jN 会从断点继续,无需从头开始。
内核编译流程(make -jN) 内核源码目录 .config 配置文件 make -jN 编译 读取配置 编译决策 vmlinux(未压缩) bzImage(可引导) 说明:make -jN 并行编译所有源文件,最终生成 vmlinux 和 bzImage

3.2 编译模块:make modules

内核模块是独立编译的代码片段,可在运行时动态加载。执行 make modules 会编译所有配置为 M 的模块。

# 编译所有内核模块
make modules -j$(nproc)

# 编译特定模块(例如 ext4 文件系统模块)
make M=fs/ext4 -j$(nproc)
注意: 如果之前已经执行过 make -jN,则 make modules 只会编译尚未编译的模块,不会重新编译整个内核。

3.3 安装模块:make modules_install

模块编译完成后,需要将其安装到标准位置,以便内核在启动时或运行时加载。

# 安装所有模块到 /lib/modules/<kernel_version>/
make modules_install

安装后的目录结构如下:

/lib/modules/6.8.0-custom/
├── kernel/          # 模块文件(.ko)
│   ├── arch/
│   ├── crypto/
│   ├── drivers/
│   ├── fs/
│   └── net/
├── modules.alias    # 模块别名映射
├── modules.dep      # 模块依赖关系
├── modules.symbols  # 符号表
└── modules.builtin  # 内建模块列表
文件/目录 作用
kernel/ 存放所有编译好的 .ko 模块文件
modules.dep 记录模块间的依赖关系,modprobe 依赖此文件
modules.alias 提供设备别名到模块名的映射
modules.symbols 记录模块导出的符号

3.4 安装内核:make install

内核安装命令会将编译好的内核映像、System.map 和配置文件复制到 /boot 目录,并自动更新引导配置。

# 安装内核到 /boot 目录
make install

安装后 /boot 目录会新增以下文件:

/boot/
├── vmlinuz-6.8.0-custom    # 压缩后的内核映像
├── System.map-6.8.0-custom # 内核符号表
├── config-6.8.0-custom     # 本次编译使用的配置文件
└── initrd.img-6.8.0-custom # 初始 RAM 磁盘(由 mkinitramfs 生成)
注意: make install 会自动调用 mkinitramfs 或 dracut 生成 initrd 文件,确保系统能够挂载根文件系统。
内核安装流程(make install) 编译产物 bzImage, System.map, .config make install 复制 + 生成 initrd /boot/ 目录 vmlinuz, System.map, config, initrd 安装过程详解 1. 将 bzImage 复制为 /boot/vmlinuz-{version} 2. 将 System.map 复制为 /boot/System.map-{version} 3. 将 .config 复制为 /boot/config-{version} 4. 自动调用 mkinitramfs/dracut 生成 initrd.img-{version}

3.5 更新 GRUB 引导

安装内核后,需要更新 GRUB 引导配置,使新内核出现在启动菜单中。

# 对于传统 BIOS 系统
update-grub

# 或者手动执行 grub-mkconfig
grub-mkconfig -o /boot/grub/grub.cfg

# 对于 UEFI 系统
grub-mkconfig -o /boot/efi/EFI/grub/grub.cfg
验证方法: 重启系统后,在 GRUB 菜单中选择新编译的内核。进入系统后执行 uname -r 确认内核版本。

3.6 完整编译安装流程总结

以下是一个完整的、可复制的编译安装命令序列:

#!/bin/bash
# 完整的内核编译与安装脚本

# 1. 清理之前的编译产物(可选)
make mrproper

# 2. 配置内核(使用现有配置或默认配置)
make defconfig  # 或使用 make menuconfig 自定义

# 3. 编译内核和模块
make -j$(nproc)
make modules -j$(nproc)

# 4. 安装模块
make modules_install

# 5. 安装内核
make install

# 6. 更新 GRUB 引导
update-grub

echo "内核编译安装完成!请重启系统。"
步骤 命令 耗时参考 关键输出
1 make -j$(nproc) 5-30 分钟 vmlinux, bzImage
2 make modules 2-15 分钟 .ko 模块文件
3 make modules_install 1-2 分钟 /lib/modules/{version}/
4 make install 1-3 分钟 /boot/vmlinuz-{version}
5 update-grub 几秒钟 更新 /boot/grub/grub.cfg
重要提醒: 在安装新内核前,建议保留一个已知可用的旧内核。如果新内核无法启动,可以在 GRUB 菜单中选择旧内核进入系统。