在 CentOS 上使用 GCC 编译内核的标准流程
一 准备与依赖安装
- 安装基础编译工具与依赖(建议使用 root 或具备 sudo 权限的账号):
- CentOS 7/8 常用:sudo yum groupinstall “Development Tools” -y
- 安装内核构建依赖:sudo yum install -y gcc make ncurses-devel openssl-devel elfutils-libelf-devel bc flex bison rpm-build xmlto asciidoc hmaccalc perl-ExtUtils-Embed pesign binutils-devel audit-libs-devel numactl-devel pciutils-devel python-devel zlib-devel
- 空间与版本建议:
- 预留至少15 GB可用磁盘空间(内核与模块体积较大)。
- 若系统 GCC 版本较旧,建议使用 SCL 启用较新的 devtoolset(示例:devtoolset-9),命令:scl enable devtoolset-9 bash(仅当前会话生效;如需持久化,可添加到 profile)。
二 获取内核源码
- 方式 A 主线内核(kernel.org):
- 下载:wget https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-6.9.4.tar.xz
- 解压:tar -xf linux-6.9.4.tar.xz -C /usr/src/
- 进入目录:cd /usr/src/linux-6.9.4
- 方式 B CentOS 定制内核(推荐用于生产环境保持兼容性):
- 通过 SRPM 构建源码树:
- 安装源码包:rpm -i kernel-.src.rpm
- 准备构建目录:mkdir -p ~/rpmbuild/{BUILD,BUILDROOT,RPMS,SOURCES,SPECS,SRPMS}
- 解压与打补丁:rpmbuild -bp --target=$(uname -m) ~/rpmbuild/SPECS/kernel.spec
- 源码位于:~/rpmbuild/BUILD/kernel-/linux-/
- 或直接从 CentOS 的 git 仓库获取并拉取对应源码包(适用于需要精确匹配 CentOS/RHEL 补丁的场景)。
三 配置编译参数
- 准备 .config(三选一或组合):
- 沿用当前系统配置并交互升级:cp /boot/config-$(uname -r) .config && make oldconfig
- 文本菜单配置:make menuconfig(需 ncurses-devel)
- 全新配置:make defconfig(最小化配置,后续按需开启)
- 配置要点:
- 不熟悉时可保持绝大多数选项为默认,仅调整必要项。
- 使用 make menuconfig 时,熟悉以下标记含义:[*] 编译进内核, 编译为模块,[ ] 不启用。
四 编译与安装
- 编译(并行加速,示例为 4 线程,可按 CPU 核心数调整):
- 仅构建内核与模块:make -j4
- 同时生成 debuginfo(可选,体积大耗时长):make -j4 all
- 安装模块与内核镜像:
- 安装模块:sudo make modules_install
- 安装内核:sudo make install(会将 vmlinuz、initramfs、System.map 复制到 /boot,并更新 initramfs)
- 更新引导(GRUB2):
- 生成配置:grub2-mkconfig -o /boot/grub2/grub.cfg
- 如需设置默认启动项,可编辑 /etc/default/grub 后再次生成配置。
五 验证与回退
- 重启并验证:
- 重启:sudo reboot
- 查看版本:uname -r(应显示新内核版本)
- 查看默认启动项:grub2-editenv list
- 常见问题与回退建议:
- 若新内核无法启动,可在 GRUB 菜单选择旧内核进入系统,检查日志(/var/log/messages、dmesg),必要时卸载新内核相关文件并恢复 GRUB 配置。
- 不建议直接编辑 /boot/grub2/grub.cfg,优先使用 grub2-mkconfig 维护引导配置。