前言
合理选择配置选项是平衡内核性能、灵活性和稳定性的关键。
一、Linux 内核编译流程
1. 准备工作
(1) 安装编译工具和依赖
#Debian/Ubuntu
sudo apt update
sudo apt install build-essential libncurses-dev flex bison libssl-dev libelf-dev
#CentOS/RHEL
sudo yum groupinstall "Development Tools"
sudo yum install ncurses-devel openssl-devel elfutils-libelf-devel
(2) 获取内核源代码
方式一
方式1:从 kernel.org 下载稳定版源码(如 linux-6.x.x.tar.xz)。
方式二
方式2:使用系统包管理器获取(以 Ubuntu 为例):
apt source linux-source
(3) 解压源码
tar -xvf linux-6.x.x.tar.xz
cd linux-6.x.x
2. 配置内核选项
(1) 选择配置方式
基于当前系统配置(推荐新手)
cp /boot/config-$(uname -r) .config
make oldconfig
图形化配置工具
make menuconfig # 基于终端的图形界面(需安装 libncurses-dev)
make xconfig # 基于 Qt 的图形界面
(2) 配置选项说明
在配置界面中,每个选项有三种状态:
*(编译进内核)
*(编译进内核):功能直接集成到内核映像(vmlinuz),无法卸载。
M(编译位模块)
M(编译为模块):功能编译为独立的 .ko 文件(内核模块),可在运行时动态加载。
>(空格,未选中)
(空格,未选中):不包含此功能。
3. 编译内核
(1) 启动编译
#-jN 指定并行编译的线程数(N=CPU核心数×2,如 -j8)
make -j$(nproc)
编译时间:通常需要 30 分钟到数小时,取决于硬件性能和内核配置。
(2) 编译产物
内核映像
内核映像:arch/x86/boot/bzImage(x86 架构)。
内核模块
内核模块:所有标记为 M 的选项会被编译为 .ko 文件。
4. 安装内核
(1) 安装内核模块
sudo make modules_install
模块会被安装到 /lib/modules/新内核版本/。
(2) 安装内核映像
sudo make install
内核映像(vmlinuz)和初始化内存盘(initramfs)会被复制到 /boot/。
自动更新 GRUB 引导菜单(需确认 /etc/default/grub 配置正确)。
5. 重启系统并验证
sudo reboot
#重启后检查内核版本
uname -r
二、* 和 M 选项对内核编译的影响
1. *(编译进内核)
优点
功能直接集成到内核,无需手动加载模块。
启动时自动加载,适合核心功能(如文件系统、关键驱动)。
缺点
增大内核体积,占用更多内存。
无法动态卸载,修改功能需重新编译内核。
适用场景
- 系统启动必需的功能(如 ext4 文件系统、磁盘控制器驱动)。
- 高频使用的功能(如网络协议栈)。
2. M(编译为模块)
优点
内核体积更小,内存占用更低。
模块可动态加载/卸载,灵活性强。
方便调试和更新(无需重新编译整个内核)。
缺点
需要手动加载模块(如 modprobe 模块名)。
依赖模块加载顺序,配置不当可能导致功能失效。
适用场景
- 不常用的硬件驱动(如特殊外设驱动)。
- 可选功能(如某些网络协议、虚拟化支持)。
3. 配置策略示例
功能 推荐选项 理由
文件系统(ext4) * 系统启动必需,需直接集成到内核
USB 驱动 M 按需加载,减少内核体积
网络驱动(e1000e) M 仅在有对应硬件时加载
内核调试支持 非必要功能,生产环境不启用
三、注意事项
备份旧内核
编译前确保 /boot 有足够空间。
保留旧内核,防止新内核无法启动:
sudo cp /boot/vmlinuz-$(uname -r) /boot/vmlinuz-$(uname -r).bak
精简配置
初次编译可使用 make localmodconfig,仅编译当前加载的模块。
移除未使用的驱动和功能以减少编译时间。
调试与日志
编译失败时检查 make 输出的错误信息。
查看详细日志:dmesg | tail -n 50。
四、总结
内核编译流程:准备环境 → 配置选项 → 编译 → 安装 → 重启验证。
|* 和 M 选项:
|* 适合核心功能,直接集成到内核。
|M 适合可选功能,动态加载节省资源。