在基于RHEL的Linux发行版(如CentOS、Rocky Linux)中,RPM(Red Hat Package Manager) 是其软件生态的基石。无论是安装应用、查询信息还是系统维护,掌握RPM都是Linux系统管理的核心技能之一。

RPM基础概念全面解析
RPM包命名规则深度解读
一个完整的RPM包名包含了软件的所有关键信息。
# 一个完整的RPM包名示例
nginx-1.20.1-2.el7.x86_64.rpm
# 拆解分析:
┌─────────────────────────────────────────────────────────────┐
│ nginx - 1.20.1 - 2 .el7 .x86_64 .rpm │
│ ├软件名 ├版本号 ├发布号 ├发行版 ├架构 ├扩展名│
│ │ │主版本.次版本.修订号 │ │ │ │
└─────────────────────────────────────────────────────────────┘
# 常见发行版标记:
- .el7/.el8 : Enterprise Linux 7/8 (RHEL/CentOS)
- .fc34 : Fedora Core 34
- .suse15 : SUSE Linux 15
- .amzn2 : Amazon Linux 2
# 架构标识:
- x86_64 : 64位Intel/AMD
- i386/i686 : 32位Intel
- aarch64 : ARM 64位
- noarch : 与架构无关(脚本、文档等)
RPM数据库:系统的记忆中枢
所有已安装软件包的信息都记录在RPM数据库中。
# RPM数据库位置
/var/lib/rpm/
# 重要文件说明
├── Basenames # 存储所有安装的文件名
├── Name # 软件包名称索引
├── Packages # 软件包详细信息(主数据库)
├── Group # 按分组索引
├── Providename # 提供的能力索引
├── Requirename # 依赖关系索引
└── __db.001 # Berkeley DB数据库文件
# 查看数据库状态
rpm --eval '%{_dbpath}' # 输出:/var/lib/rpm
rpm --eval '%{_db_backend}' # 输出:bdb
RPM核心操作全掌握
软件包查询技巧大全
基础查询命令
# 1. 查询已安装的包
rpm -qa # 列出所有已安装包
rpm -qa | grep nginx # 查找特定包
rpm -qa --last # 按安装时间排序
# 2. 查询包详细信息
rpm -qi nginx # 显示包信息
rpm -qip nginx-1.20.1.rpm # 查询未安装包信息
# 3. 查询包文件列表
rpm -ql nginx # 列出包安装的所有文件
rpm -ql --dump nginx # 显示详细信息(大小、权限等)
# 4. 查询文件属于哪个包
rpm -qf /usr/sbin/nginx # 查询文件所属包
rpm -qf $(which nginx) # 常用技巧
高级查询技巧
# 查询包的依赖关系
rpm -qR nginx # 查询nginx依赖哪些包
rpm -q --whatrequires nginx # 查询哪些包依赖nginx
# 查询包配置文档
rpm -qc nginx # 列出配置文件
rpm -qd nginx # 列出文档文件
# 查询包提供的功能
rpm -q --provides nginx # nginx提供的能力
rpm -q --requires nginx # nginx需要的能力
# 查询包的修改历史
rpm -q --changelog nginx | head -20
安装、升级与卸载
安装操作详解
# 基本安装
rpm -ivh nginx-1.20.1.rpm # i=安装, v=详细输出, h=显示进度
# 安装选项详解
rpm -ivh --test nginx.rpm # 测试安装(不实际安装)
rpm -ivh --nodeps nginx.rpm # 忽略依赖检查(危险!)
rpm -ivh --replacepkgs nginx.rpm # 重新安装已安装的包
rpm -ivh --replacefiles nginx.rpm # 替换被其他包占用的文件
rpm -ivh --noscripts nginx.rpm # 不执行安装脚本
# 从URL安装
rpm -ivh https://example.com/nginx.rpm
# 安装到指定目录(relocate)
rpm -ivh --prefix=/opt/nginx nginx.rpm
升级操作
# 标准升级(保留配置文件)
rpm -Uvh nginx-1.20.2.rpm # U=升级,自动处理新旧版本
# 强制升级(不保留旧版本)
rpm -Fvh nginx-1.20.2.rpm # F=只升级已安装的包
# 降级操作
rpm -Uvh --oldpackage nginx-1.18.0.rpm
# 升级选项
rpm -Uvh --test nginx.rpm # 测试升级
rpm -Uvh --excludedocs nginx.rpm # 不安装文档
卸载操作
# 基本卸载
rpm -e nginx # e=擦除(erase)
# 卸载选项
rpm -e --test nginx # 测试卸载
rpm -e --nodeps nginx # 忽略依赖检查
rpm -e --noscripts nginx # 不执行卸载脚本
# 强制卸载(解决依赖问题)
rpm -e --allmatches nginx # 卸载所有匹配的包
验证与签名检查
验证包完整性
# 验证已安装包
rpm -V nginx # 验证nginx包
rpm -Va # 验证所有已安装包
# 验证结果解读
# 验证标记含义:
# S: 文件大小改变 5: MD5校验和改变
# M: 权限改变 D: 设备号改变
# L: 链接路径改变 U: 用户改变
# G: 组改变 T: 修改时间改变
# ?: 不可读文件
# 示例输出:
# S.5....T. c /etc/nginx/nginx.conf
# ↑ ↑ ↑ ↑ ↑
# │ │ │ │ └── 文件名
# │ │ │ └── 文件类型(c=配置文件)
# │ │ └── 修改时间改变
# │ └── MD5校验和改变
# └── 文件大小改变
GPG签名验证
# 导入GPG密钥
rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
# 列出已导入密钥
rpm -qa gpg-pubkey*
# 查看密钥详情
rpm -qi gpg-pubkey-f4a80eb5
# 验证包签名
rpm --checksig nginx.rpm # 检查签名和完整性
rpm -Kv nginx.rpm # 详细验证
# 验证结果说明:
# gpg OK : GPG签名验证通过
# md5 OK : MD5校验通过
# NOT OK : 验证失败
高级实战技巧
依赖关系深度处理
依赖问题解决方案
# 1. 查看依赖关系图
rpm -qR nginx | sort # 查看nginx的所有依赖
rpm -q --whatrequires python3 # 查看依赖python3的包
# 2. 构建本地YUM仓库解决依赖
# 步骤1:收集所有RPM包到目录
mkdir -p /local/repo
cp *.rpm /local/repo/
# 步骤2:创建仓库元数据
cd /local/repo
createrepo .
# 步骤3:配置本地repo文件
cat > /etc/yum.repos.d/local.repo << EOF
[local]
name=Local Repository
baseurl=file:///local/repo
enabled=1
gpgcheck=0
EOF
# 步骤4:使用yum安装并自动解决依赖
yum --disablerepo="*" --enablerepo="local" install nginx
依赖查询高级命令
# 使用repoquery工具(需安装yum-utils)
repoquery --requires nginx
repoquery --tree-requires nginx # 树状显示依赖
repoquery --tree-whatrequires nginx # 树状显示反向依赖
# 使用rpm的复杂查询
rpm -q --qf '[%{REQUIRENAME} %{REQUIREFLAGS:deptype} %{REQUIREVERSION}\n]' nginx
RPM包提取与修复
从RPM包提取文件
# 方法1:使用rpm2cpio
rpm2cpio nginx.rpm | cpio -idmv
# 参数解释:
# -i: 提取 -d: 创建目录 -m: 保留修改时间 -v: 显示过程
# 方法2:直接解压到指定目录
mkdir nginx-files
cd nginx-files
rpm2cpio ../nginx.rpm | cpio -idmv
# 方法3:使用rpm命令查看内容但不安装
rpm -qlp nginx.rpm # 列出包内文件
rpm -qcp nginx.rpm # 列出配置文件
修复损坏的RPM数据库
# 1. 首先备份数据库
cp -r /var/lib/rpm /var/lib/rpm.backup.$(date +%Y%m%d)
# 2. 重建数据库
cd /var/lib/rpm
rm -f __db.*
rpm --rebuilddb
# 3. 验证数据库
rpm -qa | wc -l # 应该能正常列出包
rpm -V rpm # 验证rpm包自身
# 4. 如果还有问题,尝试完全重建
rpm -vv --rebuilddb # 详细输出重建过程
# 5. 紧急恢复:从备份恢复
service stop_package_services # 停止相关服务
rm -rf /var/lib/rpm
cp -r /var/lib/rpm.backup /var/lib/rpm
构建自定义RPM包
使用rpmbuild基础流程
# 1. 安装构建工具
yum install -y rpm-build rpmdevtools
# 2. 设置开发环境
rpmdev-setuptree
# 创建目录结构:
# ~/rpmbuild/
# ├── SOURCES # 源码包
# ├── SPECS # spec文件
# ├── BUILD # 构建目录
# ├── RPMS # 生成的RPM包
# └── SRPMS # 源码RPM包
# 3. 创建spec文件模板
cd ~/rpmbuild/SPECS
rpmdev-newspec mypackage.spec
# 4. 编辑spec文件
vim mypackage.spec
# 5. 构建RPM包
rpmbuild -ba mypackage.spec # 构建二进制和源码包
rpmbuild -bb mypackage.spec # 只构建二进制包
示例spec文件详解
# mypackage.spec 示例
Name: mypackage
Version: 1.0
Release: 1%{?dist}
Summary: A sample RPM package
License: GPLv3+
URL: https://example.com
Source0: %{name}-%{version}.tar.gz
BuildRequires: gcc, make
Requires: bash >= 4.0
%description
This is a sample RPM package for demonstration.
%prep
%setup -q
%build
make %{?_smp_mflags}
%install
rm -rf %{buildroot}
make install DESTDIR=%{buildroot}
%files
%defattr(-,root,root,-)
/usr/bin/mypackage
/usr/share/doc/mypackage/
%changelog
* Tue Oct 10 2023 Your Name <email@example.com> - 1.0-1
- Initial package
企业级应用场景
批量部署与管理
批量查询脚本
#!/bin/bash
# batch-rpm-query.sh
# 批量查询多台服务器的RPM包状态
SERVER_LIST=("server1" "server2" "server3")
PACKAGE="nginx"
echo "=== RPM包状态检查报告 ==="
echo "检查时间: $(date)"
echo "检查包: $PACKAGE"
echo ""
for SERVER in "${SERVER_LIST[@]}"; do
echo "服务器: $SERVER"
# SSH远程执行查询
ssh "$SERVER" "
if rpm -q $PACKAGE &>/dev/null; then
echo ' 状态: 已安装'
echo ' 版本: $(rpm -q --qf '%{VERSION}-%{RELEASE}' $PACKAGE)'
echo ' 安装时间: $(rpm -q --qf '%{INSTALLTIME:date}' $PACKAGE)'
else
echo ' 状态: 未安装'
fi
echo ''
"
done
批量安装脚本
对于企业环境中的大规模自动化部署,通过脚本批量管理RPM包是提升效率的关键。
#!/bin/bash
# batch-rpm-install.sh
# 在多台服务器上批量安装RPM包
SERVERS=("192.168.1.10" "192.168.1.11" "192.168.1.12")
RPM_FILE="custom-package.rpm"
SSH_USER="root"
LOG_FILE="/var/log/batch_install.log"
# 本地准备RPM包
if [ ! -f "$RPM_FILE" ]; then
echo "错误: RPM文件 $RPM_FILE 不存在" | tee -a "$LOG_FILE"
exit 1
fi
install_on_server() {
local server=$1
local retries=3
echo "[$(date)] 开始在 $server 安装..." | tee -a "$LOG_FILE"
for ((i=1; i<=retries; i++)); do
# 复制RPM包到目标服务器
scp "$RPM_FILE" "${SSH_USER}@${server}:/tmp/" &>/dev/null
if [ $? -eq 0 ]; then
# 远程安装
ssh "${SSH_USER}@${server}" "
echo '开始安装 $RPM_FILE...'
rpm -Uvh /tmp/$RPM_FILE
if [ \$? -eq 0 ]; then
echo '安装成功'
rm -f /tmp/$RPM_FILE
exit 0
else
echo '安装失败'
exit 1
fi
"
if [ $? -eq 0 ]; then
echo "[$(date)] $server: 安装成功" | tee -a "$LOG_FILE"
return 0
fi
fi
echo "[$(date)] $server: 第 $i 次尝试失败" | tee -a "$LOG_FILE"
sleep 2
done
echo "[$(date)] $server: 安装失败(超过最大重试次数)" | tee -a "$LOG_FILE"
return 1
}
# 并发安装(最多3台同时进行)
max_workers=3
for server in "${SERVERS[@]}"; do
while [ $(jobs -r | wc -l) -ge $max_workers ]; do
sleep 1
done
install_on_server "$server" &
done
# 等待所有后台任务完成
wait
echo "[$(date)] 批量安装完成" | tee -a "$LOG_FILE"
安全审计与合规检查
安全检查脚本
#!/bin/bash
# rpm-security-audit.sh
# 安全审计:检查敏感包、未验证包等
echo "====== RPM安全审计报告 ======"
echo "生成时间: $(date)"
echo "主机名: $(hostname)"
echo ""
# 1. 检查未验证的RPM包
echo "=== 1. 未经验证的RPM包 ==="
rpm -qa | while read pkg; do
if ! rpm -K "$pkg" | grep -q "gpg.*OK"; then
echo "警告: $pkg 未通过GPG验证"
fi
done
# 2. 检查SetUID/SetGID程序
echo ""
echo "=== 2. SetUID/SetGID程序 ==="
rpm -qa --qf '%{NAME}\n' | while read pkg; do
rpm -ql "$pkg" | grep -E "^/.*" | while read file; do
if [ -f "$file" ]; then
if [ -u "$file" ] || [ -g "$file" ]; then
echo "SetUID/SetGID: $file (来自包: $pkg)"
fi
fi
done
done | sort -u
# 3. 检查重要配置文件权限
echo ""
echo "=== 3. 配置文件权限检查 ==="
IMPORTANT_FILES=("/etc/passwd" "/etc/shadow" "/etc/sudoers")
for file in "${IMPORTANT_FILES[@]}"; do
if [ -f "$file" ]; then
owner=$(stat -c %U "$file")
perms=$(stat -c %a "$file")
pkg=$(rpm -qf "$file" 2>/dev/null || echo "未知")
echo "$file: 所有者=$owner, 权限=$perms, 包=$pkg"
fi
done
# 4. 检查已安装的安全更新
echo ""
echo "=== 4. 安全更新检查 ==="
if command -v yum &>/dev/null; then
yum list-security --security | grep -i "security"
fi
性能优化与监控
RPM性能监控脚本
#!/bin/bash
# rpm-performance-monitor.sh
# 监控RPM相关性能指标
LOG_FILE="/var/log/rpm_performance.log"
monitor_rpm_operations() {
echo "====== RPM操作性能监控 ======"
echo "监控开始时间: $(date)"
echo ""
# 监控RPM数据库大小
echo "=== RPM数据库统计 ==="
du -sh /var/lib/rpm/
echo "数据库文件数: $(find /var/lib/rpm -type f | wc -l)"
# 监控查询性能
echo ""
echo "=== 查询性能测试 ==="
# 测试查询所有包的时间
START_TIME=$(date +%s%N)
rpm -qa > /dev/null
END_TIME=$(date +%s%N)
DURATION=$((($END_TIME - $START_TIME)/1000000))
echo "查询所有包耗时: ${DURATION}ms"
# 测试特定查询时间
START_TIME=$(date +%s%N)
rpm -q bash > /dev/null
END_TIME=$(date +%s%N)
DURATION=$((($END_TIME - $START_TIME)/1000000))
echo "查询单个包耗时: ${DURATION}ms"
# 检查锁文件(如果有长时间运行的RPM操作)
echo ""
echo "=== 锁状态检查 ==="
if [ -f /var/lib/rpm/.rpm.lock ]; then
echo "警告: RPM锁文件存在"
ls -la /var/lib/rpm/.rpm.lock
else
echo "RPM锁: 未锁定"
fi
}
# 记录到日志
monitor_rpm_operations | tee -a "$LOG_FILE"
# 日志轮转(保留最近30天)
find /var/log/rpm_performance.log -mtime +30 -delete
故障排除与常见问题
RPM常见错误及解决方案
错误1:依赖关系问题
# 错误信息:
# error: Failed dependencies:
# libssl.so.10 is needed by nginx-1.20.1
# 解决方案:
# 1. 查看所需依赖的详细信息
yum whatprovides libssl.so.10
# 2. 安装缺失的依赖
yum install openssl-libs
# 3. 如果确实需要忽略依赖(不推荐)
rpm -ivh --nodeps nginx.rpm
错误2:文件冲突
# 错误信息:
# file /usr/bin/nginx from install of nginx-1.20.1 conflicts with file from package nginx-1.18.0
# 解决方案:
# 1. 升级替换(推荐)
rpm -Uvh nginx-1.20.1.rpm
# 2. 强制替换文件
rpm -ivh --replacefiles nginx-1.20.1.rpm
# 3. 先卸载旧版本再安装
rpm -e nginx-1.18.0
rpm -ivh nginx-1.20.1.rpm
错误3:RPM数据库损坏
# 错误信息:
# rpmdb: /var/lib/rpm/Packages: unexpected file type or format
# 解决方案步骤:
# 1. 备份数据库
cp -r /var/lib/rpm /var/lib/rpm.backup.$(date +%Y%m%d)
# 2. 检查数据库完整性
rpm --rebuilddb
# 3. 验证修复结果
rpm -qa | head -5
# 4. 如果仍失败,尝试更彻底的方法
rm -f /var/lib/rpm/__db.*
rpm --initdb
rpm -ivh --justdb /var/cache/yum/*/packages/*.rpm
错误4:签名验证失败
# 错误信息:
# package nginx-1.20.1.rpm is not signed
# 解决方案:
# 1. 跳过签名检查(不推荐用于生产)
rpm -ivh --nosignature nginx.rpm
# 2. 导入正确的GPG密钥
rpm --import https://nginx.org/keys/nginx_signing.key
# 3. 重新验证
rpm -Kv nginx.rpm
实用诊断命令集
# RPM诊断工具箱
#!/bin/bash
# rpm-diagnostics.sh
echo "====== RPM系统诊断 ====="
# 1. 检查RPM版本
echo "RPM版本: $(rpm --version | head -1)"
# 2. 检查数据库状态
echo "RPM数据库路径: $(rpm --eval '%{_dbpath}')"
echo "数据库后端: $(rpm --eval '%{_db_backend}')"
# 3. 检查已安装包数量
echo "已安装包总数: $(rpm -qa | wc -l)"
# 4. 检查重复包
echo "重复包检查:"
rpm -qa | sort | uniq -d
# 5. 检查损坏的包
echo "损坏包检查:"
rpm -Va 2>/dev/null | head -20
# 6. 检查锁状态
if [ -f /var/lib/rpm/.rpm.lock ]; then
echo "RPM锁文件信息:"
ls -l /var/lib/rpm/.rpm.lock
echo "锁文件内容:"
cat /var/lib/rpm/.rpm.lock
fi
# 7. 检查磁盘空间
echo "RPM数据库磁盘使用:"
df -h /var/lib/rpm/
# 8. 性能测试
echo "性能测试:"
time rpm -qa > /dev/null
性能优化最佳实践
RPM数据库优化
# 优化RPM数据库配置
# 编辑 /etc/rpm/macros 或 ~/.rpmmacros
# 1. 启用压缩(节省空间,轻微性能影响)
%_binary_payload w9.gzdio
# 2. 设置并行构建(多核CPU优化)
%_smp_mflags -j4
# 3. 优化查询缓存
%__dbi_cdb create cdbi optimize
# 4. 设置临时目录(使用tmpfs提升性能)
%_tmppath /dev/shm/rpmbuild
# 5. 日志级别设置(减少日志开销)
%_debug_nosource 1
%_debug_nolibs 1
批量操作优化
#!/bin/bash
# optimized-batch-query.sh
# 优化批量查询性能
# 传统方式(慢)
# for pkg in $(rpm -qa); do rpm -qi $pkg; done
# 优化方式1:使用一次性查询
rpm -qa --qf '%{NAME}\t%{VERSION}\t%{RELEASE}\t%{INSTALLTIME:date}\n' > packages.txt
# 优化方式2:并行处理
export RPM_QUERY_FORMAT="%{NAME}\t%{VERSION}\n"
rpm -qa | xargs -P 4 -I {} rpm -q --qf "$RPM_QUERY_FORMAT" {}
# 优化方式3:使用缓存
if [ ! -f /tmp/rpm_cache.txt ] || [ $(find /tmp/rpm_cache.txt -mmin +60) ]; then
rpm -qa > /tmp/rpm_cache.txt
fi
# 后续查询使用缓存
grep "nginx" /tmp/rpm_cache.txt
存储优化策略
# 清理不必要的RPM包
#!/bin/bash
# rpm-cleanup.sh
# 1. 清理缓存包
yum clean all
# 2. 清理旧内核(保留最近3个)
package-cleanup --oldkernels --count=3
# 3. 清理孤儿包(无依赖的包)
package-cleanup --leaves
# 4. 清理重复包
package-cleanup --dupes
# 5. 清理yum事务历史(保留最近30天)
find /var/lib/yum/history -type f -mtime +30 -delete
# 6. 压缩RPM数据库(需要db4-utils)
if command -v db_dump &> /dev/null; then
db_dump /var/lib/rpm/Packages | gzip > /backup/rpmdb-$(date +%Y%m%d).gz
fi
企业实战案例
案例1:大规模集群统一包管理
#!/bin/bash
# enterprise-rpm-sync.sh
# 企业级RPM包同步管理系统
CONFIG_FILE="/etc/rpm-sync.conf"
LOG_FILE="/var/log/rpm-sync.log"
MASTER_SERVER="rpm-master.example.com"
SLAVE_SERVERS=("slave1" "slave2" "slave3")
# 从主服务器同步包列表
sync_package_list() {
echo "[$(date)] 开始同步包列表..." | tee -a "$LOG_FILE"
ssh "$MASTER_SERVER" "rpm -qa --qf '%{NAME}\t%{VERSION}-%{RELEASE}\n'" > /tmp/master-packages.txt
# 比较差异
rpm -qa --qf '%{NAME}\t%{VERSION}-%{RELEASE}\n' > /tmp/local-packages.txt
diff -u /tmp/local-packages.txt /tmp/master-packages.txt | grep -E "^[+-]" > /tmp/package-diff.txt
if [ -s /tmp/package-diff.txt ]; then
echo "发现包差异:" | tee -a "$LOG_FILE"
cat /tmp/package-diff.txt | tee -a "$LOG_FILE"
return 1
else
echo "包列表一致" | tee -a "$LOG_FILE"
return 0
fi
}
# 同步到从服务器
sync_to_slaves() {
local package=$1
local version=$2
for slave in "${SLAVE_SERVERS[@]}"; do
echo "同步 $package 到 $slave" | tee -a "$LOG_FILE"
# 检查从服务器是否已安装
if ssh "$slave" "rpm -q $package" &>/dev/null; then
local slave_version=$(ssh "$slave" "rpm -q --qf '%{VERSION}-%{RELEASE}' $package")
if [ "$slave_version" != "$version" ]; then
echo "版本不匹配: $slave ($slave_version != $version)" | tee -a "$LOG_FILE"
# 触发同步操作
trigger_sync "$slave" "$package"
fi
else
echo "$slave 未安装 $package" | tee -a "$LOG_FILE"
trigger_install "$slave" "$package"
fi
done
}
# 主循环
while true; do
if sync_package_list; then
echo "[$(date)] 同步检查完成,状态正常" | tee -a "$LOG_FILE"
else
echo "[$(date)] 发现差异,开始同步..." | tee -a "$LOG_FILE"
# 处理差异...
fi
# 每小时检查一次
sleep 3600
done
案例2:自动化的RPM包审计系统
(此部分为Python脚本,内容较长,技术要点包括:使用subprocess调用rpm命令、SQLite存储审计结果、JSON配置、邮件告警等。原文代码逻辑完整,此处保留其结构和核心函数说明,具体代码块因长度限制从略。)
实用工具推荐
必备RPM管理工具
# 安装增强工具套件
yum install -y yum-utils rpmdevtools rpmlint createrepo
# 工具清单及用途:
# 1. yum-utils - YUM增强工具(repoquery、yumdb等)
# 2. rpmdevtools - RPM开发工具
# 3. rpmlint - RPM包检查工具
# 4. createrepo - 创建YUM仓库
# 5. rpm-build - RPM构建工具
# 6. dnf-plugins-core - DNF插件核心
实用脚本工具
# rpm-helper.sh - RPM辅助工具集
#!/bin/bash
case "$1" in
"find-duplicate")
# 查找重复文件
rpm -qa | sort | uniq -d
;;
"check-obsolete")
# 检查过时的包
package-cleanup --orphans
;;
"verify-all")
# 验证所有包
rpm -Va 2>/dev/null | head -50
;;
"size-report")
# 包大小报告
rpm -qa --qf '%{size}\t%{name}\n' | sort -rn | head -20
;;
"dependency-tree")
# 依赖树状图
repoquery --tree-requires "$2"
;;
*)
echo "用法: $0 {find-duplicate|check-obsolete|verify-all|size-report|dependency-tree}"
;;
esac
学习资源与进阶
官方文档
推荐书籍
- 《RPM Package Management》 - 官方指南
- 《Linux系统管理技术手册》 - 包含RPM深度内容
- 《软件包管理艺术》 - 涵盖RPM/DPKG对比
在线练习平台
# 推荐使用Docker创建练习环境
docker run -it --rm centos:7 /bin/bash
# 在容器中练习RPM命令,不影响主机系统
总结
RPM包管理是维护RHEL、CentOS等Linux系统的核心技能。从基础的查询安装,到处理复杂的依赖关系、构建自定义包,再到设计企业级的批量管理与审计方案,深入理解RPM的工作原理和最佳实践,能极大提升系统管理的效率和可靠性。建议结合实际操作,从文中的示例命令和脚本入手,逐步构建自己的知识体系。