Linux rpm命令

RPM包管理: rpm(Red Hat Package Manager)是Red Hat系列Linux发行版(如RHEL、CentOS、Fedora)的标准包管理器,用于安装、查询、验证、更新和卸载软件包。

命令简介

rpm命令是Red Hat Package Manager的缩写,是Red Hat系列Linux发行版的软件包管理工具。它可以管理以.rpm为扩展名的软件包,提供软件安装、卸载、查询、验证和更新等功能。

主要功能
  • 安装、升级和卸载软件包
  • 查询软件包信息和文件
  • 验证软件包完整性
  • 构建和管理RPM包
  • 检查软件包依赖关系
适用系统
  • Red Hat Enterprise Linux
  • CentOS
  • Fedora
  • openSUSE
  • 其他RPM-based系统

命令语法

rpm [选项] [软件包名|文件]

RPM包命名规则

RPM包的命名通常遵循以下格式:

包名-版本号-发布号.架构.rpm

例如:nginx-1.18.0-1.el8.x86_64.rpm

  • 包名: nginx
  • 版本号: 1.18.0
  • 发布号: 1.el8(第1次发布,针对Enterprise Linux 8)
  • 架构: x86_64(64位系统)

主要操作模式

模式 选项 描述
安装/升级/卸载 -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

使用示例

以下示例需要root权限,可以使用sudo或以root用户身份执行。

1. 软件包安装

安装一个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

2. 软件包升级

升级已安装的软件包:

# 升级软件包(如果未安装则安装)
rpm -Uvh package-new.rpm

# 只升级已安装的软件包
rpm -Fvh package-new.rpm

# 测试升级(不实际执行)
rpm -Uvh --test package-new.rpm

3. 软件包卸载

卸载已安装的软件包:

# 卸载软件包
rpm -e nginx

# 卸载时显示详细信息
rpm -ev nginx

# 强制卸载(即使有其他包依赖)
rpm -e --nodeps nginx

4. 软件包查询

查询软件包信息:

# 查询是否安装了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

5. 软件包验证

验证软件包的完整性:

# 验证已安装的软件包
rpm -V nginx

# 验证所有已安装的软件包
rpm -Va

# 验证RPM文件
rpm -Vp package.rpm

# 验证文件所属的软件包
rpm -Vf /usr/sbin/nginx

# 验证输出说明(如果文件被修改):
# S: 文件大小改变
# M: 权限或文件类型改变
# 5: MD5校验和改变
# D: 设备主/次设备号改变
# L: 符号链接路径改变
# U: 用户所有权改变
# G: 组所有权改变
# T: 修改时间改变

6. GPG签名验证

验证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数据库操作

RPM数据库存储在/var/lib/rpm目录中,有时需要维护:

# 重建RPM数据库(解决数据库损坏问题)
rpm --rebuilddb

# 初始化新数据库
rpm --initdb

# 检查数据库一致性
rpm -Va --nofiles --nomd5

# 查看数据库统计信息
rpm -qa --queryformat '%{NAME}\n' | wc -l

实际应用场景

场景1:安装本地RPM包
#!/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 "安装失败"
场景2:查找和诊断问题
#!/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
场景3:安全卸载软件包
#!/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: 主要区别:

  • rpm: 底层工具,直接操作RPM包,不自动解决依赖
  • yum/dnf: 高层工具,基于rpm,自动解决依赖关系,从仓库安装
  • 使用场景:
    • rpm:安装本地RPM包,查询包信息,验证包完整性
    • yum/dnf:从网络仓库安装,自动处理依赖

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

实用技巧

技巧1:批量操作
# 批量安装多个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
技巧2:高级查询
# 使用查询格式自定义输出
rpm -qa --queryformat '%{NAME}-%{VERSION}-%{RELEASE}\n'

# 查询最近安装的包
rpm -qa --last | head -10

# 查询按大小排序的包
rpm -qa --queryformat '%{SIZE} %{NAME}\n' | sort -nr | head -10
命令总结
  • rpm 是Red Hat系列Linux的包管理工具
  • 安装: rpm -ivh package.rpm
  • 升级: rpm -Uvh package.rpm
  • 卸载: rpm -e package
  • 查询: rpm -q[选项] package
  • 验证: rpm -V package
  • 依赖: 建议使用yum/dnf自动解决依赖
  • 数据库: 位于/var/lib/rpm,可用--rebuilddb修复

rpm与yum/dnf对比

特性 rpm yum/dnf
依赖处理 手动处理 自动解决
安装源 本地文件 本地/网络仓库
复杂性 简单直接 功能丰富
适用场景 本地包管理、查询、验证 系统更新、仓库管理
推荐使用 查询信息、验证完整性、本地安装 日常安装、更新、依赖解决