☰
CentOS离线安装yum全指南:从rpm包到本地仓库配置
2026/9/30 1:22:03 网站建设 项目流程

看到这个标题,你第一反应多半是: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.x)dnf/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. 离线安装 yum:rpm 包依赖顺序与完整安装步骤

2.1 先确认系统版本和架构,这是安装的前提

离线安装 yum 最怕的就是版本不对。yum 依赖 Python 环境,CentOS 7 用的是 Python 2.7,CentOS 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-urlgrabber
  • yum-metadata-parser
  • yum
  • yum-plugin-fastestmirror
  • yum-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.repo

CentOS 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 repolist

makecache fast只下载各仓库的元数据,不会真的安装软件。我习惯在配置完源以后先跑一遍,确认所有仓库都能正常访问,再执行安装动作。否则安装时才发现源有问题,报错混杂在一起,新手往往会误以为是软件包本身的问题。

日常使用中另一个高频需求是升级时排除特定软件包。比如生产机器升级系统库,你不想动内核,可以这样:

yum update -y --exclude=kernel*,glibc*,systemd*

不过太多--exclude会让人记不住哪些包被锁了,更规范的做法是用 versionlock 插件:

yum install -y yum-plugin-versionlock yum versionlock add java-1.8.0-openjdk yum versionlock list

3.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=* --enablerepo=base 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 --zone=public --add-service=http --permanent firewall-cmd --reload

如果你用的是自定义端口,比如 8080,则要使用端口规则。firewalld 的持久化配置会写入/etc/firewalld/zones/public.xml,这个文件可以直接编辑,但编辑完一定要 reload 才能生效。

4.5 客户端配置本地仓库文件

在内网机器上创建一个新的 repo 文件,比如/etc/yum.repos.d/local.repo:

[local] name=Local Yum Repository baseurl=http://192.168.10.20/repo/ enabled=1 gpgcheck=0

然后执行:

yum clean all yum makecache yum repolist

如果能看到 local 仓库,说明局域网仓库已经通了。gpgcheck=0只建议在可信内网使用。如果仓库要跨不可信网络或对安全性要求高,应该在仓库里放入 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 *.rpm

rpm 会自动识别当前目录下所有包,依赖关系在下载时已经满足了,通常能一次成功。如果遇到个别包已经存在或版本冲突,可以用--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 等基础库版本差异太大。

还有一个小技巧:下载时加一个--archlist=x86_64,强制只拉指定架构的包,避免系统把 noarch 和 i686 的包混进来:

yumdownloader --resolve --archlist=x86_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某个仓库元数据无法获取单源启用定位,清缓存重新 makecache
Another app is currently holding the yum lockyum 进程被占用等待或确认无进程后删除 yum.pid
Rpmdb checksum is invalidrpm 数据库损坏执行 rpm --rebuilddb
requires 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=* --enablerepo=base,epel nginx

这种方式只启用必要源,其它源全部禁用,既快又干净。如果你希望某些源即使失效也不影响整体执行,可以修改 repo 文件:

[epel] name=Extra Packages for Enterprise Linux baseurl=http://mirror.example.com/epel/$releasever/x86_64/ enabled=1 gpgcheck=1 skip_if_unavailable=True

设置完以后,坏源只会警告而不会报错中断。

6.4 版本锁定比依赖 --exclude 更可靠

很多人习惯在升级时写一长串--exclude=kernel*,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 本地仓库客户端连不上时,先查服务器和防火墙

局域网内配置本地仓库后,如果客户端报错连不上,按下面的顺序排查:

  1. 在客户端用curl -I http://仓库服务器IP/repo/测试能不能访问;
  2. 在仓库服务器上确认 httpd 或 nginx 是否在监听;
  3. 用firewall-cmd --list-all看服务端口是否放行;
  4. 检查/etc/firewalld/zones/public.xml里的持久化配置。

有一次我配好仓库后客户端死活连不上,折腾了半天发现是仓库服务器的 httpd 根本没启动。防呆做法是配完以后先在服务器本机curl一遍,再让客户端访问,先排除本机问题再去查网络。

安装 yum 这件事,说到底并不是多高深的技术,真正考验人的是对系统状态和网络链路的判断。经过几次离线环境救火之后,我才深刻体会到:rpm 包的版本和架构一致性比命令本身重要得多,源配置的干净程度比镜像地址的快慢重要得多。现在我每处理完一次离线环境,都会把用到的 rpm 包和 repo 配置文件单独备份到一个固定目录,下次再遇到类似情况直接复制使用,能省下大量重新踩坑的时间。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询