【Linux】yum与rpm实战:从依赖解析到离线部署的完整指南

1. 理解yum与rpm的基础关系

在Red Hat系Linux系统中,yum和rpm就像是一对默契的搭档。rpm(Red Hat Package Manager)是底层的包管理工具,负责单个软件包的安装、查询和卸载。而yum(Yellowdog Updater Modified)则是基于rpm构建的高级工具,它最大的价值在于能自动解决依赖关系。

我刚开始接触Linux时,曾经用rpm -ivh直接安装一个软件包,结果系统提示缺少十几个依赖项。当时不得不手动一个个下载安装,结果发现这些依赖包还有自己的依赖,简直像掉进了无底洞。这就是yum存在的意义——它能自动分析并下载所有需要的依赖包。

关键区别

  • rpm处理单个包时像手工组装家具,需要自己准备所有零件
  • yum则像全套服务,连螺丝刀都会帮你准备好

2. 联网环境下的依赖解析实战

2.1 查询依赖关系的四种方法

当我们需要安装一个软件时,首先应该了解它的依赖关系。这里分享几个实用命令:

# 查询已安装包的依赖 rpm -qR nginx # 查询未安装包的依赖 rpm -qpR /path/to/package.rpm # 使用yum查看更详细的依赖树 yum deplist docker-ce # 检查文件属于哪个包(反向查询) rpm -qf /usr/bin/vi

最近我在配置一个CI/CD环境时,需要确认gitlab-runner的依赖项。使用yum deplist gitlab-runner后发现它依赖的Ruby版本与现有系统不兼容,提前发现了这个潜在冲突。

2.2 解决环形依赖的技巧

环形依赖就像"先有鸡还是先有蛋"的问题。比如包A依赖B,B依赖C,而C又依赖A。遇到这种情况时:

  1. 可以尝试用一条命令同时安装所有相关包:
yum install packageA packageB packageC
  1. 特殊情况下可能需要使用--nodeps参数(慎用):
rpm -ivh --nodeps problematic.rpm

记得去年部署一个金融系统时,遇到三个安全包之间的环形依赖。最终是通过创建本地仓库,用createrepo命令生成元数据后,才用yum成功安装。

3. 离线环境部署全攻略

3.1 完整下载包及其依赖

在生产环境中,经常需要在内网机器上部署软件。这时候就需要先在联网机器上准备好所有依赖:

# 安装下载工具 yum install yum-utils -y # 下载主包及所有依赖 repotrack --download_path=/opt/packages nginx # 或者使用downloadonly模式 yum install --downloadonly --downloaddir=/opt/packages nginx

注意事项

  • repotrack会下载所有可能的依赖版本
  • downloadonly只下载当前系统缺少的依赖
  • 建议使用相同版本的系统进行操作

3.2 构建离线仓库

下载完所有rpm包后,需要将其组织成yum可识别的仓库:

# 安装仓库创建工具 yum install createrepo -y # 创建仓库元数据 createrepo /opt/packages # 生成仓库配置文件 cat > /etc/yum.repos.d/local.repo <<EOF [local] name=Local Repository baseurl=file:///opt/packages enabled=1 gpgcheck=0 EOF

在最近一次给银行做系统迁移时,我们就是用这种方法准备了包含300+个包的离线仓库。关键是要确保所有依赖都被完整下载,可以通过yum repolist检查仓库是否可用。

4. 高级技巧与故障排查

4.1 依赖冲突解决

当两个软件需要不同版本的同一个依赖时,可以尝试:

# 查看冲突详情 yum install package1 package2 # 使用版本锁定 yum versionlock add packageX

4.2 特殊场景处理

场景一:系统已有旧版本依赖

# 使用--oldpackage参数 rpm -Uvh --oldpackage package-1.0.rpm

场景二:文件冲突

# 使用--replacefiles参数 rpm -ivh --replacefiles conflict-package.rpm

场景三:需要保留多个版本

# 使用alternatives系统 alternatives --install /usr/bin/python python /usr/bin/python2.7 50

4.3 实用脚本分享

这是一个自动下载依赖包并创建仓库的脚本:

#!/bin/bash PKG_NAME=$1 DOWNLOAD_DIR="/opt/packages/${PKG_NAME}" mkdir -p ${DOWNLOAD_DIR} repotrack -p ${DOWNLOAD_DIR} ${PKG_NAME} createrepo ${DOWNLOAD_DIR} echo "离线仓库已创建于 ${DOWNLOAD_DIR}" echo "请将整个目录复制到目标机器并配置repo文件"

5. 最佳实践与经验总结

经过多年运维实践,我总结出几个关键点:

  1. 版本一致性:离线环境所有机器的系统版本应该尽量一致,避免依赖问题
  2. 仓库管理:建议按项目或功能创建不同的仓库目录,方便维护
  3. 依赖检查:部署前先用rpm -qpR检查依赖是否齐全
  4. 测试验证:先在测试环境验证离线安装过程

曾经有个教训:在某次紧急部署中,我直接复制了开发机的rpm包到生产环境,结果因为glibc版本差异导致整个系统崩溃。现在我会严格遵循以下流程:

  1. 使用相同版本的系统镜像创建临时虚拟机
  2. 在干净环境中测试所有依赖
  3. 制作部署检查清单
  4. 保留回滚方案

对于关键系统组件,建议不仅下载运行时依赖,还要包括调试符号和开发包:

repotrack --archlist=x86_64,noarch glibc glibc-devel glibc-common

最后提醒:所有操作都要在测试环境验证后再上生产。养成使用--test参数测试的好习惯:

rpm -Uvh --test *.rpm