银河麒麟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 versiongo 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内容和实际效果进行分享,有感兴趣或有经验的朋友,可以一起交流~

相关推荐
NotStrandedYet2 个月前
《国产系统运维笔记》第8期:挑战国产化流媒体部署——银河麒麟+龙芯架构编译SRS实战全记录
运维·kylin·国产化·银河麒麟·龙芯·信创运维·srs编译安装
塔克拉玛攻城狮2 个月前
最新!银河麒麟v11 kubeadm部署k8s v1.35.0高可用集群
kubernetes·银河麒麟
NotStrandedYet2 个月前
《国产系统运维笔记》第4期:银河麒麟服务器系统V10&V11如何设置 root 用户自动登录
运维·信创·kylin·国产化·国产操作系统·银河麒麟·信创运维
小可爱的大笨蛋3 个月前
Windows 下利用 QEMU 模拟运行银河麒麟 (ARM64)
国产化·银河麒麟
鱼月半3 个月前
银河麒麟V10实现在挂载的外置硬盘中进行文件删除至回收站的操作
银河麒麟·外挂硬盘·删除至回收站
李小白杂货铺3 个月前
国产操作系统/Linux桌面系统使用手记
ubuntu·国产操作系统·银河麒麟·统信·国产cpu·linux桌面系统·国产硬件平台
NotStrandedYet3 个月前
如何管好银河麒麟V11服务器?先从征服/var/log开始
信创·kylin·国产化·国产替代·银河麒麟·信创运维
鱼月半4 个月前
ARM64(华为S9006C,飞腾)银河麒麟离线安装docker及jitsi-meet方案
docker·arm64·银河麒麟·jitsi-meet
大连滚呢王5 个月前
Linux(麒麟)服务器离线安装单机Milvus向量库
linux·python·milvus·银河麒麟·milvus_cli