名称 | Name: mock
版本 | Version: 1.0.0
作者 | Author: OS Build Agent
领域 | Domain: RPM Package Build Environment
专业的 RPM 包安全构建环境管理技能,使用 Mock 在干净的 chroot 环境中构建 RPM 包,确保构建的可重复性和安全性。
Professional RPM package build environment management skill using Mock to build RPM packages in clean chroot environments, ensuring build reproducibility and security.
# RHEL/Fedora
dnf install mock
# 添加用户到 mock 组
# Add user to mock group
usermod -a -G mock $USER
# 配置 sudo (可选)
# Configure sudo (optional)
visudo
# 添加:youruser ALL=(ALL) NOPASSWD: /usr/bin/mock
# 主配置文件
# Main config file
/etc/mock/default.cfg
# 预设配置目录
# Preset configs directory
/etc/mock/configs/
# 用户配置
# User config
~/.config/mock.cfg
# Fedora
fedora-39-x86_64
fedora-40-x86_64
fedora-rawhide-x86_64
# RHEL/CentOS
epel-9-x86_64
epel-8-x86_64
centos-stream-9-x86_64
# 其他架构
# Other architectures
fedora-39-aarch64
fedora-39-ppc64le
fedora-39-s390x
# 从 SRPM 构建
# Build from SRPM
mock -r fedora-39-x86_64 ./package-1.0-1.fc39.src.rpm
# 从 spec 文件构建
# Build from spec file
mock -r fedora-39-x86_64 ./package.spec
# 指定结果目录
# Specify result directory
mock -r fedora-39-x86_64 \
--resultdir ./results \
./package-1.0-1.fc39.src.rpm
# 初始化 chroot
# Initialize chroot
mock -r fedora-39-x86_64 --init
# 清理 chroot
# Clean chroot
mock -r fedora-39-x86_64 --clean
# 完全清理(包括缓存)
# Scrub all (including cache)
mock -r fedora-39-x86_64 --scrub=all
# 只清理缓存
# Scrub cache only
mock -r fedora-39-x86_64 --scrub=cache
# 列出可用的 chroot
# List available chroots
mock --list-chroots
# 使用自定义配置
# Use custom config
mock -r ./custom.cfg ./package.src.rpm
# 添加额外仓库
# Add extra repository
mock -r fedora-39-x86_64 \
--enable-plugin=chroot_scan \
--enable-plugin=package_state \
--config-opts=repo_add="https://example.com/repo" \
./package.src.rpm
# 添加本地仓库
# Add local repository
mock -r fedora-39-x86_64 \
--repodir /path/to/local/repo \
./package.src.rpm
# 重新构建
# Rebuild
mock -r fedora-39-x86_64 --rebuild ./package.src.rpm
# 仅构建 SRPM
# Build SRPM only
mock -r fedora-39-x86_64 --buildsrpm \
--spec ./package.spec \
--sources ./SOURCES/
# 安装构建结果
# Install build results
mock -r fedora-39-x86_64 \
--install ./results/package-1.0-1.rpm
# 在 chroot 中执行命令
# Execute command in chroot
mock -r fedora-39-x86_64 --chroot -- rpm -qa
# 获取 shell
# Get shell
mock -r fedora-39-x86_64 --shell
# 列出构建结果
# List build results
mock -r fedora-39-x86_64 --print-result-path
# 复制结果到目录
# Copy results to directory
mock -r fedora-39-x86_64 \
--copyout /var/lib/mock/fedora-39-x86_64/result/ \
./results/
# 查看构建日志
# View build log
mock -r fedora-39-x86_64 --print-result-path
cat ./results/build.log
# 获取 SRPM
# Get SRPM
mock -r fedora-39-x86_64 --get-result='*.src.rpm'
# 启用 chroot_scan 插件(保存 chroot 状态)
# Enable chroot_scan plugin (save chroot state)
mock -r fedora-39-x86_64 \
--enable-plugin=chroot_scan \
--plugin-opt=chroot_scan:only_failed=True \
./package.src.rpm
# 启用 package_state 插件(记录包状态)
# Enable package_state plugin (log package state)
mock -r fedora-39-x86_64 \
--enable-plugin=package_state \
./package.src.rpm
# 启用 sign 插件(签名包)
# Enable sign plugin (sign packages)
mock -r fedora-39-x86_64 \
--enable-plugin=sign \
--plugin-opt=sign:cmds="rpm --addsign" \
./package.src.rpm
# 启用 ccache 插件(编译缓存)
# Enable ccache plugin (compile cache)
mock -r fedora-39-x86_64 \
--enable-plugin=ccache \
./package.src.rpm
# 构建多个 SRPM
# Build multiple SRPMs
for srpm in *.src.rpm; do
mock -r fedora-39-x86_64 "$srpm"
done
# 并行构建(使用 systemd-run)
# Parallel build (using systemd-run)
for srpm in *.src.rpm; do
systemd-run --scope mock -r fedora-39-x86_64 "$srpm" &
done
wait
# 使用 mockchain(链式构建)
# Use mockchain (chain build)
mockchain \
-r fedora-39-x86_64 \
--basedir /var/mockchain \
--localrepo /var/mockchain/local \
package1.src.rpm \
package2.src.rpm \
package3.src.rpm
# custom.cfg 示例
# custom.cfg example
config_opts['root'] = 'custom-1.0-x86_64'
config_opts['target_arch'] = 'x86_64'
config_opts['legal_host_arches'] = ('x86_64',)
# 基础发行版
# Base distribution
config_opts['dist'] = 'fc39'
config_opts['releasever'] = '39'
# 仓库配置
# Repository configuration
config_opts['yum.conf'] = """
[main]
cachedir=/var/cache/yum
debuglevel=1
reposdir=/dev/null
logfile=/var/log/yum.log
retries=20
obsoletes=1
gpgcheck=0
assumeyes=1
syslog_ident=mock
syslog_device=
[fedora]
name=Fedora $releasever - $basearch
baseurl=https://download.fedoraproject.org/pub/fedora/linux/releases/$releasever/Everything/$basearch/os/
enabled=1
[updates]
name=Fedora $releasever - $basearch - Updates
baseurl=https://download.fedoraproject.org/pub/fedora/linux/updates/$releasever/Everything/$basearch/
enabled=1
[epel]
name=EPEL $releasever - $basearch
baseurl=https://download.fedoraproject.org/pub/epel/$releasever/$basearch/
enabled=1
"""
# 包管理
# Package management
config_opts['chroot_additional_packages'] = 'gcc gcc-c++ make rpm-build'
config_opts['chroot_setup_cmd'] = 'install bash bzip2 coreutils cpio diffutils findutils gawk grep gzip info make patch redhat-rpm-config rpm-build sed shadow-utils tar unzip util-linux which xz'
# 资源限制
# Resource limits
config_opts['rpmbuild_networking'] = True
config_opts['use_host_resolv'] = True
config_opts['print_main_output'] = True
| 命令 | Command | 描述 | Description |
|---|---|---|---|
| ------ | --------- | ------ | ------------- |
mock -r | build | 构建 SRPM | Build SRPM |
--init | initialize | 初始化 chroot | Initialize chroot |
--clean | clean | 清理 chroot | Clean chroot |
--scrub=all | scrub all | 完全清理 | Scrub all |
--shell | shell | 进入 chroot shell | Enter chroot shell |
--chroot | chroot | 在 chroot 中执行命令 | Execute in chroot |
--rebuild | rebuild | 重新构建 | Rebuild |
--buildsrpm | build SRPM | 仅构建 SRPM | Build SRPM only |
--resultdir | result dir | 指定结果目录 | Specify result dir |
--copyout | copy out | 复制结果 | Copy results |
--install | install | 安装结果包 | Install result packages |
--list-chroots | list chroots | 列出可用 chroot | List available chroots |
--enable-plugin | enable plugin | 启用插件 | Enable plugin |
# 查看详细日志
# View detailed logs
cat /var/lib/mock/<config>/result/build.log
# 检查 chroot 状态
# Check chroot state
mock -r <config> --chroot -- rpm -qa
# 重新初始化
# Reinitialize
mock -r <config> --scrub=all
mock -r <config> --init
# 检查仓库配置
# Check repo configuration
mock -r <config> --chroot -- cat /etc/yum.repos.d/*
# 手动安装依赖
# Manually install dependencies
mock -r <config> --chroot -- dnf install <package>
MIT License
共 1 个版本