银河麒麟v11源码(cri-o)编译rpm包全流程详解
详解银河麒麟v11源码编译为rpm包全流程
很多小伙伴在银河麒麟高级服务器操作系统v11下部署服务时还是习惯于使用rpm包部署,即简单,又快捷,但是kylinos v11默认的base和update源中又没有我们项目中所需服务指定版本的rpm包,这时就需要考虑自己制作rpm包,来实现rpm包自由。
准备工作
在kylinos v11中进行rpm打包与v10的流程基本一致,都是通过rpmbuild来完成。
本次我们使用比较常见的容器服务cri-o 1.35.0版本来进行演示,首先将构建前的准备工作完成。
下载cri-o源码
https://github.com/cri-o/cri-o/archive/refs/tags/v1.35.0.zip
安装编译环境
安装golang
因为cri-o为golang编写,且v1.35.0所使用的golang版本为1.25.0,v11 yum源中并无此版本的golang环境,所以本次采用二进制安装的方式。
-
1. 根据你的架构,下载golang二进制包: https://go.dev/dl/go1.25.0.linux-amd64.tar.gz -
2. 解压: tar -C /usr/local -xzf go1.25.0.linux-amd64.tar.gz -
3. 配置环境变量vim ~/.bashrc # Go 安装路径(默认)export GOROOT=/usr/local/go# 可执行文件加入系统 PATHexport PATH=$PATH:$GOROOT/bin# 工作区(存放源码、编译二进制、依赖)export GOPATH=$HOME/go# 模块缓存路径export GOCACHE=$HOME/.cache/go-build# 国内模块代理(必配,否则下载依赖极慢)export GOPROXY=https://goproxy.cn,direct# 启用 Go Modules(1.16+ 默认开启)export GO111MODULE=on -
4. 生效配置: source ~/.bashrc -
5. 在工作区下创建对应目录 cd$HOME/gomkdir src bin pkg# src/:源码# bin/:编译后的可执行文件# pkg/:依赖包缓存 -
6. 使用 go version、go env来检查配置是否正确
安装编译cri-o所需依赖
yum install -y \ containers-common \ git \ make \ glib2-devel \ glibc-devel \ glibc-static \ crungo get github.com/cpuguy83/go-md2manyum install -y \ libassuan \ libassuan-devel \ libgpg-error \ libseccomp-devel \ libselinux \ pkgconf-pkg-config \ gpgme-devel \
安装rpmbuild等打包环境
yum install -y rpm-build rpmdevtools brp-chrpath
开始制作
准备工作完毕后,进入制作阶段。
创建rpmbuild标准目录
# 普通用户执行即可,不需要 rootrpmdev-setuptree
执行后会在当前用户家目录生成:
~/rpmbuild/├── BUILD # 编译临时目录├── BUILDROOT # 安装根目录├── RPMS # 最终生成的 rpm 包(重点)├── SOURCES # 源码包放这里├── SPECS # 编译脚本 spec 文件放这里└── SRPMS # 源码 rpm 包
编辑构建目录
-
1. 将cri-o源码放置SOURCES目录下 mv cri-o-1.35.0.zip ~/rpmbuild/SOURCES/ -
2. SPECS下创建cri-o.spec文件,完整配置如下: vim cri-o.spec # 禁用自动生成debuginfo包%global debug_package %{nil}%define _enable_debug_packages 0Name: cri-oVersion: 1.35.0Release: 1%{?dist}Summary: Kubernetes CRI implementation for OCILicense: ASL 2.0URL: https://cri-o.io/# 这里包名要注意下,需要和SOURCES目录下源码包名匹配到Source0: https://github.com/cri-o/cri-o/cri-o-%{version}.zip# 编译依赖,编译时所需的依赖环境(编译机)BuildRequires: golang >= 1.25.0BuildRequires: makeBuildRequires: gcc# 运行依赖,安装时所需的依赖环境(安装机)Requires: conmon >= 2.1Requires: runcRequires: container-selinux%descriptionCRI-O is an implementation of the Kubernetes CRI (Container Runtime Interface)to enable using OCI (Open Container Initiative) compatible runtime.%prep%setup -q%build# 编译 cri-o(官方编译命令)make%install# 1. 官方安装命令(关键!自动安装所有文件)make install DESTDIR=%{buildroot}# 2. 创建系统标准 systemd 目录(宿主机识别的路径)mkdir -p %{buildroot}/usr/lib/systemd/system# 3. 把服务文件 从默认路径 移动到 系统标准路径mv %{buildroot}/usr/local/lib/systemd/system/crio.service %{buildroot}/usr/lib/systemd/system/mv %{buildroot}/usr/local/lib/systemd/system/crio-wipe.service %{buildroot}/usr/lib/systemd/system/# 4. 删除默认路径的空目录(必须删!否则报"未打包文件"错误)rm -rf %{buildroot}/usr/local/lib/systemd%files# ===================== 二进制文件 =====================/usr/local/bin/crio/usr/local/bin/pinns# ===================== systemd 服务 =====================/usr/lib/systemd/system/crio.service/usr/lib/systemd/system/crio-wipe.service# ===================== 配置文件 =====================%config(noreplace) /etc/crio/crio.conf%dir /etc/crio/crio.conf.d%config(noreplace) /etc/crictl.yaml# ===================== 辅助文件 =====================/usr/local/share/oci-umount/oci-umount.d/crio-umount.conf/usr/local/share/containers/oci/hooks.d# ===================== man 手册 =====================/usr/local/share/man/man5/crio.conf.5*/usr/local/share/man/man5/crio.conf.d.5*/usr/local/share/man/man8/crio.8*# ===================== 命令补全(bash/fish/zsh)=====================/usr/local/share/bash-completion/completions/crio/usr/local/share/fish/completions/crio.fish/usr/local/share/zsh/site-functions/_crio%changelog* Wed Apr 08 2026 Packager <xxx@xxx.com> - 1.35.0-1- Initial build for cri-o 1.35.0
开始制作rpm包
rpmbuild -ba --nodeps cri-o.spec
加–nodeps是因为我们的golang环境是二进制安装,不是rpm安装,不加此参数的话rpmbuild会认为golang环境未安装,导致编译环境检查不通过
rpmbuild完成后,会在对应目录生成以下文件:
# tree .├── BUILD├── BUILDROOT├── RPMS│ └── x86_64│ └── cri-o-1.35.0-1.ky11.x86_64.rpm├── SOURCES│ └── cri-o-1.35.0.zip├── SPECS│ └── cri-o.spec└── SRPMS └── cri-o-1.35.0-1.ky11.src.rpm
安装测试
-
1. 安装 yum -y install ./cri-o-1.35.0-1.ky11.x86_64.rpm -
2. 启动 systemctl start crio.service -
3. crictl拉镜像测试 crictl pull swr.cn-east-3.myhuaweicloud.com/itho/docker.io/busybox:latest-amd64 -
4. 镜像、服务正常即可 # crictl images IMAGE TAG swr.cn-east-3.myhuaweicloud.com/itho/docker.io/busybox latest-amd64
结语
整个构建流程就结束了,整体步骤还是比较简单,主要是编写cri-o.spec时可能需要反复调试来解决构建中的报错。
后续我想写个skill通过openclaw来实现自动构建,但经尝试,用AI生成的.spec文件的内容大部分都是旧版本的字段和指令,但后续通过识别rpmbuild的报错也能自动进行一些问题的修改,但是估计搞一个包就得token爆炸。。。
后续会将skill内容和实际效果进行分享,有感兴趣或有经验的朋友,可以一起交流~
夜雨聆风