银河麒麟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源码

bash 复制代码
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

    bash 复制代码
    # 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
  4. 生效配置:source ~/.bashrc

  5. 在工作区下创建对应目录

    bash 复制代码
    cd $HOME/go
    mkdir src bin pkg
    # src/:源码
    # bin/:编译后的可执行文件
    # pkg/:依赖包缓存
  6. 使用go version、go env来检查配置是否正确

安装编译cri-o所需依赖

bash 复制代码
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等打包环境

bash 复制代码
yum install -y rpm-build rpmdevtools brp-chrpath

开始制作

准备工作完毕后,进入制作阶段。

创建rpmbuild标准目录

bash 复制代码
# 普通用户执行即可,不需要 root
rpmdev-setuptree

执行后会在当前用户家目录生成:

bash 复制代码
~/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

    bash 复制代码
    # 禁用自动生成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包

bash 复制代码
rpmbuild -ba --nodeps cri-o.spec

加--nodeps是因为我们的golang环境是二进制安装,不是rpm安装,不加此参数的话rpmbuild会认为golang环境未安装,导致编译环境检查不通过

rpmbuild完成后,会在对应目录生成以下文件:

bash 复制代码
# 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. 安装

    bash 复制代码
    yum -y install ./cri-o-1.35.0-1.ky11.x86_64.rpm
  2. 启动

    bash 复制代码
    systemctl start crio.service
  3. crictl拉镜像测试

    bash 复制代码
    crictl pull swr.cn-east-3.myhuaweicloud.com/itho/docker.io/busybox:latest-amd64
  4. 镜像、服务正常即可

    bash 复制代码
    # 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内容和实际效果进行分享,有感兴趣或有经验的朋友,可以一起交流~

相关推荐
布裘18 天前
【银河麒麟】V4桌面图标消失,右击鼠标没反应排查
运维·银河麒麟·桌面环境
归真仙人21 天前
【UE项目迁移银河麒麟(Linux)局域网会话搜索失败排查】
ue5·ue4·vr·unreal engine·银河麒麟
Linux技术支持工程师23 天前
银河麒麟 V10 出问题了该看哪个日志?secure 找不到、journalctl 查不到历史,一次解决
信创·银河麒麟·journalctl·日志排查·国产化运维
DolphinDB24 天前
持续升级!DolphinDB 全面完成银河麒麟 V11 兼容性认证
时序数据库·信创·银河麒麟·dolphindb
布裘1 个月前
【银河麒麟】服务器系统开机黑屏故障排查与修复
linux·运维·服务器·银河麒麟·无法启动
小白不想画工图1 个月前
银河麒麟V10系统安装QT5.12
linux·开发语言·qt·银河麒麟
Quincy_Freak1 个月前
银河麒麟终端数据处理标准化实践:SQLiteGo 效能评估与落地路径
sqlite·数据库管理·大数据分析·银河麒麟·aarch64·sqlitego
Quincy_Freak3 个月前
银河麒麟 SQLite 实操:Excel 导入与 SQL 语法编辑功能详解摘要
数据库·arm·数据库管理·大数据分析·银河麒麟·aarch64·sqlitego
Quincy_Freak3 个月前
信创内网数据规范实践:银河麒麟下SQLite本地数据安全管理方案
数据库·sqlite·arm·数据库管理·大数据分析·银河麒麟·aarch64
thethefighter3 个月前
会计档案管理系统功能支撑
银河麒麟·档案管理系统·单机版·nhdeep·信创版·会计档案·会计档案管理系统