一、为什么需要离线安装软件包

在日常工作中,我们经常会遇到这样的场景:生产服务器处于严格的内网环境,无法连接互联网;或者需要批量部署的机器没有外网访问权限。这时候,传统的yum install命令就完全失效了。想象一下,你正急着部署一个关键服务,却因为网络问题卡在软件安装这一步,那感觉就像开车时突然没油了一样难受。

离线安装的核心思路其实很简单:先在能上网的机器上下载好所有需要的软件包及其依赖,然后把这些包搬运到目标机器上,最后在本地完成安装。这就像去超市采购食材回家做饭,而不是叫外卖。

二、准备工作与环境说明

为了让大家能够跟着操作,我这里使用CentOS 7作为演示系统。其他基于RPM的发行版(如RHEL、Fedora)操作也大同小异。你需要准备:

  1. 一台能上网的机器(我们称为下载机)
  2. 一台不能上网的目标机器
  3. 至少2GB的可用磁盘空间
  4. 确保两台机器的系统版本和架构一致

先检查系统基本信息:

# 查看系统版本
cat /etc/redhat-release

# 查看系统架构
uname -m

三、下载软件包及其依赖

这里我们以安装nginx为例,演示如何完整下载一个软件包及其所有依赖。

首先在下载机上创建下载目录:

mkdir -p /opt/offline-packages/nginx
cd /opt/offline-packages/nginx

使用yum的downloadonly插件下载:

# 先安装插件(如果尚未安装)
yum install -y yum-plugin-downloadonly

# 下载nginx及其所有依赖
yum install --downloadonly --downloaddir=./ nginx

如果遇到某些包无法下载,可以尝试:

# 启用所有仓库
yum-config-manager --enable *

# 重新尝试下载
yum reinstall --downloadonly --downloaddir=./ nginx

下载完成后,使用以下命令查看所有下载的rpm包:

ls -lh

四、处理依赖关系

下载的包可能会有交叉依赖,我们需要确保所有依赖都被正确包含。可以创建一个本地仓库来解决这个问题。

首先安装创建仓库的工具:

yum install -y createrepo

然后在下载目录创建仓库元数据:

createrepo /opt/offline-packages/nginx

这个命令会生成一个repodata目录,里面包含了所有包的元信息。现在我们就有了一个完整的本地仓库。

五、将包传输到目标机器

有多种方式可以把下载好的包传输到目标机器:

  1. 使用U盘等物理介质拷贝
  2. 通过内网scp传输
  3. 如果有跳板机,可以通过跳板机中转

这里演示scp方式:

# 从下载机打包并传输
tar czvf nginx-offline.tar.gz /opt/offline-packages/nginx
scp nginx-offline.tar.gz user@target-machine:/tmp/

# 在目标机器上解压
ssh user@target-machine "tar xzvf /tmp/nginx-offline.tar.gz -C /opt/"

六、在目标机器上配置本地yum源

现在我们在目标机器上操作。首先备份原有的yum源配置:

mkdir /etc/yum.repos.d/bak
mv /etc/yum.repos.d/*.repo /etc/yum.repos.d/bak/

然后创建本地源配置文件:

cat > /etc/yum.repos.d/local-nginx.repo << 'EOF'
[local-nginx]
name=Local Nginx Repository
baseurl=file:///opt/offline-packages/nginx
enabled=1
gpgcheck=0
EOF

更新yum缓存:

yum clean all
yum makecache

七、离线安装软件包

现在可以像平常一样使用yum安装了:

yum install -y nginx

验证安装:

nginx -v
rpm -qa | grep nginx

如果需要安装其他软件,只需重复上述过程,将新的rpm包放入仓库目录后,重新生成元数据:

createrepo --update /opt/offline-packages/nginx

八、高级技巧与注意事项

  1. 批量下载多个软件
# 可以一次下载多个软件
yum install --downloadonly --downloaddir=./ nginx httpd mariadb
  1. 处理已安装软件的依赖
# 查看已安装软件的依赖
repoquery --requires --resolve nginx

# 下载这些依赖
yum reinstall --downloadonly --downloaddir=./ $(repoquery --requires --resolve nginx)
  1. 空间不足问题

    • 可以使用--exclude参数排除不需要的包
    • 或者先下载到有足够空间的挂载点
  2. 版本锁定

    • 在下载时指定版本号可以避免版本不一致问题
    yum install --downloadonly --downloaddir=./ nginx-1.20.1
    
  3. 常见错误处理

    • 如果遇到"Package already installed"错误,可以尝试:
    yum reinstall --downloadonly --downloaddir=./ nginx
    

九、应用场景与技术优缺点

典型应用场景

  1. 安全要求高的内网环境部署
  2. 大批量服务器的标准化部署
  3. 需要固定软件版本的生产环境
  4. 网络条件受限的现场实施

技术优点

  1. 完全脱离对外网依赖
  2. 可以精确控制软件版本
  3. 一次准备,多次使用
  4. 便于版本管理和回滚

技术缺点

  1. 准备工作较繁琐
  2. 需要手动处理依赖关系
  3. 占用额外存储空间
  4. 更新不及时,可能遗漏安全补丁

注意事项

  1. 确保下载机和目标机的系统版本完全一致
  2. 注意架构兼容性(x86_64、arm等)
  3. 定期更新离线仓库中的软件包
  4. 重要环境建议先测试再部署

十、总结与建议

通过本文的详细步骤,相信你已经掌握了在无网络环境下使用yum离线安装软件包的完整流程。这种方法虽然准备工作较多,但在特定场景下是不可替代的解决方案。

对于长期维护的离线环境,我有几个建议:

  1. 建立一个完整的本地镜像仓库,而不仅是单个软件的仓库
  2. 制定定期更新机制,确保安全补丁能够及时应用
  3. 做好版本记录和变更管理
  4. 可以考虑使用Ansible等工具自动化部署流程

记住,技术没有最好的,只有最合适的。离线安装虽然看起来"原始",但在很多场景下却是最可靠的解决方案。希望这篇指南能帮助你在无网络环境下也能游刃有余地完成软件部署工作。