linux 发行版 之 rpm 包管理器

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 协议进行许可,转载请注明出处。

发表评论