尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

CentOS离线安装yum全指南:从rpm包到本地仓库配置

发布时间:2026/9/30 1:22:06

资讯中心
01
ARTICLE

CentOS离线安装yum全指南:从rpm包到本地仓库配置

CentOS离线安装yum全指南:从rpm包到本地仓库配置
看到这个标题你第一反应多半是CentOS 不是自带 yum 吗怎么还要安装教程说实话我一开始也这么想直到有次帮朋友处理一台被裁剪过的 CentOS 7 服务器连yum命令都不存在我才意识到“安装 yum”这件事确实不是伪需求。那台机器没外网、没有本地源任何软件都得手工解依赖折腾一次之后我把整套流程彻底规范化了。今天这篇就从头到尾讲清楚什么情况下需要给 CentOS 装 yum、离线环境下 rpm 包怎么凑齐、在线源和本地源怎么配置以及日常使用中最容易翻车的几个地方。新手照着操作能解决问题老手也可以把后半部分当一份排查清单来用。1. 为什么系统明明自带 yum还有人到处找安装教程1.1 最常见的场景拿到的 CentOS 是被裁过的如果你是在正规官网或大厂镜像站下载的 CentOS 7 / 8 镜像装完之后默认确实有 yum。但现实世界里的服务器来源很杂比如云厂商的“精简镜像”、容器里用的“裁剪版 CentOS”、某些集群管理系统分发的“最小化系统”都可能为了压缩体积把/usr/bin/yum以及配套的 Python 包删掉。这时你在终端敲yum install会直接看到bash: yum: command not found。别慌这不代表系统坏了只说明包管理工具没了。还有一个容易被忽略的点有些从 RHEL 或其它 RHEL 系发行版迁移过来的机器仓库配置文件被改过但 yum 本体还在。很多人分不清“安装 yum”和“配置 yum 源”搜索“CentOS 安装 yum”后其实真正要做的是把源恢复能用的状态。另外容器镜像领域也常遇到这种情况。一些公开的 CentOS 镜像体积做得特别小移除了包括 yum 在内的非必要组件你用docker exec进去后发现什么包管理工具都没有。要在这类容器里装软件第一步就是装回 yum然后再配源。1.2 CentOS 不同版本的包管理工具有差异CentOS 6 和 CentOS 7 默认使用 yum底层依赖 Python 2。CentOS 8 开始默认包管理工具变成了 dnf但系统里保留了yum这个兼容命令实际执行时调用的是 dnf。CentOS Stream 8 / 9 同样如此。面对不同版本很多老教程会让人困惑。你在 CentOS 8 上运行yum install xxx看着很熟悉其实背后是 dnf 在工作。如果你去下载单独的 yum rpm 包安装到 CentOS 8 上反而可能和系统的 dnf 冲突。所以先搞清楚手头版本比急着敲命令更重要。系统版本包管理命令对应工具仓库目录CentOS 6.xyumyum 3.2.x/etc/yum.repos.d/CentOS 7.xyumyum 3.4.x/etc/yum.repos.d/CentOS 8.xyum实际是 dnf 4.xdnf/etc/yum.repos.d/CentOS Stream 8/9yum兼容链接dnf/etc/yum.repos.d/1.3 什么样的情况才需要手动“安装 yum”不是所有找不到 yum 的环境都适合手动安装。真实需要操作的场景主要有三类基础系统被裁剪掉 yum但 rpm 命令仍然可用。系统里的 yum 相关文件损坏比如 Python 版本被人为替换、/var/lib/rpm数据库损坏。离线环境需要重建一套可用的 yum 本地源系统。如果只是某个仓库源访问不了问题通常在源配置和“安装 yum”这个动作没关系直接跳到第 3 节处理就行。2. 离线安装 yumrpm 包依赖顺序与完整安装步骤2.1 先确认系统版本和架构这是安装的前提离线安装 yum 最怕的就是版本不对。yum 依赖 Python 环境CentOS 7 用的是 Python 2.7CentOS 8 已经切换到 Python 3。如果你把 CentOS 7 的 yum 包强行装到 CentOS 8 上大概率会报依赖缺失最后不得不--nodeps硬装之后运行又各种报错非常难受。执行下面两条命令确认当前环境cat /etc/redhat-release uname -m以我处理过的 CentOS 7.9 x86_64 环境为例输出大概是CentOS Linux release 7.9.2009 (Core) x86_64拿到结果后后续所有 rpm 包都必须匹配这个主版本和架构。x86_64 的机器不要去找 i686 的包aarch64 的机器更不能用 x86_64 的包。2.2 从哪弄到可用的 rpm 安装包离线环境下rpm 包来源一般有四条路从一台可以联网、系统版本和架构一样的 CentOS 机器上下载从 CentOS 官方 vault 镜像库直接下载从系统安装 ISO 里的 Packages 目录提取从公司内网已有的 yum 仓库服务器上拉取。我想重点说第一种方式因为最常用也最可控。在联网机器上执行yum install -y yum-utils yumdownloader --destdir/root/yum-rpm --resolve yum yum-plugin-fastestmirror yum-metadata-parser python-urlgrabber yum-utils--resolve参数会把直接依赖一起下载这样到离线机器上基本上能一次装完。如果找不到联网机器也可以直接访问 vault 镜像目录进入对应版本的 os/x86_64/Packages 目录手动下载以下几个关键包python-urlgrabberyum-metadata-parseryumyum-plugin-fastestmirroryum-utils具体文件名带着版本号不同小版本会有差异下载时注意看清楚是 el7 还是 el8。以 CentOS 7.9 为例你会在 Packages 目录里看到类似yum-3.4.3-168.el7.centos.noarch.rpm的文件。如果是纯离线机器用安装 ISO 最稳妥。把 CentOS 7 安装镜像上传到服务器挂载后从/mnt/cdrom/Packages/里找对应文件mkdir -p /mnt/cdrom mount -o loop CentOS-7-x86_64-DVD-2009.iso /mnt/cdrom ls /mnt/cdrom/Packages/ | grep -E ^(yum|python-urlgrabber|yum-metadata-parser)ISO 自带的包版本可能不是最新但作为基础 yum 已经足够胜在来源可信。2.3 按依赖顺序安装别一上来就 --nodeps把 rpm 包传到离线机器上之后建议按照下面的顺序安装cd /root/yum-rpm rpm -ivh python-urlgrabber-*.rpm rpm -ivh yum-metadata-parser-*.rpm rpm -ivh yum-*.rpm rpm -ivh yum-plugin-fastestmirror-*.rpm yum-utils-*.rpm为什么是这个顺序因为 yum 本体依赖python-urlgrabber提供下载能力依赖yum-metadata-parser解析仓库元数据。如果先装 yum 再装依赖rpm 会报requires python-urlgrabber is needed之类的错误那时你还是得回头补装。大多数依赖系统本身已经有比如 Python、rpm、glibc 这些都是基础组件。真正容易缺的就是上面列的这几个。如果系统提示缺别的依赖优先去 ISO 的 Packages 目录里找同名包不要一看到错误就把--nodeps --force加进去。rpm 的依赖检查是一种保护暴力跳过之后yum 可能能启动但运行过程中报错时你会更难判断原因。2.4 安装后的验证方式安装完的第一件事不是急着配源而是先确认 yum 命令是否正常which yum yum --version rpm -qa | grep ^yum如果yum --version能看到版本号说明本体没有问题。此时运行yum repolist通常还是会报错提示找不到启用的仓库这是正常现象不代表 yum 坏了只是还没有配源。如果你发现 rpm 数据库之前就有问题建议先执行rpm --rebuilddb修复数据库再安装 yum否则 yum 安装了以后可能无法正确识别已安装 rpm。3. 配置可用的 yum 源基础源、EPEL、镜像站与缓存刷新3.1 先把旧源备份并清掉避免残留配置干扰很多离线环境或迁移过来的系统/etc/yum.repos.d/里会有一堆乱七八糟的 repo 文件有的指向内网旧地址有的已经失效。最好先把整个目录备份然后清理掉从干净状态开始cp -a /etc/yum.repos.d /etc/yum.repos.d.bak.$(date %Y%m%d) mkdir -p /etc/yum.repos.d rm -f /etc/yum.repos.d/*.repo这样做的目的是避免后面 makecache 时被一个坏 repo 拖慢整体速度。yum 在刷新缓存时任何一个启用的源出错都会报 error虽然不一定中断全部流程但排错成本会显著上升。3.2 用国内镜像源配置 CentOS 7 / 8 基础源对于 CentOS 7阿里云和清华源都有现成的 repo 文件可以直接下载。以阿里云为例curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo下载完成后有一个必须在离线或非标准环境中注意的细节手工安装 yum 时很多系统的$releasever变量无法正常解析导致 repo 里的下载路径变成.../centos/7.9.2009/...或直接解析失败。最稳妥的办法是把$releasever替换成主版本号sed -i s/$releasever/7/g /etc/yum.repos.d/CentOS-Base.repoCentOS 8 的处理类似但官方仓库已经迁移到 vault 路径国内镜像也提供了对应目录。如果你在用 CentOS 8.5 这类版本直接使用阿里云的Centos-8.repo文件即可其中已经包含了 BaseOS、AppStream、Extras 这几个关键仓库。3.3 EPEL 扩展仓库的安装与启用EPEL 是 RHEL 系最常用的扩展源里面有不少基础源没有的软件包。配好基础源后直接执行yum install -y epel-release yum makecache如果基础源还没完全配好也可以从 EPEL 官方镜像手动下载epel-release-latest-7.noarch.rpm安装。EPEL 装上以后原来需要单独找包的很多软件都能一条命令装好比如htop、iftop、jq这些常用小工具。3.4 清缓存、生成缓存、更新软件包的正确节奏每次切换源之后不要直接去yum install先清理旧缓存并重新生成yum clean all yum makecache fast yum repolistmakecache fast只下载各仓库的元数据不会真的安装软件。我习惯在配置完源以后先跑一遍确认所有仓库都能正常访问再执行安装动作。否则安装时才发现源有问题报错混杂在一起新手往往会误以为是软件包本身的问题。日常使用中另一个高频需求是升级时排除特定软件包。比如生产机器升级系统库你不想动内核可以这样yum update -y --excludekernel*,glibc*,systemd*不过太多--exclude会让人记不住哪些包被锁了更规范的做法是用 versionlock 插件yum install -y yum-plugin-versionlock yum versionlock add java-1.8.0-openjdk yum versionlock list3.5 安装 fontconfig / mkfontscale 报元数据错误怎么定位我搜索资料时看到有人执行yum install -y fontconfig mkfontscale结果报了一串errors during downloading metadata for repo ...。第一次接触这个报错的人容易以为 fontconfig 这个包有问题其实完全不是。看报错关键字errors during downloading metadata说明问题出在仓库元数据的获取上。可能是某个 repo 的 baseurl 失效、域名解析不了、缓存损坏和你要安装的包名没关系。处理步骤是yum clean all yum --disablerepo* --enablerepobase makecache yum install -y fontconfig mkfontscale先用--disablerepo*把所有源禁用再单独启用 base 源这样能快速确认是不是某个第三方源导致的错误。4. 给内网机器搭一个本地 yum 仓库createrepo 与 HTTP 发布完整流程4.1 什么时候需要本地仓库不只是为了省流量本地 yum 仓库最常见的价值是让一批离线机器拥有稳定、可控的软件来源。比如机房内部无法访问外网的机器有 20 台每台都需要装 Docker 或者 Java 环境。如果每台机器都手动 rpm 安装依赖关系会让你疯掉。更麻烦的是不同机器之间版本还可能不一致。内网放一台 yum 仓库服务器所有机器统一指向它软件版本、补丁版本都能保持一致。另一个容易被忽视的场景是版本管理。外网源里的软件会持续更新今天装的和下个月装的可能是不同版本。一旦生产环境出问题需要复现本地仓库就能提供固定版本的软件包。所以即使你的机器能上外网我也建议在关键环境里保留一个本地镜像源。4.2 准备 rpm 目录或者挂载 ISO仓库的物理内容说白了就是一个装满 rpm 文件的目录。最简单的初始化方式是把 CentOS 安装 ISO 挂载上来mkdir -p /data/yum-repo/base mount -o loop CentOS-7-x86_64-DVD-2009.iso /mnt/cdrom cp /mnt/cdrom/Packages/*.rpm /data/yum-repo/base/也可以从联网机器上用 yumdownloader 把需要的软件包连同依赖下载下来再传到仓库目录。需要注意ISO 里自带的包数量有限很多常用软件还得靠 EPEL 和 docker-ce 这样的第三方仓库来补充。4.3 用 createrepo 生成仓库元数据rpm 文件只是散装货yum 要能识别这个目录必须在目录顶层生成 repodata 元数据这个动作由createrepo完成。如果你的机器能联网直接安装yum install -y createrepo如果完全离线也可以从 ISO 的 Packages 目录里找createrepo-*.rpm及其依赖来安装。生成元数据的命令很简单cd /data/yum-repo createrepo .以后往目录里新增了 rpm 包不需要全量重新生成使用createrepo --update /data/yum-repo即可增量更新速度会快很多。4.4 通过 HTTP 发布仓库并放行防火墙端口仓库目录在本地只能自己用要让别的机器访问最简单的办法是装一个 httpd 或 nginx。以 httpd 为例yum install -y httpd systemctl enable --now httpd然后把仓库目录软链接到 web 根目录ln -s /data/yum-repo /var/www/html/repo客户端通过http://服务器IP/repo/就能访问。如果服务器启用了 firewalld需要放行 HTTP 服务或对应端口firewall-cmd --zonepublic --add-servicehttp --permanent firewall-cmd --reload如果你用的是自定义端口比如 8080则要使用端口规则。firewalld 的持久化配置会写入/etc/firewalld/zones/public.xml这个文件可以直接编辑但编辑完一定要 reload 才能生效。4.5 客户端配置本地仓库文件在内网机器上创建一个新的 repo 文件比如/etc/yum.repos.d/local.repo[local] nameLocal Yum Repository baseurlhttp://192.168.10.20/repo/ enabled1 gpgcheck0然后执行yum clean all yum makecache yum repolist如果能看到 local 仓库说明局域网仓库已经通了。gpgcheck0只建议在可信内网使用。如果仓库要跨不可信网络或对安全性要求高应该在仓库里放入 GPG 公钥并把 gpgcheck 设为 1。4.6 实战参考离线安装 Docker 的本地仓库方案这个话题很多人问我也实测过。在联网机器上先配置好 Docker 官方仓库yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo然后下载 Docker 相关 rpm 包yumdownloader --resolve --destdir/data/yum-repo/docker-ce docker-ce docker-ce-cli containerd.io docker-compose-plugin把整个 docker-ce 目录放到内网仓库服务器上执行createrepo --update /data/yum-repo内网机器就能直接执行yum install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin。整个过程不需要外网也不需要每台机器单独传包。5. yum 批量下载 rpm 包解决离线装软件的死循环5.1 yumdownloader 是离线环境最顺手的一个工具离线装软件最大的痛苦是依赖链太长手动一个个找 rpm 包会让人崩溃。yumdownloader 的作用就是在一台联网且版本匹配的机器上提前把所有依赖包下载下来然后整体搬到离线机器上安装。使用之前先安装工具本身yum install -y yum-utils下载格式yumdownloader --resolve --destdir/root/java-rpms java-1.8.0-openjdk java-1.8.0-openjdk-devel--resolve会下载指定包的直接依赖。--destdir指定保存目录。下载完成后/root/java-rpms里面会有几十个 rpm 文件这就是你要的完整安装包集合。5.2 离线机器上如何正确安装这堆 rpm把整个目录拷到离线机器后直接用通配符安装cd /root/java-rpms rpm -Uvh *.rpmrpm 会自动识别当前目录下所有包依赖关系在下载时已经满足了通常能一次成功。如果遇到个别包已经存在或版本冲突可以用--replacepkgs --replacefiles重新安装。但正常情况下不要加--nodeps否则就失去了批量下载的意义。除了 yumdownloader还有一个办法是安装 downloadonly 插件yum install -y yum-plugin-downloadonly yum update --downloadonly --downloaddir/root/update这种方式适合给多台机器统一打补丁。执行后所有待更新的 rpm 会落在指定目录拿到其它机器上再统一rpm -Uvh *.rpm即可。5.3 实际使用要点版本、架构、仓库一致性这条经验排第一在哪个版本的系统上下载就拿去哪个版本的系统上安装。CentOS 7 上拉取的一堆包拿到 CentOS 8 上大概率装不了因为依赖的 glibc、openssl 等基础库版本差异太大。还有一个小技巧下载时加一个--archlistx86_64强制只拉指定架构的包避免系统把 noarch 和 i686 的包混进来yumdownloader --resolve --archlistx86_64 --destdir/root/tools xdotool用这个方式像 xdotool、jq、htop 这种小工具都能在离线环境轻松安装不用为单个依赖满天飞。6. yum 日常使用中最容易翻车的地方与排查清单6.1 高频报错与处理方向速查表报错信息常见原因处理方向Could not resolve host域名无法解析检查 DNS 配置、网络连通性[Errno 14] HTTP Error 404repo 路径失效检查 repo 文件和 $releasever 变量Errors during downloading metadata for repo某个仓库元数据无法获取单源启用定位清缓存重新 makecacheAnother app is currently holding the yum lockyum 进程被占用等待或确认无进程后删除 yum.pidRpmdb checksum is invalidrpm 数据库损坏执行 rpm --rebuilddbrequires xxx is needed by yum安装包缺依赖从 ISO 或镜像库补齐依赖包后再装这里面最典型的就是元数据下载报错。它很少是 yum 本身的问题大多数情况是某个第三方 repo 失效。你完全可以把所有 repo 先禁用掉只用基础源试一次这样能快速锁定问题范围。6.2 从“yum 装不了”到“网络不通”的完整排查链有次我在处理一台远程服务器时yum 报错Failed to connect to mirror site。我没有急着换源先按下面的顺序走了一遍ip addr ip route ping 网关IP cat /etc/resolv.conf ping 镜像域名最后发现是网关设置错误。机器能 ping 通局域网内其它 IP但出不了外网yum 自然连不上镜像站。排查网络问题时不要一上来就怀疑 yum先确认网卡、路由、DNS 这三层通不通。尤其是内网机器改过 IP 后没同步修改网关配置这种情况特别多。CentOS 7 以上版本的网络配置文件通常在/etc/sysconfig/network-scripts/下文件名可能叫ifcfg-eth0也可能叫ifcfg-ens192。修改 IP 后记得重启网络服务。远程操作用户此时要小心重启网络可能导致 SSH 断开最好有带外管理通道时再操作。6.3 只让坏源“背锅”别让好源一起受影响yum 的多源机制确实方便但一个坏源会把整个流程拖慢。当装包时长时间卡住或报错我常用下面的方式定位yum install -y --disablerepo* --enablerepobase,epel nginx这种方式只启用必要源其它源全部禁用既快又干净。如果你希望某些源即使失效也不影响整体执行可以修改 repo 文件[epel] nameExtra Packages for Enterprise Linux baseurlhttp://mirror.example.com/epel/$releasever/x86_64/ enabled1 gpgcheck1 skip_if_unavailableTrue设置完以后坏源只会警告而不会报错中断。6.4 版本锁定比依赖 --exclude 更可靠很多人习惯在升级时写一长串--excludekernel*,glibc*,systemd*这个办法临时用可以长期维护很难受。我建议在关键服务器上用 versionlock 插件做精细控制yum install -y yum-plugin-versionlock yum versionlock add docker-ce yum versionlock list这样即使有人直接执行yum update被锁定的软件包也不会被更新。需要解锁时执行yum versionlock delete docker-ce。比每次升级都回忆“上次到底排除过什么包”要可靠得多。6.5 本地仓库客户端连不上时先查服务器和防火墙局域网内配置本地仓库后如果客户端报错连不上按下面的顺序排查在客户端用curl -I http://仓库服务器IP/repo/测试能不能访问在仓库服务器上确认 httpd 或 nginx 是否在监听用firewall-cmd --list-all看服务端口是否放行检查/etc/firewalld/zones/public.xml里的持久化配置。有一次我配好仓库后客户端死活连不上折腾了半天发现是仓库服务器的 httpd 根本没启动。防呆做法是配完以后先在服务器本机curl一遍再让客户端访问先排除本机问题再去查网络。安装 yum 这件事说到底并不是多高深的技术真正考验人的是对系统状态和网络链路的判断。经过几次离线环境救火之后我才深刻体会到rpm 包的版本和架构一致性比命令本身重要得多源配置的干净程度比镜像地址的快慢重要得多。现在我每处理完一次离线环境都会把用到的 rpm 包和 repo 配置文件单独备份到一个固定目录下次再遇到类似情况直接复制使用能省下大量重新踩坑的时间。
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

◈

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

◐

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

▲

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。