rpm命令是Red Hat Package Manager的缩写,是Red Hat系列Linux发行版的软件包管理工具。它可以管理以.rpm为扩展名的软件包,提供软件安装、卸载、查询、验证和更新等功能。
rpm [选项] [软件包名|文件]
RPM包的命名通常遵循以下格式:
包名-版本号-发布号.架构.rpm
例如:nginx-1.18.0-1.el8.x86_64.rpm
| 模式 | 选项 | 描述 |
|---|---|---|
| 安装/升级/卸载 | -i, -U, -e |
管理软件包的安装、升级和删除 |
| 查询 | -q |
查询已安装或未安装的软件包信息 |
| 验证 | -V |
验证软件包的文件完整性 |
| 检查签名 | --checksig |
检查软件包的GPG签名 |
| 构建 | -b |
从源码构建RPM包 |
| 选项 | 说明 | 示例 |
|---|---|---|
-i, --install |
安装软件包 | rpm -i package.rpm |
-U, --upgrade |
升级软件包(如果未安装则安装) | rpm -U package.rpm |
-F, --freshen |
只升级已安装的软件包 | rpm -F package.rpm |
-e, --erase |
卸载软件包 | rpm -e package |
-v |
显示详细信息 | rpm -iv package.rpm |
-h, --hash |
显示安装进度条 | rpm -ih package.rpm |
--nodeps |
不检查依赖关系 | rpm -i --nodeps package.rpm |
--force |
强制安装/覆盖文件 | rpm -i --force package.rpm |
| 选项 | 说明 | 示例 |
|---|---|---|
-q, --query |
查询软件包 | rpm -q package |
-a, --all |
查询所有已安装的软件包 | rpm -qa |
-f, --file |
查询文件所属的软件包 | rpm -qf /path/to/file |
-p, --package |
查询RPM文件信息(未安装) | rpm -qp package.rpm |
-i, --info |
显示软件包信息 | rpm -qi package |
-l, --list |
列出软件包的文件 | rpm -ql package |
--provides |
列出软件包提供的功能 | rpm -q --provides package |
--requires, -R |
列出软件包的依赖 | rpm -qR package |
--changelog |
显示软件包更新日志 | rpm -q --changelog package |
sudo或以root用户身份执行。
安装一个RPM软件包:
# 基本安装
rpm -ivh nginx-1.18.0-1.el8.x86_64.rpm
# 组合选项说明:
# -i: 安装
# -v: 显示详细信息
# -h: 显示进度条(hash marks)
# 如果软件包已存在,可以使用--replacepkgs重新安装
rpm -ivh --replacepkgs package.rpm
# 忽略依赖安装(不推荐,可能导致软件无法运行)
rpm -ivh --nodeps package.rpm
升级已安装的软件包:
# 升级软件包(如果未安装则安装)
rpm -Uvh package-new.rpm
# 只升级已安装的软件包
rpm -Fvh package-new.rpm
# 测试升级(不实际执行)
rpm -Uvh --test package-new.rpm
卸载已安装的软件包:
# 卸载软件包
rpm -e nginx
# 卸载时显示详细信息
rpm -ev nginx
# 强制卸载(即使有其他包依赖)
rpm -e --nodeps nginx
查询软件包信息:
# 查询是否安装了nginx
rpm -q nginx
# 查询所有已安装的软件包
rpm -qa
# 查询所有已安装的软件包,按名称排序
rpm -qa | sort
# 查询包含"http"的软件包
rpm -qa | grep http
# 查询软件包详细信息
rpm -qi nginx
# 查询软件包包含的文件
rpm -ql nginx
# 查询文件属于哪个软件包
rpm -qf /usr/sbin/nginx
# 查询RPM文件信息(未安装)
rpm -qpi package.rpm
# 查询RPM文件包含的文件(未安装)
rpm -qpl package.rpm
# 查询软件包的依赖
rpm -qR nginx
# 查询软件包提供的功能
rpm -q --provides nginx
验证软件包的完整性:
# 验证已安装的软件包
rpm -V nginx
# 验证所有已安装的软件包
rpm -Va
# 验证RPM文件
rpm -Vp package.rpm
# 验证文件所属的软件包
rpm -Vf /usr/sbin/nginx
# 验证输出说明(如果文件被修改):
# S: 文件大小改变
# M: 权限或文件类型改变
# 5: MD5校验和改变
# D: 设备主/次设备号改变
# L: 符号链接路径改变
# U: 用户所有权改变
# G: 组所有权改变
# T: 修改时间改变
验证RPM包的GPG签名:
# 导入GPG密钥
rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
# 检查RPM包的签名
rpm --checksig package.rpm
# 安装时自动验证签名
rpm -K package.rpm
RPM会自动处理软件包依赖关系,但有时需要手动解决依赖问题:
# 查找提供特定文件的软件包(用于解决依赖)
yum whatprovides libssl.so.10 # 使用yum工具
# 或者使用rpm命令查询
rpm -qf /usr/lib64/libssl.so.10
# 查询缺失的依赖
ldd /usr/sbin/nginx # 检查动态链接库
# 手动下载并安装依赖
# 1. 先尝试用yum/dnf自动解决
yum install package.rpm
# 2. 如果必须手动安装,按依赖顺序安装
# 先安装底层依赖,再安装上层软件
RPM数据库存储在/var/lib/rpm目录中,有时需要维护:
# 重建RPM数据库(解决数据库损坏问题)
rpm --rebuilddb
# 初始化新数据库
rpm --initdb
# 检查数据库一致性
rpm -Va --nofiles --nomd5
# 查看数据库统计信息
rpm -qa --queryformat '%{NAME}\n' | wc -l
#!/bin/bash
# 安装本地RPM包的完整流程
echo "=== RPM包安装流程 ==="
# 1. 检查RPM文件是否存在
RPM_FILE="nginx-1.18.0-1.el8.x86_64.rpm"
if [ ! -f "$RPM_FILE" ]; then
echo "错误: 文件 $RPM_FILE 不存在"
exit 1
fi
# 2. 检查GPG签名
echo "检查软件包签名..."
rpm --checksig "$RPM_FILE" || echo "警告: 签名验证失败"
# 3. 检查是否已安装
PACKAGE_NAME=$(rpm -qp --queryformat '%{NAME}' "$RPM_FILE")
echo "软件包名称: $PACKAGE_NAME"
if rpm -q "$PACKAGE_NAME" >/dev/null 2>&1; then
echo "$PACKAGE_NAME 已安装,执行升级..."
rpm -Uvh "$RPM_FILE"
else
echo "安装 $PACKAGE_NAME..."
rpm -ivh "$RPM_FILE"
fi
# 4. 验证安装
echo "验证安装..."
rpm -q "$PACKAGE_NAME" && echo "安装成功" || echo "安装失败"
#!/bin/bash
# 查找问题文件的所属软件包
echo "=== 文件诊断工具 ==="
# 检查命令是否存在
check_command() {
CMD="$1"
if ! command -v "$CMD" >/dev/null 2>&1; then
echo "命令 $CMD 不存在"
# 尝试查找提供该命令的软件包
CMD_PATH=$(which "$CMD" 2>/dev/null || type -p "$CMD" 2>/dev/null)
if [ -n "$CMD_PATH" ]; then
echo "查找 $CMD_PATH 的所属软件包..."
rpm -qf "$CMD_PATH" 2>/dev/null || echo "未找到所属软件包"
fi
else
echo "命令 $CMD 存在: $(which "$CMD")"
fi
}
# 检查文件是否被修改
check_file_integrity() {
FILE="$1"
if [ -f "$FILE" ]; then
echo "检查文件完整性: $FILE"
rpm -Vf "$FILE"
fi
}
# 使用示例
check_command nginx
check_command httpd
check_file_integrity /etc/nginx/nginx.conf
#!/bin/bash
# 安全卸载软件包的流程
echo "=== 安全卸载流程 ==="
PACKAGE="nginx"
# 1. 检查软件包是否安装
if ! rpm -q "$PACKAGE" >/dev/null 2>&1; then
echo "$PACKAGE 未安装"
exit 0
fi
# 2. 检查依赖关系
echo "检查 $PACKAGE 的依赖关系..."
DEPENDENTS=$(rpm -q --whatrequires "$PACKAGE" 2>/dev/null)
if [ -n "$DEPENDENTS" ]; then
echo "警告: 以下软件包依赖 $PACKAGE:"
echo "$DEPENDENTS"
read -p "继续卸载? (y/n): " CONFIRM
[ "$CONFIRM" != "y" ] && exit 1
fi
# 3. 备份配置文件
echo "备份配置文件..."
rpm -ql "$PACKAGE" | grep -E '\.conf$|\.cfg$' | while read -r CONFIG_FILE; do
if [ -f "$CONFIG_FILE" ]; then
BACKUP_FILE="${CONFIG_FILE}.backup.$(date +%Y%m%d)"
cp -p "$CONFIG_FILE" "$BACKUP_FILE"
echo "已备份: $CONFIG_FILE -> $BACKUP_FILE"
fi
done
# 4. 卸载软件包
echo "卸载 $PACKAGE..."
rpm -ev "$PACKAGE"
# 5. 验证卸载
if ! rpm -q "$PACKAGE" >/dev/null 2>&1; then
echo "$PACKAGE 卸载成功"
else
echo "$PACKAGE 卸载失败"
exit 1
fi
A: 主要区别:
A: 解决依赖错误的几种方法:
# 1. 使用yum/dnf安装(推荐)
yum install package.rpm
# 2. 手动下载依赖包
# 查找缺失的依赖
rpm -qpR package.rpm
# 3. 使用--nodeps忽略依赖(不推荐)
rpm -ivh --nodeps package.rpm
# 4. 使用rpmfind.net查找依赖包
# 访问 https://rpmfind.net/ 搜索需要的包
A: 使用查询选项:
# 查看包信息
rpm -qpi package.rpm
# 查看包含的文件
rpm -qpl package.rpm
# 查看依赖
rpm -qpR package.rpm
# 查看安装前后脚本
rpm -qp --scripts package.rpm
# 使用rpm2cpio解压查看
rpm2cpio package.rpm | cpio -t
A: 重建RPM数据库:
# 备份当前数据库
cp -r /var/lib/rpm /var/lib/rpm.backup
# 重建数据库
rpm --rebuilddb
# 验证数据库
rpm -qa > /dev/null && echo "数据库正常" || echo "数据库异常"
# 如果仍然有问题,尝试初始化
rm -f /var/lib/rpm/__db.*
rpm --initdb
# 批量安装多个RPM包
rpm -ivh *.rpm
# 批量查询多个包
rpm -q $(ls *.rpm | sed 's/\.rpm$//')
# 批量卸载
for pkg in nginx httpd mysql; do
rpm -e $pkg 2>/dev/null && echo "已卸载 $pkg"
done
# 使用查询格式自定义输出
rpm -qa --queryformat '%{NAME}-%{VERSION}-%{RELEASE}\n'
# 查询最近安装的包
rpm -qa --last | head -10
# 查询按大小排序的包
rpm -qa --queryformat '%{SIZE} %{NAME}\n' | sort -nr | head -10
rpm -ivh package.rpmrpm -Uvh package.rpmrpm -e packagerpm -q[选项] packagerpm -V package/var/lib/rpm,可用--rebuilddb修复| 特性 | rpm | yum/dnf |
|---|---|---|
| 依赖处理 | 手动处理 | 自动解决 |
| 安装源 | 本地文件 | 本地/网络仓库 |
| 复杂性 | 简单直接 | 功能丰富 |
| 适用场景 | 本地包管理、查询、验证 | 系统更新、仓库管理 |
| 推荐使用 | 查询信息、验证完整性、本地安装 | 日常安装、更新、依赖解决 |