首页 > 基础资料 博客日记
银河麒麟v11源码(cri-o)编译rpm包全流程详解
2026-04-08 17:00:03基础资料围观1次
银河麒麟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环境,所以本次采用二进制安装的方式。
-
根据你的架构,下载golang二进制包:
https://go.dev/dl/go1.25.0.linux-amd64.tar.gz -
解压:
tar -C /usr/local -xzf go1.25.0.linux-amd64.tar.gz -
配置环境变量
vim ~/.bashrc
# Go 安装路径(默认) export GOROOT=/usr/local/go # 可执行文件加入系统 PATH export 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 -
生效配置:
source ~/.bashrc -
在工作区下创建对应目录
cd $HOME/go mkdir src bin pkg # src/:源码 # bin/:编译后的可执行文件 # pkg/:依赖包缓存 -
使用
go version、go env来检查配置是否正确
安装编译cri-o所需依赖
yum install -y \
containers-common \
git \
make \
glib2-devel \
glibc-devel \
glibc-static \
crun
go get github.com/cpuguy83/go-md2man
yum 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标准目录
# 普通用户执行即可,不需要 root
rpmdev-setuptree
执行后会在当前用户家目录生成:
~/rpmbuild/
├── BUILD # 编译临时目录
├── BUILDROOT # 安装根目录
├── RPMS # 最终生成的 rpm 包(重点)
├── SOURCES # 源码包放这里
├── SPECS # 编译脚本 spec 文件放这里
└── SRPMS # 源码 rpm 包
编辑构建目录
-
将cri-o源码放置SOURCES目录下
mv cri-o-1.35.0.zip ~/rpmbuild/SOURCES/ -
SPECS下创建cri-o.spec文件,完整配置如下:
vim cri-o.spec
# 禁用自动生成debuginfo包 %global debug_package %{nil} %define _enable_debug_packages 0 Name: cri-o Version: 1.35.0 Release: 1%{?dist} Summary: Kubernetes CRI implementation for OCI License: ASL 2.0 URL: https://cri-o.io/ # 这里包名要注意下,需要和SOURCES目录下源码包名匹配到 Source0: https://github.com/cri-o/cri-o/cri-o-%{version}.zip # 编译依赖,编译时所需的依赖环境(编译机) BuildRequires: golang >= 1.25.0 BuildRequires: make BuildRequires: gcc # 运行依赖,安装时所需的依赖环境(安装机) Requires: conmon >= 2.1 Requires: runc Requires: container-selinux %description CRI-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
安装测试
-
安装
yum -y install ./cri-o-1.35.0-1.ky11.x86_64.rpm -
启动
systemctl start crio.service -
crictl拉镜像测试
crictl pull swr.cn-east-3.myhuaweicloud.com/itho/docker.io/busybox:latest-amd64 -
镜像、服务正常即可
# 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内容和实际效果进行分享,有感兴趣或有经验的朋友,可以一起交流~
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:jacktools123@163.com进行投诉反馈,一经查实,立即删除!
标签:
相关文章
最新发布
- 浅谈AI与Skill——从Claude Code看AI工具如何重塑技能价值
- 蒙提霍尔问题-经典的三扇门问题
- VOOHU沃虎音频变压器功能解析——噪声隔离、阻抗匹配、信号平衡转换
- 温度传感器芯片-温湿度传感器芯片代理商-(sensylink)申矽凌代理商-深圳市微效电子有限公司
- GitHub 热门项目 Top 10 | 2026年04月08日
- Slickflow 规则集与 NRules 集成实践:从设计到产品落地
- Loki MCP Server -支持Claude Desktop/Claude Code/Cursor 等客户端通过自然语言查询日志
- 银河麒麟v11源码(cri-o)编译rpm包全流程详解
- AI 时代,满分的程序员简历是怎么样的?附简历模板
- Agent Skill 踩坑记录 | SpringBoot 打包后 Skill 加载失败问题排查与解决

