RHEL 7 系列,其主流管理工具是 RPMYUM(而在较新的 CentOS 8/Stream 或 Rocky Linux 中,YUM 已被 DNF 取代)。

RPM 是 Linux 下最底层的包管理工具,直接处理 .rpm 后缀的安装包文件。它像是一个“安装执行员”,负责把文件放到正确的位置。YUM 是基于 RPM 的前端管理工具。它像是一个“智能管家”,通过读取远程或本地的软件仓库(Repository)来管理软件。

RPM 命令详解

rpm 是最底层的包管理工具,通常在离线安装、安全审计、软件包打包及故障排查场景下使用它。

1. 核心操作模式 (Main Modes)

  • **-i (install)**:安装软件包。
  • **-U (upgrade)**:升级软件包。如果软件包不存在,则执行安装;如果已存在旧版本,则更新。
  • **-F (freshen)**:仅在软件包已安装的情况下进行升级。
  • **-e (erase)**:卸载软件包。
  • **-q (query)**:查询软件包信息。
  • **-V (verify)**:验证已安装软件包的完整性。

2. 通用辅助参数 (General Options)

  • **-v (verbose)**:显示指令执行过程中的详细信息。
  • **-h (hash)**:软件安装时列出标记(#),用于显示安装进度。
  • **--test**:测试模式。不实际安装或卸载,仅检查是否存在冲突或依赖问题。
  • --nodeps:忽略依赖关系。生产环境慎用,但在强制修复损坏的包时非常有效。
  • **--force**:强制执行。等同于结合了 --replacepkgs, --replacefiles, 和 --oldpackage
  • **--replacepkgs**:如果软件包已安装,强行重新安装。

3. 查询模式参数 (Query Options - -q)

  • **-qa**:列出系统当前已安装的所有 RPM 包。配合 grep 使用频率最高。
  • **-qi**:查询已安装包的详细描述信息(版本、发行商、安装时间、摘要等)。
  • **-ql**:列出软件包安装后产生的文件列表及路径。
  • **-qc**:仅列出该软件包的配置文件(通常在 /etc 下)。
  • **-qd**:仅列出该软件包的文档文件(通常在 /usr/share/man 下)。
  • **-qf [file_path]**:反向查询。输入一个文件路径,确认它属于哪个 RPM 包。
  • **-qR (requires)**:列出该软件包所依赖的其它能力或包。
  • -qp [rpm_file]:针对未安装.rpm 文件进行查询(配合上述参数如 -qpl, -qpi 使用)。

4. 验证模式参数 (Verify Options - -V)

  • **-Va**:验证系统中所有已安装的软件包。
  • **-Vp [rpm_file]**:验证指定的 RPM 文件的正确性。
  • 验证输出代码释义 (Architect’s Tip):
    • S:文件大小 (Size) 不一致。
    • M:模式 (Mode) 不一致(包括权限或文件类型)。
    • 5:MD5 校验和不一致(文件内容可能被篡改)。
    • D:设备 (Device) 主次代码不匹配。
    • L:符号链接 (Link) 路径不匹配。
    • U:属主 (User) 不一致。
    • G:属组 (Group) 不一致。
    • T:修改时间 (Time) 不一致。

5. 卸载与特殊场景参数 (Erase & Special)

  • **--noscripts**:不执行软件包自带的安装/卸载脚本(如 preinstall, postinstall)。用于处理脚本报错导致包无法卸载的情况。
  • **--oldpackage**:允许“升级”到旧版本(即降级操作)。
  • **--dbpath [path]**:指定 RPM 数据库的路径。如果系统 /var/lib/rpm 损坏,可以通过备份路径修复。
  • **--rebuilddb**:重建 RPM 数据库。当 rpm 命令卡死或报错数据库损坏时使用。

案例速查

  • 离线安装一个复杂的包并忽略报错:

    rpm -ivh --nodeps --force oracle-database.rpm

  • 查看某个命令是由哪个包安装的:

    rpm -qf $(which nginx)

  • 在安装前确认包里都有什么:

    rpm -qpl package_v1.2.rpm

  • 检查系统中哪些核心配置文件被修改过:

    rpm -Va | grep '^..5....c' (c 代表配置文件)

RPM 虽然不解决依赖,但它是 Linux 系统的“户口本”。掌握了 rpm -Varpm -qf,就拥有了审计系统安全和追溯配置源头的能力。

RPM (Red Hat Package Manager) 实战案例

RPM 常用于处理单个二进制包、离线环境校验或自定义软件打包。

  • 安装与依赖分析:
    • rpm -ivh package.rpm:安装并显示进度,常用于安装官方提供的底层工具(如内核、驱动)。
    • rpm -qpR package.rpm架构师必用。在安装前查看该 RPM 包定义的依赖列表,评估系统库是否兼容。
  • 安全审计与完整性校验:
    • rpm -Va系统巡检神器。校验系统中所有已安装包的完整性,对比 MD5、权限、大小。如果 /usr/bin/ls 被篡改(如木马),该命令会立刻发现。
    • rpm -Vp package.rpm:验证某个特定包的文件是否被修改过。
  • 查询与追溯:
    • rpm -qf /etc/nginx/nginx.conf:追溯某个配置文件是由哪个 RPM 包生成的,便于定位原始配置模板。
    • rpm -qlp package.rpm:在不安装的情况下,列出 RPM 包内包含的文件路径,确认软件会安装到哪些目录。
    • rpm -qi package_name:查看软件的详细元数据(如编译日期、厂商、数字签名),用于验证软件来源。
  • 卸载与清理:
    • rpm -e --nodeps package_name:强行卸载包而不检查依赖。生产环境慎用,仅在处理极其棘手的版本冲突时使用。

YUM 命令详解

在 CentOS 7 生产环境中,yum(Yellowdog Updater, Modified)是架构师进行批量部署、自动依赖处理和系统更新的核心工具。它通过读取存储在 /etc/yum.repos.d/ 下的 .repo 配置文件,实现从软件仓库自动获取并安装 RPM 包。

1. 核心操作模式 (Primary Commands)

  • **install**:安装指定软件包。
    • yum install [package]:安装软件。
    • yum localinstall [path/to/rpm]:安装本地 RPM 包,并自动从仓库下载缺失的依赖。
  • **update / upgrade**:更新软件包。
    • update:更新包版本并保留旧包。
    • upgrade:更新并删除旧包(类似 yum update --obsoletes),通常用于大版本跨越。
  • **remove / erase**:卸载软件包。
    • yum remove [package]:卸载软件(注意:可能会连带卸载其他依赖此包的软件)。
  • **list**:列出软件包。
    • yum list installed:列出所有已安装的包。
    • yum list available:列出仓库中可安装但未安装的包。
  • **search / info**:查询。
    • yum search [keyword]:按关键字搜索匹配的包。
    • yum info [package]:查看包的详细描述(类似 rpm -qi)。

2. 通用辅助参数 (General Options)

  • **-y (assumeyes)**:对所有交互提示自动回答“yes”。用于自动化脚本。
  • **-q (quiet)**:静默模式。不显示安装过程,常用于 cron 定时任务。
  • **-v (verbose)**:详尽模式。输出更多调试信息。
  • **--enablerepo=[repo_id]**:临时启用某个禁用的仓库。
  • **--disablerepo=[repo_id]**:临时禁用某个仓库(常用于排除某些有冲突的源)。
  • **--downloadonly**:仅下载 RPM 包而不执行安装。需配合 --downloaddir 使用。
  • **--exclude=[package]**:排除特定包。例如 yum update --exclude=kernel* 升级系统但跳过内核。

3. 架构师进阶维护参数 (Advanced Maintenance)

  • provides / whatprovides架构师最高频命令。查询哪个包提供了某个特定文件或路径。
    • 案例:yum provides "*/libcrypto.so.10"
  • **history**:事务审计。
    • yum history list:查看最近的安装/更新历史。
    • yum history info [ID]:查看某次事务的具体详情。
    • yum history undo [ID]:撤销某次操作。
  • **repolist**:列出当前启用的仓库。
    • yum repolist all:查看所有仓库(包括禁用的)及其状态。
  • **clean**:清理缓存。
    • yum clean all:清除索引、包文件及元数据。更换国内源后的必备步骤。
  • **makecache**:构建元数据缓存,提升后续搜索和安装速度。

4. 分组操作 (Group Commands)

针对整套环境(如“Development Tools”或“Web Server”)的批量操作。

  • **grouplist**:列出所有可用的软件组。
  • **groupinstall "Development Tools"**:一键安装开发套件(gcc, make 等)。
  • **groupinfo [group_name]**:查看组内包含的具体软件包。

5. 依赖与清理插件 (Plugins & Utils)

  • **yum-config-manager**:动态修改 .repo 配置文件。
    • yum-config-manager --enable [repo_id]
  • **package-cleanup**:属于 yum-utils 包。
    • package-cleanup --oldkernels --count=2:仅保留最后 2 个内核,清理旧内核释放 /boot 空间。
    • package-cleanup --problems:检查系统中的依赖冲突问题。

案例速查

  • 全量同步公网源到本地目录:

    reposync -n -r base -p /var/www/html/repo/

  • 离线提取全量依赖包:

    yum install --downloadonly --downloaddir=/mnt/pkgs nginx

  • 锁定关键软件版本防止误升级:

    yum versionlock add docker-ce (需安装 yum-plugin-versionlock)

  • 查看最近一次安装失败的详细日志:

    yum history redo last (尝试重新执行并观察报错)

YUM (Yellowdog Updater, Modified) 实战案例

YUM 是架构师管理集群、解决依赖和维护环境一致性的核心工具。

  • 仓库管理与分发 (Repo Management):
    • yum-config-manager --add-repo http://internal.repo/centos7:快速添加企业内网私有仓库。
    • createrepo -v /data/myrepo/:将本地 RPM 目录转化为可用的 YUM 仓库,是实现内网离线分发的第一步。
    • reposync -r base -p /var/www/html/:将公网(阿里云/清华等)全量同步到本地,构建内网镜像源。
  • 生产环境安全操作:
    • yum history:查看 YUM 操作流水线。
    • yum history undo [ID]生产环境后悔药。回滚某次错误的安装或升级操作,自动处理依赖撤回。
    • yum update --security:仅安装与安全相关的补丁,不升级功能组件,确保生产环境稳定。
  • 版本控制 (Version Control):
    • yum install yum-plugin-versionlock:安装版本锁插件。
    • yum versionlock add nginx架构师必选操作。锁定 Nginx 版本,防止后续全局升级导致业务意外停机。
  • 依赖下载与离线打包:
    • yum install --downloadonly --downloaddir=/tmp/offline_pkgs nginx:只下载 Nginx 及其全量依赖包但不安装,用于拷贝到物理隔离的内网服务器。
  • 高级查询技巧:
    • yum provides "*/netstat":当找不到某个命令时,搜索哪个包提供了这个路径。
    • yum deplist nginx:列出 Nginx 所有的依赖关系树。
    • yum check-update:静默检查是否有更新,常用于自动化运维脚本中的前置检查。
  • 系统瘦身与维护:
    • yum clean all:清除 YUM 缓存,解决因元数据过期导致的安装失败。
    • package-cleanup --orphans:查找系统中不再存在于任何仓库的孤儿包,清理无效依赖。

经验总结 (Best Practices)

  • **禁止在生产环境直接跑 yum update -y**:这会导致内核或底层库(如 glibc)被意外升级,建议使用 exclude=kernel* 参数。
  • 构建 GPG 校验体系:在企业内网分发 RPM 时,架构师会给每个包进行数字签名,YUM 安装时开启 gpgcheck=1,防止软件包在传输过程中被劫持或篡改。
  • 优先使用 RPM 打包:如果是源码编译的软件(如自定义模块的 Nginx),不建议直接 make install,而是通过 fpmrpmbuild 打成 RPM 包再通过 YUM 分发,这样可以保证集群内所有节点的版本路径完全一致。