mock知识点 1——基础介绍(一般看这篇就够用了)

0 前言

本文翻译自mock官方文档:https://rpm-software-management.github.io/mock/
本文会在原文基础上做一定的改动,包括但不限于实验示例。

本文实验环境:

CPU	:龙芯3A5000(loongarch64架构)
操作系统	:Loongnix Server 8.4
mock版本	:3.5(拉取上游源码编译)	

1 mock 简介

Mock是一个rpm格式的软件包构建工具,它可以为与主机不同版本的Fedora、RHEL、Mageia系统构建软件包。Mock会创建一个chroot环境并在其中构建软件包。它唯一的任务就是可靠的安装实现一个chroot,然后在该chroot中尝试构建软件包。

$ mock -r fedora-35-x86_64 package.src.rpm
...
Finish: rpmbuild packagei-1.98-1.fc35.src.rpm
Finish: build phase for package-1.98-1.fc35.src.rpm
INFO: Done(package.src.rpm) Config(fedora-35-x86_64) 2 minutes 14 seconds
INFO: Results and/or logs in: /var/lib/mock/fedora-35-x86_64/result
$  ls /var/lib/mock/fedora-35-x86_64/result
build.log  package-1.98-1.fc35.noarch.rpm  package-1.98-1.fc35.src.rpm  hw_info.log  installed_pkgs.log  root.log  state.log

$ mock -r centos-stream+epel-9-s390x package.src.rpm
...
$ mock -r alma+epel-8-x86_64 package.src.rpm
...

Mock还提供了一个编译多个包的命令(--chain),可以构建相互依赖的软件包。

如果源码配置管理(SCM)中存在mock-scm包,Mock能够从中编译SRPM,然后将SRPM构建为RPM。具体可以查看–scm-enable

1.1 mock的特点

  • Mock 对rpmbuild命令进行了封装,它试图简化编包中的一些步骤,这是一些本身就很无趣(复杂)的步骤。
  • Mock 在一个由少量软件包组成的chroot环境中运行 rpmbuild。
  • Mock 可以帮助你找到缺少的 BuildRequires - 如果缺少软件包需要的依赖,那么构建就会失败。
  • Mock 可以为多种系统和架构构建软件包,其中一些主机和目标的组合可能需要额外的配置,这取决于你的主机平台。
  • Mock可以为特定的使用RPM的操作系统准备一个全新的构建/开发环境。
  • Mock需要在root权限下执行一些任务,因此恶意的RPM会使你的系统处于危险之中。Mock对于未知的RPM是不安全的。如果你想从不被信任的来源构建软件包,那么请使用一些调用Mock的包构建环境,如OBS、Copr或在虚拟机中运行Mock。
  • Mock既不是容器也不是虚拟机。Mock做了一些隔离,但它并不打算完全隔离。
  • Mock可以帮助你在buildroot中打开一个shell来检索工件,或运行用于调试构建的命令。它并不打算在那里运行任何生产或开发应用程序。对于这种目的,你可以使用podman或Flatpak。

2 mock安装

2.1 安装仓库中mock

在Loongnix Server 8.4系统中,infra仓库和epel仓库中均有mock相关软件包,其中infra仓库中mock版本为2.8。epel仓库中mock版本为2.9。此处以高版本为例,epel仓库需要先安装loongnix-release-epel

[huangyang@bogon testmodule]$ sudo yum install loongnix-release-epel
......
[huangyang@bogon testmodule]$ sudo yum install mock
......

这样就安装成功了。

2.2 mock最新版本编译

根据mock已知,目前(2023年2月)最新版的mock已经到了3.5版本了,且每个版本都有一定的功能更新改动。为了使用到最新的功能,我们可以自己找mock新版本srpm(在rpmfind网站查找),然后编译。mock是与架构无关的软件包,可以直接编译通过。

wget https://download.fedoraproject.org/pub/fedora/linux/development/rawhide/Everything/source/tree/Packages/m/mock-3.5-2.fc38.src.rpm
wget https://download.fedoraproject.org/pub/fedora/linux/development/rawhide/Everything/source/tree/Packages/m/mock-core-configs-38.1-1.fc38.src.rpm

下载然后编译这两个软件包之后,安装就可以了。相较于2.1中的方法,这样安装的mock包里面缺少
Loongnix Server系统的配置文件。

3 mock配置

mock软件包安装完成后,其相关配置位于/etc/mock目录下(与Loongnix Server相关的两个配置文件为:/etc/mock/loongnix-8-loongarch64.cfg/etc/mock/templates/loongnix-8.tpl)。

mock环境中使用的源与本机系统使用的源(/etc/yum.repos.d/)不同,它的默认源在/etc/mock/templates/loongnix-8.tpl中单独配置。

3.1 添加mock账户

在使用mock时,需要先将账户添加到mock组,否则会出现权限问题。添加到mock组之后,还需要切换组信息。最后可以通过groups查看当前用户所属组信息。

[huangyang@bogon ~]$ sudo usermod -a -G mock huangyang
[huangyang@bogon ~]$ newgrp
[huangyang@bogon ~]$ groups
huangyang mock

3.2 初始化

在使用mock命令之前,需要先进行初始化。初始化时可通过使用--rootdir参数来重新指定位置(默认在/var/lib/mock/目录下)。

[huangyang@bogon ~]$ mock -r loongnix-8-loongarch64 --init
INFO: mock.py version 3.5 starting (python version = 3.6.8, NVR = mock-3.5-2.lns8)...
Start(bootstrap): init plugins
INFO: selinux disabled
Finish(bootstrap): init plugins
Start: init plugins
......
Mock Version: 3.5
INFO: Mock Version: 3.5
Finish: chroot init
Finish: run

如果编译之前想要清除之前的mock初始化信息,可以使用:

[huangyang@bogon ~]$ mock -r loongnix-8-loongarch64 --clean
INFO: mock.py version 3.5 starting (python version = 3.6.8, NVR = mock-3.5-2.lns8)...
Start(bootstrap): init plugins
INFO: selinux disabled
Finish(bootstrap): init plugins
Start: init plugins
......
Start: clean chroot
Finish: clean chroot
Finish: run
[huangyang@bogon ~]$ sudo rm -rf /var/cache/mock/* /var/lib/mock/* /home/huangyang/rootdir/

因为重新指定了rootdir,所以需要把重新指定的目录也删除掉。

3.3 编译软件包

编译软件包时不需要sudo权限。下面这条命令是从本地已有的srpm包重新编译rpm和srpm包,如果是其他编译方式,可以参考mock --help信息。

mock -r loongnix-8-loongarch64 rebuild /home/huangyang/Fedora34-rubygem-srpm/rubygem-asciidoctor-2.0.12-1.fc34.src.rpm --rootdir=/home/huangyang/rootdir/ --resultdir=/home/huangyang/result/

4 修改记录

2023年2月27日 14:49:55:修改3.1和3.2内容。添加当前用户到mock组之后,需要切换组信息。然后整个mock操作都不需要用到sudo权限。

posted @ 2023-02-15 21:30  streamlet_hy  阅读(529)  评论(0编辑  收藏  举报  来源