目录

centos7平台openvz内核编译过程

本文记录了从零开始在 CentOS 7 搭建开发环境到最终生成你的 kernel 可执行文件,并且确保最终可在 CentOS 7 上部署。这个流程适合新机器或干净环境。

我会按步骤分为 环境准备 → 配置编译 → 安装 → 引导


1️⃣ 环境准备

更新系统

sudo yum update -y

sudo yum groupinstall “Development Tools” -y

sudo yum install epel-release -y

sudo yum install wget tar bzip2 make cmake git -y

安装编译内核所需软件

yum install -y \
gcc \
gcc-c++ \
make \
ncurses-devel \
bc \
bison \
flex \
elfutils-libelf-devel \
perl \
wget \
git \
rpm-build \
rpmdevtools \
openssl-devel \
readline-devel \
zlib-devel \
bc \
libselinux-devel \
gettext \
elfutils-devel \
expat-devel

解释:

gcc / gcc-c++ / make → 编译工具 ncurses-devel → make menuconfig 需要 bc / bison / flex → 内核编译必备 elfutils-libelf-devel → 内核模块编译 perl → make / RPM 编译脚本依赖 wget / git → 下载源码 rpm-build / rpmdevtools → 打包成 RPM openssl-devel / readline-devel / zlib-devel → 编译内核配置工具 libselinux-devel / gettext / expat-devel → RPM 构建依赖

执行完后,你的 CentOS7 最小镜像就具备 完整内核编译能力,可以继续下载 vzkernel 源码、配置 BBR 并编译 RPM。


2️⃣ 创建 RPM 构建目录

rpmdev-setuptree

会在 ~/rpmbuild 下创建 SOURCES、SPECS 等目录


3️⃣ 克隆 vzkernel7 / 3.10 源码

下载源码

cd ~/rpmbuild/SOURCES
git clone -b branch-rh7-3.10.0-1160.129.1.vz7.226.x-ovz \
https://bitbucket.org/openvz/vzkernel.git branch-rh7-3.10.0-1160.129.1.vz7.226.x-ovz

注意:这个仓库很大(2–3GB),耐心等待克隆完成。

cd ~/rpmbuild/SOURCES/branch-rh7-3.10.0-1160.129.1.vz7.226.x-ovz

可选方法:先清理 Git 元信息

如果你不在意源码控制,可以:

git clean -fdx
git reset --hard

make mrproper

4️⃣ 编译rpm

复制配置文件

cp config.OpenVZ .config

关闭调试符号(关键步骤)

内核源码提供了一个快捷修改配置的工具 scripts/config。运行以下命令彻底关闭所有调试相关的肥大选项:

./scripts/config --disable CONFIG_DEBUG_INFO
./scripts/config --disable CONFIG_DEBUG_INFO_DWARF_TOOLCHAIN_TESTED
./scripts/config --disable CONFIG_DEBUG_INFO_DWARF4
./scripts/config --disable CONFIG_DEBUG_INFO_DWARF5
./scripts/config --disable CONFIG_DEBUG_INFO_BTF
./scripts/config --disable CONFIG_DEBUG_INFO_REDUCED
./scripts/config --disable CONFIG_DEBUG_INFO_SPLIT

刷新配置并检查

执行 make oldconfig。如果在交互界面中仍旧弹出了关于 DEBUG_INFO 的新选项,务必全部选择 N:

make oldconfig

编译打包

现在再次运行编译。为了保险起见,可以加上 INSTALL_MOD_STRIP=1(尝试让系统在打包模块时进行剥离):

make rpm-pkg LOCALVERSION=-vz7 INSTALL_MOD_STRIP=1


5️⃣ RPM安装

强行用 RPM 安装核心包

既然 Yum 犯傻提示“无需任何处理”,我们绕过 Yum,直接用 rpm 命令强行安装(或升级)它。

强行安装内核包: [root@haoyuli rpm]# rpm -ivh –force kernel-headers-3.10.0_1160.129.1.ovz7.226.2_haoyu.app-1.x86_64.rpm [root@haoyuli rpm]# rpm -ivh –force kernel-3.10.0_1160.129.1.ovz7.226.2_haoyu.app-1.x86_64.rpm 验证是否成功写入 RPM 数据库:

rpm -qa | grep kernel 此时应该能同时看到 kernel-headers-… 和 kernel-3.10.0_1160…。

手动补全 initramfs 镜像(关键一步)

因为 make rpm-pkg 偷懒没帮你做,现在我们必须手动用 dracut 为这个新内核生成驱动底座。

获取你新内核的精确版本字符串:

查看 /lib/modules/ 目录下新生成的文件夹名称:

[root@haoyuli ~]# ls /lib/modules/

3.10.0-1160.129.1.ovz7.226.2-haoyu.app

假设看到的文件夹名字是 3.10.0_1160.129.1.ovz7.226.2_haoyu.app(请以你实际看到的为准)。

手动执行 dracut 生成镜像:

[root@haoyuli ~]# dracut -f /boot/initramfs-3.10.0-1160.129.1.ovz7.226.2-haoyu.app.img 3.10.0-1160.129.1.ovz7.226.2-haoyu.app

注:这一步可能需要几十秒,请耐心等待它结束。成功后,你可以去 /boot 目录下看一眼,initramfs 应该有几兆到几十兆大。


6️⃣ 手动更新 GRUB 引导

既然内核文件和镜像文件都齐了,我们需要让 GRUB 引导程序知道它们的存在。

强制刷新 GRUB 菜单

(它会自动扫描 /boot 下刚刚补全的内核和镜像):

如果是传统 BIOS 引导

grub2-mkconfig -o /boot/grub2/grub.cfg

如果是 UEFI 引导

grub2-mkconfig -o /boot/efi/EFI/centos/grub.cfg

检查新内核是否已经变成第一启动项:

awk -F' ‘$1==“menuentry " {print i++ " : " $2}’ /boot/grub2/grub.cfg

看一眼你新编译的内核是不是排在 0 : 的位置。如果不是,用 grub2-set-default [索引号] 把它设为默认。

或者通过 grubby 工具查看:

grubby –info=ALL | grep -E “kernel=|index=”

在输出列表中,找到你刚刚编译的 3.10.0_1160…ovz7 内核对应的 索引号(Index)(通常最新的内核索引是 0)。

设置新内核为默认启动项(假设你的新内核索引号是 0)

grub2-set-default 0

安心重启

reboot

[root@haoyuli ~]# uname -a Linux haoyuli.cn 3.10.0-1160.129.1.ovz7.226.2-haoyu.app #1 SMP Wed May 20 07:58:46 CEST 2026 x86_64 x86_64 x86_64 GNU/Linux