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 会从断点继续,无需从头开始。
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 文件,确保系统能够挂载根文件系统。
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 菜单中选择旧内核进入系统。