RHEL7系列软件包管理
RHEL 7 系列,其主流管理工具是 RPM 和 YUM(而在较新的 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 -Va 和 rpm -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,而是通过fpm或rpmbuild打成 RPM 包再通过 YUM 分发,这样可以保证集群内所有节点的版本路径完全一致。
