拓冰建站拓冰建站
首页 / 资讯中心 / 正文

Linux运维实战:yumdownloader与repotrack离线安装包下载与部署指南

1. 为什么需要离线安装包一个运维老兵的场景复盘在Linux运维这条路上干了十几年我敢说几乎每个运维工程师都遇到过“断网”这个终极难题。这可不是指家里宽带断了那么简单而是指生产环境、内网隔离环境、安全要求极高的金融或政企机房甚至是部署在远洋货轮、深山基站里的服务器。这些机器出于安全、合规或物理限制压根就不允许或者无法连接到互联网上的公共软件仓库。这时候你面对一台崭新的CentOS或者RHEL服务器急需部署一个Nginx做Web服务或者安装一个MySQL来承载业务数据。你习惯性地敲下yum install nginx等待你的却是一个冰冷的 “Could not resolve host” 或者漫长的超时。那一刻的无力感新手可能会慌张但老手都知道解决方案就藏在“离线安装包”里。离线安装包本质上就是软件及其所有依赖项的二进制文件副本。你可以把它想象成在能上网的电脑上把需要的小说、电影、软件安装包全部下载好拷贝到U盘里再带到那台不能上网的电脑上去安装。对于Linux的yum或dnf体系来说这个“下载”的动作就需要专门的工具和方法来完成而不是简单地在浏览器里点个下载按钮。网上教程很多但很多只告诉你怎么做不告诉你为什么更不提醒你里面有多少坑。今天我就结合自己无数次在封闭环境里“挣扎”的经验把yum下载离线安装包这件事从核心原理、工具选型、实操步骤到避坑指南给你彻底讲透。无论你是要搭建一个完整的内网yum源还是仅仅需要紧急安装某个软件的离线包这篇文章都能给你一份可以直接“抄作业”的路线图。2. 核心工具yumdownloader你的离线下载“瑞士军刀”当你需要下载离线安装包时第一个也是最常被提及的工具就是yumdownloader。它不是什么新奇的玩意儿而是yum-utils工具包里的一个组件。所以使用它的第一步往往是安装它自己。2.1 安装与基础命令解析在一台能够连接互联网的、与你目标服务器系统版本尽可能一致的Linux机器上我们称之为“下载机”执行以下命令yum install yum-utils -y安装完成后yumdownloader就可以使用了。它的基础命令格式非常简单yumdownloader [选项] 软件包名1 软件包名2 ...最常用的选项有三个--resolve这是最关键的一个选项。它会让yumdownloader自动解析并下载指定软件包的所有依赖包。没有这个选项你只下载了一个“光杆司令”到离线环境里安装时依然会报缺少依赖的错误。--destdir指定下载的rpm包存放的目录。例如--destdir/tmp/offline_packages。如果不指定默认会下载到当前命令行所在的目录。--urls这个选项不实际下载包而是列出所有需要下载的包的URL。这在你想用其他下载工具如wget批量下载时非常有用。一个完整的下载示例如下假设我们需要为离线环境准备nginx和vim-enhancedmkdir -p /opt/offline_pkgs yumdownloader --resolve --destdir/opt/offline_pkgs nginx vim-enhanced执行后/opt/offline_pkgs目录下就会堆满一堆.rpm文件其中既有nginx和vim-enhanced的主包也有它们依赖的诸如openssl、pcre、gpm、perl等等一大堆包。2.2 工作逻辑与潜在陷阱yumdownloader的工作原理是查询本地配置的yum仓库元数据/etc/yum.repos.d/下的文件找到软件包及其依赖的下载链接然后进行拉取。这里就引出了第一个也是最重要的一个陷阱仓库配置的一致性。你的下载机配置的yum源必须与目标离线服务器尽可能一致。这里的“一致”主要指系统版本和架构最好都是 CentOS 7.9 x86_64。如果你用CentOS 8的下载机去下CentOS 7的包很可能会下载到版本不兼容的依赖。启用的仓库目标服务器如果启用了epelExtra Packages for Enterprise Linux仓库那么你在下载机上也要启用并同步epel。否则yumdownloader --resolve可能无法解析到来自epel的依赖导致下载的离线包集合不完整。我踩过的一个坑是在下载机上下载ansible的离线包当时下载机只配置了基础仓库。到了离线环境安装时提示缺少python2-jmespath这个依赖而这个包恰恰来自epel仓库。解决办法就是在下载机上正确配置并启用epel仓库后重新下载。注意yumdownloader默认只下载当前系统架构如x86_64的包。如果你的环境中有i686的依赖一些老旧软件可能需要需要使用--archlistx86_64,i686来指定多架构。不过纯64位环境现在很少需要这个了。3. 进阶场景使用repotrack获取更完整的依赖链yumdownloader --resolve在大多数情况下够用了但它有一个局限性它主要解决的是“安装时”的依赖。有时候一个软件在“运行时”或“脚本调用时”还需要一些“推荐”Recommends或“建议”Suggests的包这些包yumdownloader默认不会拉取。这时一个更“暴力”、更彻底的工具可以登场repotrack。它同样是yum-utils包里的工具但它的目标是追踪软件包在仓库中的整个依赖树并下载所有相关的包通常比yumdownloader --resolve下载的包更多、更全。它的用法几乎一样repotrack --destdir/opt/offline_pkgs nginxrepotrack会递归地追踪所有依赖直到叶子节点。对于构建一个绝对保险、万无一失的离线安装包集合或者在搭建完整本地镜像的初期素材准备时repotrack是更好的选择。但它的缺点也很明显可能会下载非常多你实际上并不需要的包比如某些依赖包的不同版本、废弃的兼容包等导致离线包目录非常臃肿。如何选择日常需求单个或少数几个软件优先使用yumdownloader --resolve轻量、快捷。搭建完整内网yum源或对依赖完整性有极端要求使用repotrack。不确定时可以先用yumdownloader --resolve下载到离线环境测试安装。如果报缺包再考虑用repotrack重新下载或者手动补下载缺失的包。4. 从下载到安装完整的离线部署工作流下载了一堆rpm包只是第一步如何安全、正确地搬运和安装到离线服务器上才是真正体现经验的地方。4.1 包的管理与搬运下载完成后/opt/offline_pkgs目录里可能杂乱地堆着几十甚至上百个rpm文件。我强烈建议你做一个简单的整理和记录生成清单记录下载了哪些包用于什么目的。ls -l /opt/offline_pkgs/*.rpm /opt/offline_pkgs/packages_list.txt打包传输使用tar命令打包方便通过网络scp或U盘搬运。cd /opt tar -czf offline_pkgs.tar.gz offline_pkgs/然后使用scp或物理介质将offline_pkgs.tar.gz拷贝到目标离线服务器上例如放到/tmp目录。4.2 离线安装的几种方法及其优劣在离线服务器上解压后进入存放rpm包的目录你有以下几种安装方式方法一使用rpm命令手动安装不推荐rpm -ivh *.rpm或按依赖顺序安装如果*通配符顺序不对可能失败rpm -ivh a.rpm b.rpm c.rpm ...为什么不推荐rpm命令不会自动处理复杂的依赖关系。即使你把所有包都放在一起如果安装顺序不对比如依赖包在主包之后安装就会失败。你需要自己理清依赖树非常麻烦且容易出错。方法二使用yum localinstall或dnf localinstall推荐这是最接近在线安装体验的方式。yum localinstall ./*.rpm或者在新版系统如RHEL8/CentOS8上dnf localinstall ./*.rpm优点yum/dnf会读取当前目录下的所有rpm文件在本地建立一个临时的仓库元数据然后像在线安装一样自动解析和解决依赖关系并按照正确的顺序安装。这是最省心、最可靠的方法。注意即使使用localinstall也需要确保当前目录包含了所有依赖包。如果漏了它依然会失败。方法三配置本地yum源适用于大量或频繁安装如果你需要经常在这台离线服务器上安装软件或者包的数量非常庞大那么配置一个本地文件源是更一劳永逸的办法。在离线服务器上创建一个目录作为仓库根例如/data/local_repo并将所有rpm包拷贝进去。安装createrepo工具这个工具本身也需要离线安装你可以提前用yumdownloader下载好它的包。生成仓库元数据createrepo /data/local_repo创建一个本地repo文件例如/etc/yum.repos.d/local.repo内容如下[local] nameLocal Repository baseurlfile:///data/local_repo enabled1 gpgcheck0gpgcheck0表示不进行GPG密钥检查因为本地包通常没有签名。如果包有签名且你导入了密钥可以设为1。清除yum缓存并测试yum clean all yum makecache yum install nginx # 现在就可以像在线一样安装了方法对比总结表安装方法命令示例优点缺点适用场景rpm手动安装rpm -ivh *.rpm最底层无需额外工具不处理依赖极易失败仅安装极少数无依赖或依赖明确的包yum localinstallyum localinstall ./*.rpm自动解决依赖简单快捷需要一次性备齐所有包绝大多数离线安装场景的首选配置本地源createrepo 配置repo文件一次配置永久使用管理方便前期步骤稍多需要长期、频繁在离线环境安装不同软件5. 实战避坑指南那些教程里不会告诉你的细节掌握了基本流程只能算及格。真正能让你高效工作的是下面这些从无数次失败中总结出来的经验。5.1 环境一致性版本与架构的“隐形杀手”这是离线部署失败的最高频原因。我遇到过最典型的情况是开发团队在CentOS 7.6上编译和测试的软件拿给运维在CentOS 7.9的离线环境部署结果因为glibc等基础库的细微版本差异导致程序无法运行。解决方案建立标准下载机专门准备一台虚拟机或物理机安装与生产环境完全一致的系统包括小版本号如CentOS 7.9.2009并冻结其yum源更新例如使用yum versionlock锁定关键包版本。所有离线包都从这台机器下载。使用Docker构建一致环境如果条件允许可以在下载机上使用Docker运行一个与目标系统完全相同的容器在容器内执行下载操作确保环境绝对纯净。核对关键依赖版本对于像glibc,openssl,libstdc这类核心系统库下载后可以粗略检查一下版本是否匹配。5.2 依赖地狱如何处理“找不到包”的错误即使在下载机用了--resolve到了离线服务器用yum localinstall仍可能报错“Error: Nothing to do” 或 “No package xxx available”。这通常是因为依赖包名不完全匹配yum的依赖关系可以是“包名”也可以是“能力Provides”比如libssl.so.10()(64bit)。下载机上的某个包如openssl-libs-1.0.2k-19.el7.x86_64.rpm提供了这个能力但离线服务器上需要的可能是另一个版本提供的相同能力。如果版本不兼容就会失败。隐性的“Recommends”依赖如前所述有些非强依赖的包没被下载。排查与解决步骤在离线服务器上使用rpm命令手动尝试安装主包rpm -ivh --test nginx-1.20.1-9.el7.x86_64.rpm加上--test参数是模拟安装它会列出所有缺失的依赖。仔细看错误信息它会明确告诉你缺少libxxx.so.xx()这样的库名或者perl(:MODULE_COMPAT_5.16.3)这样的Perl模块。根据缺失的依赖名返回下载机搜索yum whatprovides libssl.so.10()(64bit)这个命令会告诉你哪个rpm包提供了这个能力。记下包名再用yumdownloader下载它。循环往复将新下载的依赖包拷贝到离线服务器再次尝试yum localinstall或rpm -ivh --test直到所有依赖满足。这个过程很繁琐但却是离线运维的必修课。有时候一个软件的离线安装包需要这样来回折腾好几轮才能备齐。5.3 空间与清理别让临时文件撑爆你的磁盘无论是下载机还是离线服务器在处理大量rpm包时都要注意磁盘空间。下载机yumdownloader会用到/var/cache/yum目录下的缓存。定期用yum clean all清理可以释放空间。但如果你需要重复下载相同的包清空缓存又会重新下载影响效率。一个折中的办法是只清理旧的缓存包yum clean packages。离线服务器使用yum localinstall安装后这些rpm包文件本身就没有用了除非你想留着以后重用或分发给其他机器。可以将其删除或归档到其他存储位置。安装过程本身也会在/var/cache/yum下留下缓存同样可以清理。5.4 签名验证GPG Check问题如果你下载的rpm包来自官方源且带有GPG签名而在离线服务器上配置本地源时启用了gpgcheck1那么你需要将对应的GPG密钥也导入到离线服务器。在下载机上找到密钥文件通常位于/etc/pki/rpm-gpg/目录下如RPM-GPG-KEY-CentOS-7。将该密钥文件拷贝到离线服务器的相同目录。在离线服务器上导入密钥rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7在本地源的.repo文件中通过gpgkeyfile:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7指定密钥路径。对于一次性localinstall通常可以直接在命令中跳过检查yum localinstall --nogpgcheck ./*.rpm。但在对安全有要求的环境建议配置完整的签名验证流程。6. 超越基础构建企业级离线yum仓库对于有成百上千台离线服务器的企业环境为每台机器逐个拷贝rpm包是低效的。标准的做法是搭建一个内部镜像仓库。这个过程的本质就是在一台可以周期性连接外网的“跳板机”上使用reposync工具同样来自yum-utils完整地同步整个远程仓库如CentOS-Base, EPEL到本地然后用createrepo创建元数据最后通过HTTP、FTP或NFS共享给内网所有机器。简化步骤示例在跳板机安装工具并创建存储目录yum install yum-utils createrepo -y mkdir -p /data/mirrors/centos/7/os/x86_64 mkdir -p /data/mirrors/epel/7/x86_64同步Base仓库以CentOS 7为例reposync -n --gpgcheck -l --repoidbase --download_path/data/mirrors/centos/7/os/x86_64-n表示只下载最新的包-l支持yum插件。同步EPEL仓库reposync -n --gpgcheck -l --repoidepel --download_path/data/mirrors/epel/7/x86_64为每个同步的目录创建仓库数据createrepo /data/mirrors/centos/7/os/x86_64 createrepo /data/mirrors/epel/7/x86_64配置Web服务器如Nginx将/data/mirrors目录发布出去。在内网所有服务器上将yum源地址指向这个内部Web服务器。这样内网的所有服务器就拥有了一个和公网几乎一样但更新有延迟的软件仓库彻底告别离线安装的烦恼。后续只需要定期在跳板机上执行reposync和createrepo即可更新内部仓库。从下载单个离线包到搭建完整的内部镜像其核心思想都是一致的在可联网的环境预取资源在封闭环境进行部署。理解了yumdownloader、repotrack和yum localinstall这个铁三角你就掌握了处理绝大多数Linux离线安装场景的钥匙。剩下的就是在具体实践中根据网络条件、系统环境和软件需求灵活组合运用这些工具和方法了。记住离线运维的核心是准备充分和环境一致多花时间在准备工作上就能在真正部署时避免手忙脚乱。
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门