1. RPM 包管理器概述
RPM(Red Hat Package Manager)是 Red Hat 公司开发的包管理系统,广泛用于 Red Hat、CentOS、Fedora、SUSE 等 Linux 发行版中。
1.1 RPM 包的特点
- 二进制预编译包
- 包含依赖关系信息
- 支持数字签名验证
- 提供安装、升级、卸载功能
- 维护系统包数据库
2. RPM 相关命令详解
2.1 基础查询命令
查询已安装的包
# 查询所有已安装的包
rpm -qa
# 查询特定包是否已安装
rpm -q package_name
# 查询包的详细信息
rpm -qi package_name
# 查询包安装的文件列表
rpm -ql package_name
# 查询文件属于哪个包
rpm -qf /path/to/file
# 查询包的依赖关系
rpm -qR package_name
# 查询依赖此包的其他包
rpm -q --whatrequires package_name
查询 RPM 文件
# 查询 RPM 文件信息(未安装)
rpm -qip package.rpm
# 查询 RPM 文件包含的文件列表
rpm -qlp package.rpm
# 查询 RPM 文件的依赖关系
rpm -qRp package.rpm
2.2 安装和升级命令
# 安装 RPM 包
rpm -i package.rpm
rpm -ivh package.rpm # 显示详细信息和进度条
# 升级 RPM 包
rpm -U package.rpm
rpm -Uvh package.rpm
# 仅升级已安装的包
rpm -F package.rpm
rpm -Fvh package.rpm
# 强制安装(忽略依赖)
rpm -ivh --force package.rpm
# 忽略依赖关系安装
rpm -ivh --nodeps package.rpm
2.3 卸载命令
# 卸载包
rpm -e package_name
# 强制卸载(忽略依赖)
rpm -e --nodeps package_name
# 仅测试卸载(不真正执行)
rpm -e --test package_name
2.4 验证和校验命令
# 验证已安装包的完整性
rpm -V package_name
rpm -Va # 验证所有包
# 检查 RPM 文件签名
rpm --checksig package.rpm
# 导入 GPG 密钥
rpm --import RPM-GPG-KEY
3. YUM/DNF 高级包管理器
3.1 YUM 命令(CentOS 7 及以下)
# 安装软件包
yum install package_name
# 更新软件包
yum update package_name
yum update # 更新所有包
# 删除软件包
yum remove package_name
# 搜索软件包
yum search keyword
# 查看包信息
yum info package_name
# 列出可用包
yum list available
# 列出已安装包
yum list installed
# 查看包依赖
yum deplist package_name
# 清理缓存
yum clean all
# 查看仓库列表
yum repolist
3.2 DNF 命令(Fedora、CentOS 8+)
# 基本操作(语法与 yum 类似)
dnf install package_name
dnf update package_name
dnf remove package_name
dnf search keyword
# DNF 特有功能
dnf history # 查看操作历史
dnf history undo ID # 撤销特定操作
dnf autoremove # 自动删除不需要的依赖包
4. RPM 开发流程详解
4.1 开发环境准备
# 安装开发工具
yum groupinstall "Development Tools"
yum install rpm-build rpmdevtools
# 创建开发目录结构
rpmdev-setuptree
# 目录结构说明
~/rpmbuild/
├── BUILD/ # 编译过程中的临时文件
├── BUILDROOT/ # 安装根目录
├── RPMS/ # 生成的二进制 RPM 包
├── SOURCES/ # 源代码和补丁文件
├── SPECS/ # SPEC 文件
└── SRPMS/ # 源码 RPM 包
4.2 SPEC 文件编写
SPEC 文件是 RPM 构建的核心,包含包的元数据和构建指令:
# hello.spec 示例
Name: hello
Version: 1.0
Release: 1%{?dist}
Summary: A simple hello world program
License: MIT
URL: https://example.com/hello
Source0: hello-%{version}.tar.gz
BuildRequires: gcc
Requires: glibc
%description
This is a simple hello world program written in C.
%prep
%setup -q
%build
gcc -o hello hello.c
%install
mkdir -p %{buildroot}%{_bindir}
install -m 755 hello %{buildroot}%{_bindir}/hello
%files
%{_bindir}/hello
%changelog
* Mon Jan 01 2024 Developer <dev@example.com> - 1.0-1
- Initial package
4.3 SPEC 文件关键段落说明
头部信息段
Name: # 包名
Version: # 版本号
Release: # 发布号
Summary: # 简短描述
License: # 许可证
URL: # 项目主页
Source0: # 源代码包
BuildRequires: # 构建时依赖
Requires: # 运行时依赖
%prep 段(准备阶段)
%prep
%setup -q # 解压源代码
%patch0 -p1 # 应用补丁
%build 段(构建阶段)
%build
%configure # 运行 configure 脚本
make %{?_smp_mflags} # 编译,使用多核
%install 段(安装阶段)
%install
rm -rf %{buildroot}
make install DESTDIR=%{buildroot}
%files 段(文件列表)
%files
%doc README COPYING
%{_bindir}/program
%{_mandir}/man1/program.1*
%config(noreplace) %{_sysconfdir}/program.conf
4.4 构建 RPM 包
# 将源代码放入 SOURCES 目录
cp hello-1.0.tar.gz ~/rpmbuild/SOURCES/
# 将 SPEC 文件放入 SPECS 目录
cp hello.spec ~/rpmbuild/SPECS/
# 构建 RPM 包
rpmbuild -ba ~/rpmbuild/SPECS/hello.spec
# 仅构建二进制包
rpmbuild -bb ~/rpmbuild/SPECS/hello.spec
# 仅构建源码包
rpmbuild -bs ~/rpmbuild/SPECS/hello.spec
# 检查 SPEC 文件语法
rpmlint ~/rpmbuild/SPECS/hello.spec
4.5 高级 SPEC 文件技巧
条件构建
%if 0%{?fedora} >= 28
BuildRequires: python3-devel
%else
BuildRequires: python-devel
%endif
宏定义
%define debug_package %{nil} # 禁用调试包
%global python_version 3.8
子包定义
%package devel
Summary: Development files for %{name}
Requires: %{name}%{?_isa} = %{version}-%{release}
%description devel
Development files for %{name}.
%files devel
%{_includedir}/*
%{_libdir}/*.so
4.6 常用 RPM 宏
# 目录宏
%{_bindir} # /usr/bin
%{_sbindir} # /usr/sbin
%{_libdir} # /usr/lib64 或 /usr/lib
%{_includedir} # /usr/include
%{_mandir} # /usr/share/man
%{_docdir} # /usr/share/doc
%{_sysconfdir} # /etc
%{_localstatedir} # /var
# 构建宏
%{buildroot} # 构建根目录
%{_smp_mflags} # 多核编译标志
%{?dist} # 发行版标识
5. RPM 签名和验证
5.1 创建 GPG 密钥
# 生成 GPG 密钥对
gpg --gen-key
# 列出密钥
gpg --list-keys
# 导出公钥
gpg --export -a "Your Name" > RPM-GPG-KEY-yourname
5.2 配置 RPM 签名
# 编辑 ~/.rpmmacros
echo "%_gpg_name Your Name" >> ~/.rpmmacros
echo "%_signature gpg" >> ~/.rpmmacros
# 签名 RPM 包
rpm --addsign package.rpm
6. 实际使用场景
6.1 系统管理场景
# 查找占用空间最大的包
rpm -qa --queryformat '%{SIZE} %{NAME}\n' | sort -rn | head -10
# 查找最近安装的包
rpm -qa --last | head -20
# 查找配置文件
rpm -qac package_name
6.2 故障排查场景
# 验证系统文件完整性
rpm -Va | grep "^..5" # 查找被修改的文件
# 查找缺失的依赖
rpm -qR package_name | xargs rpm -q --whatprovides
# 检查包冲突
rpm -qa --conflicts
6.3 自动化部署场景
# 批量安装 RPM 包
for rpm in *.rpm; do
rpm -Uvh "$rpm" || echo "Failed to install $rpm"
done
# 从列表安装包
while read package; do
yum install -y "$package"
done < package_list.txt
7. 下载 RPM 包及其依赖包
7.1 基础下载命令
# 仅下载包,不安装
yum install --downloadonly package_name
# 指定下载目录
yum install --downloadonly --downloaddir=/path/to/directory package_name
# 下载包及所有依赖
yum install --downloadonly --resolve package_name
# 下载到当前目录
yum install --downloadonly --downloaddir=./ package_name
7.2 使用 yumdownloader
# 安装 yum-utils(如果没有安装)
yum install yum-utils
# 仅下载指定包(不含依赖)
yumdownloader package_name
# 下载包及其所有依赖包
yumdownloader --resolve package_name
# 下载源码包
yumdownloader --source package_name
# 指定下载目录
yumdownloader --destdir=/path/to/directory --resolve package_name
# 下载指定架构的包
yumdownloader --archlist=x86_64 --resolve package_name
本文版权归原作者zhaofujian所有,采用 CC BY-NC-ND 4.0 协议进行许可,转载请注明出处。