ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

CentOS下安装yum全攻略:在线装、离线装、本地源搭建与报错恢复

CentOS下安装yum全攻略:在线装、离线装、本地源搭建与报错恢复 先说个可能反常识的事CentOS 这系统正常情况下 yum 是自带的根本不用你费劲去装。但你要是搜过“Centos 下安装 yum”这个词那大概率是遇到了下面某一种情况最小化安装后 yum 神秘失踪、手贱把 python 升级结果 yum 罢工、或者系统里 rpm 依赖关系一团乱麻yum 命令直接报-bash: yum: command not found。还有一些场景是离线内网环境不能连外网需要手工下载 rpm 包来搭 yum。这篇文章我就把“装 yum”这件事彻底讲透覆盖从“为什么 yum 会丢”到“在线装、离线装、本地源搭建、换国内源、常见报错修复”的完整链路。适合 CentOS 6/7/8/9 各版本的用户也适合遇到 yum 被搞残想抢救一下的运维新人。我会把命令和背后的逻辑一起讲保证你跟着做完不只是能跑通还能理解每一步到底在干什么。1. 先搞清楚 yum 的真面目它其实只是个 python 脚本很多人把 yum 当成系统自带的黑盒工具坏了就不知道从哪下手。实际上 yum 的本质并不神秘它是一组用 Python 写的包管理脚本通过调用 rpm 去解析和安装软件包然后从配置好的“软件源”也就是 repo里拉取元数据和 rpm 包自动帮你解决依赖关系。也正是因为 yum 是 Python 写的它和你系统里的 Python 环境关系极其密切。CentOS 6 的 yum 依赖 Python 2.6CentOS 7 的 yum 依赖 Python 2.7CentOS 8 开始才转向 DNF新一代 yum底层也是 Python 3。所以很多“yum 突然坏了”的案例根子根本不在 yum 本身而是有人把系统自带的 Python 给换掉或者升级了导致 yum 找不到对应的解释器。这一点我建议你刻在脑子里后面排错会省很多事。1.1 什么情况下你才需要“手动安装 yum”这不是制造焦虑我按实际遇到的可能性从高到低排个序最小化安装 CentOS 后发现yum命令不存在。这种情况多见于精简版镜像、容器镜像或者自己裁剪过的系统。升级或误删了系统自带的 python导致 yum 无法启动此时会报There was a problem importing one of the Python modules之类错误。用rpm -e强行删除了 yum 相关包清理依赖时连 repo 配置一起删了。在内网离线环境工作新装的机器上什么都没有需要手动把 yum 的 rpm 包拷进去装。RPM 数据库损坏yum 运行异常需要重装 yum 来恢复。如果你只是 yum 的源列表坏了比如yum repolist空或者安装时报 404那根本不用重装 yum只要重新配源就行。这部分我在第 4 章会重点讲。1.2 yum、rpm、源三者的关系yum 是“包管理门面”但它底层不是直接操作文件的它把所有脏活累活都交给 rpm 来完成。rpm 负责装包、卸包、查询包yum 负责从远程仓库拉取元数据repodata 目录下的文件分析依赖树决定“我应该先装 A再装 B最后装 C”然后逐个调用 rpm 安装。源就是软件包和元数据存放的位置可以是互联网上的镜像站也可以是你本机挂载的光盘或 ISO 文件。理解了这个三角关系你就明白为什么“装 yum”这件事不是简单地丢一个绿色软件进去运行。你需要确保yum 的 rpm 包本身装好了它依赖的 python 库比如 urlgrabber、libxml2 等是齐的有可用的源配置.repo 文件和源地址里的元数据。2. 动手前必做的事确认系统身份和剩余武器别上来就复制网上的命令先花两分钟查看系统情况。不同 CentOS 版本对应的 yum 版本和依赖不一样用错了版本轻则装不上重则把系统搞得更乱。2.1 看清系统版本和架构登录服务器后依次执行下面几条命令cat /etc/redhat-release uname -m rpm -qa | grep -E ^yum|^rpm第一行告诉你系统是大版本第二行告诉你 CPU 架构第三行看当前还残留哪些 yum/rpm 相关包。输出示例CentOS Linux release 7.9.2009 (Core) x86_64 yum-3.4.3-168.el7.centos.noarch yum-plugin-fastestmirror-1.1.31-53.el7.noarch yum-metadata-parser-1.1.4-10.el7.x86_64这里有两条信息很关键noarch表示 yum 本身是纯脚本包不区分架构但yum-metadata-parser是 C 扩展模块区分 x86_64 和 i386。下载时要注意和uname -m的结果一致。2.2 确认还剩哪些“武器”可以用在 yum 缺失的环境里你反而要珍惜还能用的工具rpm 是否可用rpm --version。只要 rpm 还在你就能手动装包。有没有网络连通性curl -I http://mirrors.aliyun.com或者ping -c 3 mirrors.aliyun.com。注意有些内网禁 ping 但允许 HTTP 访问所以用 curl 更准确。有没有 wget / curlwhich wget curl。如果都没有你只能先在本地电脑下载好 rpm 包再传到服务器。Python 版本python -V。CentOS 7 应该是 Python 2.7.5如果变成 3.x那 yum 大概率已经“死”了。我建议你把这几项结果记录下来后面每一步都能用得上。有个小技巧如果 rpm 还在但 yum 没了你可以用rpm -qa | wc -l看看系统装的包总数。如果总数正常说明只是 yum 层被删了如果总数也很少那这个系统可能是裁剪版或容器底后续补依赖的工作量会大很多。3. 完整实操两条路把 yum 装回去这一章是核心分“在线安装”和“离线安装”两条路线。在线安装适合还能连外网的机器离线安装适合内网、隔离网段或特殊要求的场景。3.1 在线安装从镜像站直接拉 rpm 包先说一个误区很多人会直接敲yum install -y yum。问题是现在 yum 都没了系统根本执行不了这命令。正确做法是先用 rpm 方式把 yum 包装回去然后再用 yum 自己修复其他缺失的依赖。以 CentOS 7.9 x86_64 为例完整命令序列如下cd /tmp curl -O http://mirrors.aliyun.com/centos-vault/7.9.2009/os/x86_64/Packages/yum-3.4.3-168.el7.centos.noarch.rpm curl -O http://mirrors.aliyun.com/centos-vault/7.9.2009/os/x86_64/Packages/yum-plugin-fastestmirror-1.1.31-53.el7.noarch.rpm curl -O http://mirrors.aliyun.com/centos-vault/7.9.2009/os/x86_64/Packages/yum-metadata-parser-1.1.4-10.el7.x86_64.rpm先解释一下为什么是centos-vaultCentOS 7 已经进入 EOL生命周期结束状态普通路径下官方源只保留最新版本旧版本的 rpm 包全部归档到 vault 库里。阿里云镜像站有对应的 vault 目录这是国内访问速度非常稳的地址。如果你用的是 CentOS 8 或更早的版本路径结构类似只要把版本号和目录名替换掉即可。下载完成后按依赖顺序安装rpm -ivh yum-metadata-parser-*.rpm rpm -ivh yum-plugin-fastestmirror-*.rpm rpm -ivh yum-*.rpm这套顺序的讲究是先装底层的 C 扩展metadata-parser再装插件最后装主程序。如果你用rpm -ivh yum-*.rpm一次性装rpm 也会尝试解析本地文件中的依赖但遇到缺其他包时照样会报错。所以一步步来更稳妥。装完验证which yum yum --version如果提示缺其他依赖比如python-urlgrabber那就用同样的方式从镜像站下载对应包再装上curl -O http://mirrors.aliyun.com/centos-vault/7.9.2009/os/x86_64/Packages/python-urlgrabber-3.10-10.el7.noarch.rpm rpm -ivh python-urlgrabber-*.rpm很多新手卡在这一步就慌了其实完全不用。yum 的依赖包分布在同一个 Packages 目录下缺什么补什么缺几个补几个用rpm -ivh逐个装上即可。3.2 离线安装U 盘/内网传输 rpm 包的四步法离线环境是 yum 安装最典型的应用场景。你在一台能上网的电脑上下载好所有包然后传到目标服务器。核心思路和在线安装一样只是多了“传递”这一步。第一步在一台同版本 CentOS 的联网机器上准备下载目录mkdir /tmp/yum-rpms cd /tmp/yum-rpms第二步用 yum 的“仅下载不安装”功能批量拉取 yum 及相关依赖yum install --downloadonly --downloaddir/tmp/yum-rpms yum这条命令会把 yum 以及它依赖的所有包都下载到指定目录省去你手动分析依赖关系的痛苦。如果手头这台机器也没有 yum 了那就只能退回到手动 curl 方式逐个下载我在 3.1 列出的包。第三步把/tmp/yum-rpms目录整个打包传到目标机器tar czf yum-rpms.tar.gz yum-rpms可以用scp、U 盘拷、甚至python -m SimpleHTTPServer临时起个 HTTP 服务让内网机器下载看现场情况方便。第四步在目标机器上执行本地安装tar xzf yum-rpms.tar.gz cd yum-rpms rpm -ivh *.rpm这里有个注意事项rpm -ivh *.rpm会尝试按文件名顺序安装如果运气不好依赖顺序不对会提示failed dependencies。这时不用重来改成rpm -ivh --nodeps *.rpm但--nodeps相当于禁用依赖检查能装上不代表运行正常装完一定要执行yum --version验证。如果 yum 能正常输出版本号说明风险可控如果报 Python 导入错误那说明缺了 python 的某个模块还得继续补。3.3 装完 yum 后立刻要做的事装好 yum 之后千万别急着用先做三件事用rpm -qc yum查看 yum 的配置文件是否完整确认/etc/yum.conf存在且内容不少于十行。检查/etc/yum.repos.d/目录看是否还有.repo文件。如果没有yum 会提示找不到源这就是为什么很多人“装完 yum 还是用不了”的原因——光有客户端没有源配置。执行yum clean all清一下可能的缓存或脏数据确保从干净状态开始。如果你是在线机器可以直接跳到第 4 章换源如果连的都是内网源或本地源也要继续往下看把源配置好才是最终目标。4. 装完 yum 第一件事把 yum 源配置利索很多教程把“装 yum”和“配 yum 源”混在一起讲容易让人混淆。装 yum 是把客户端软件装好配源是告诉 yum 去哪里找软件包。两个环节缺一不可。4.1 本地 yum 源离线内网必备技能本地源通常分两种一种是挂载 ISO 镜像作为源一种是把已有的 rpm 包目录制作为源。它们都适合内网离线环境。先讲最常见的 ISO 光盘源。假设你已经把 CentOS 的 ISO 文件上传到了服务器/opt目录下mount -o loop /opt/CentOS-7-x86_64-DVD-2009.iso /mnt/cdrom如果/mnt/cdrom不存在就mkdir -p创建。挂载后检查一下ls /mnt/cdrom/Packages/ | head ls /mnt/cdrom/repodata/看到repodata目录才说明这个 ISO 包含完整仓库元数据可以作为 yum 源。接下来创建.repo文件vi /etc/yum.repos.d/local.repo写入以下内容[local] nameLocal CentOS ISO baseurlfile:///mnt/cdrom enabled1 gpgcheck0gpgcheck0是跳过 GPG 签名验证。本地源图省事可以这么写但如果安全要求高的环境建议把gpgcheck1并设置gpgkeyfile:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7避免装到被篡改的包。然后yum clean all yum repolist正常情况下会看到Local CentOS ISO这个仓库且包数量在几千个左右。第二种场景更进阶你手里有一堆散落的 rpm 包想做成一个本地源让局域网内其他机器也能用。这时需要createrepo工具生成元数据yum install -y createrepo # 如果 yum 还没法用就从 ISO 里 rpm 安装 mkdir -p /data/yumrepo cp /path/to/*.rpm /data/yumrepo/ createrepo /data/yumrepo之后把/data/yumrepo通过 Nginx 或 HTTP 服务暴露出去客户端在.repo里写baseurlhttp://你的IP/yumrepo即可。这就是很多内网环境“离线安装 docker、离线安装 nodejs、离线安装 maven”的底层套路。4.2 更换国内镜像源阿里云源的完整配置方法在线机器装完 yum 后默认源指向mirror.centos.org在国内访问速度通常不佳。换源是必须的一步。以 CentOS 7 为例先把官方源备份有后悔药再替换mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak从阿里云镜像站下载对应版本的 Base 源curl -O http://mirrors.aliyun.com/repo/Centos-7.repo mv Centos-7.repo /etc/yum.repos.d/CentOS-Base.repo然后可选安装 epel 扩展源curl -O http://mirrors.aliyun.com/repo/epel-7.repo mv epel-7.repo /etc/yum.repos.d/epel.repoepelExtra Packages for Enterprise Linux是 EPEL 社区维护的扩展软件仓库里面有很多不在官方源里的常用软件。yum install -y epel-release也是热门搜索词原理一样只是通过软件包方式安装。最后清理重建缓存yum clean all yum makecache yum repolistCentOS 8 或 Stream 9 的换源过程大同小异主要区别是.repo文件名和路径不同。CentOS 8 还要注意模块化源的配置别把 AppStream 和 BaseOS 两个源漏掉。4.3 高频源操作技巧exclude 和 update 控制配好源之后有几个我建议你提前知道的细节内核版本一旦更新可能需要重启才生效而且有停服风险。生产环境执行更新时可以用yum update -y --excludekernel*这个方式在处理生产服务器内核敏感期的场景中非常实用能防止 yum 顺手给你升级内核。yum install -y yum-utils device-mapper-persistent-data lvm2这条命令很常见是用来装 docker 前置依赖的。如果你执行后发现没反应或提示无效先看源里有没有这些包再确认yum makecache是否成功。很多时候问题不在命令本身而是缓存不完整。批量下载某个软件及其所有依赖的 rpm 包可以这样yum install --downloadonly --downloaddir/root/rpms docker-ce这在做内网离线安装 docker、离线安装 nodejs、离线装 maven 场景下极其好用。把下载好的 rpm 包带到内网配合本地源就能在不连外网的情况下完成部署。5. 常见问题与排查技巧实录这章是我戴过“镣铐”后的经验总结。yum 安装和使用中踩过的坑比文档里写的多得多我挑高频的、典型的列出来。5.1 rpm 安装时的 dependency 报错典型报错error: Failed dependencies: python-urlgrabber is needed by yum-3.4.3-168.el7.centos.noarch很多人卡在这里就不知道怎么办了。不用慌按我 3.1 的步骤去源路径下搜索python-urlgrabber下载同版本 rpm 后装上再重新装 yum。这里有个技巧在阿里云镜像站网页上可以直接进Packages/目录按文件名搜索找到后右键复制链接。如果你能联网用curl下载最快如果不能联网用个人电脑下载再传进去。也可以换一种思路用rpm -Uvh代替rpm -ivh。-U是升级安装如果系统里已经存在旧版本的依赖它有时能更平滑地处理。但要注意如果系统里某些包版本比你要装的还新-U也可能报错这时你需要尊重版本依赖去找匹配的版本。5.2 yum makecache 报 metadata 错误的排查典型报错类似Errors during downloading metadata for repository base: - Status: 404 Not Found这个基本可以确定是源地址不对或版本目录不对。排查步骤看报错里是哪个 repoyum repolist -v。打开对应的.repo文件检查baseurl路径是否真实可访问。用 curl 试一下curl -I http://mirrors.aliyun.com/centos-vault/7.9.2009/os/x86_64/repodata/repomd.xml。能返回 200 说明路径可用。如果 404多半是版本号不对或你用了已不再维护的地址。CentOS 7 已经 EOL 后很多人的报错都出在旧链接失效。这个问题在 CentOS 6、7、8 上太典型了。记住一个原则旧版本用vault路径新版本用当前路径不要把两者搞混。你在网上搜到的教程如果是两三年前写的很多链接已经失效。5.3 yum 报错 but there is no python module named yum这是“yum 和 python 关系”问题的典型体现。通常发生在你升级/替换了系统 python 之后此时 yum 脚本试图用新 python 运行时发现找不到 yum 模块。解决办法分两种如果系统的/usr/bin/python被软链接指到了别的版本把它改回来ls -l /usr/bin/python ln -sf /usr/bin/python2.7 /usr/bin/pythonCentOS 7 上/usr/bin/python应该指向python2.7。这是最简单有效的修复方法。如果你发现系统里原本的 python2.7 已经被删了那就麻烦一些需要重新安装 python2.7 包。这又是一个“离线安装包”的场景可以从镜像站下载python-2.7.5-*.rpm和依赖包用 rpm 装回去。建议先检查/usr/libexec/urlgrabber-ext-down是否还在它是 yum 下载模块的重要依赖组件经常跟着 python 一起被误删。5.4 yum 命令存在但所有操作都报 Cannot find a valid baseurl这个报错和 yum 本身没关系是源配置或网络的问题。我见过不少运维在这个坑里浪费半天时间。按以下优先级依次排查网络能不能通到源服务器ping -c 2 mirrors.aliyun.com。如果不通检查网卡 IP、网关、DNS。热词里“centos ping 不通网关”就是这个场景。代理是否配置cat /etc/yum.conf看有没有proxy...配置。有些内网环境需要代理才能访问外网源。源文件是否写了正确的baseurl或者变量$releasever、$basearch是否被正确替换。你可以敲yum repolist -v看到最终解析出来的 URL直接拿这个 URL 去 curl 验证。DNS 解析是否正常cat /etc/resolv.conf确认 nameserver 是可用的。我遇到过最离谱的一次是客户机房把 80 端口出方向给禁了yum 所有请求超时最后放行 80 端口才解决问题。所以如果 curl 通但 yum 不通一定要查防火墙和安全策略。5.5 yum 安装一个很想要的包却提示 No package matching这种情况常见于源里根本没有这个包。解决办法启用 epel 源或者在线上搜索该包属于哪个仓库。仓库优先级问题某个源被禁用了检查/etc/yum.repos.d/下各.repo文件里enabled0的仓库以及yum --enablerepoxxx install 包名的用法。缓存过期先yum clean all yum makecache再装。顺带说一个实用技巧如果你不确定包在哪个源里可以用yum provides 文件名反查。比如你知道有个可执行命令叫redis-cli但不知道属于哪个包执行yum provides redis-cli就能查到它属于redis这个包这样就不会装错。6. 一些我踩坑后留下的心得最后分享几条我在实际环境中积累的经验不一定写在官方文档里但非常管用。第一凡是涉及到对 yum 大动干戈的操作强烈建议先备份/etc/yum.repos.d/整个目录再顺手备份一下/etc/yum.conf。改坏了随时回滚比什么都强。备份的成本只有一行命令修复的成本可能是一整晚。第二不要去“优化”系统自带的 Python 环境。很多 CentOS 系统的 Python 2.7 看起来版本旧但它和 yum 是深度绑定的。你装新软件需要 Python 3 时可以并行安装python3包不要动/usr/bin/python这个默认解释器的指向。我在生产环境见过太多次因为升级 Python 导致 yum 崩溃的例子。第三离线环境下养成“下载 yum 包时连依赖一起拉全”的习惯。用yum install --downloadonly --downloaddir而不是手动一个个拷贝。因为你永远猜不到目标机器缺哪个依赖把整个依赖树拉回来才能在离线环境里从容应对。第四如果要在内网搭建 yum 源不一定要用复杂架构。最简单可靠的做法就是一台机器挂 ISO 镜像 一台机器把下载目录通过 Nginx 共享再写几个干净的.repo文件。这套方案我已经在不同项目里用过很多次离线装 docker、nodejs、maven 全都能覆盖稳定得很。yum 这东西用好了不觉得稀奇一旦坏了才知道它有多重要。希望这篇整理能让你少走一些弯路遇到问题时有章可循不用再全网搜零散答案。
返回列表