
前阵子帮一个朋友在他那台装了 Ubuntu 的旧台式机上跑一套老脚本脚本第二行就写着yum install -y xxx结果终端直接甩回来一句yum: command not found。他当时一脸懵不都是 Linux 吗怎么连 yum 都没有这个问题其实特别典型——很多人是从 CentOS、RHEL 或者各种教学视频里认识 yum 的默认把 yum 当成了Linux 通用包管理器结果一到 Ubuntu 就翻车。Ubuntu 走的是 apt/dpkg 这套 Debian 血统的路线yum 是 Red Hat 系的 RPM 体系工具两者根本不是一个家族。这篇就围绕Linux(Ubuntu系统)安装yum及源的更新这个主题把整件事从头到尾讲透为什么 Ubuntu 默认没 yum、真要在 Ubuntu 上装 yum 有哪几条路、装完之后源到底怎么配、更新怎么做、踩坑怎么排查。内容偏实操命令可以直接抄我会把每一步的意图和参数都说明白适合刚接触 Linux 的新手也适合想搞清楚 apt 和 yum 底层差异的进阶用户。先把一句话结论放这儿Ubuntu 上装 yum 绝大多数时候是可以但不推荐真正需要它的场景很有限搞清楚这个前提后面才不会白折腾。1. 先弄明白Ubuntu 和 yum 到底错位在哪1.1 apt 与 yum 是两个平行世界的包管理器要理解为什么 Ubuntu 上没有 yum得先知道 Linux 发行版分两大阵营。一类是 Debian 系包括 Ubuntu、Debian、Linux Mint它们用dpkg作为底层包管理工具包格式是.deb上层再用aptAdvanced Package Tool做依赖解析和仓库管理。另一类是 Red Hat 系包括 RHEL、CentOS、Fedora、Rocky Linux、AlmaLinux底层是rpm包格式是.rpm上层用yumYellowdog Updater Modified或它的继任者dnf。这两套体系各自维护自己的软件仓库、依赖数据库和安装脚本互不通用。就像你家拧的是十字螺丝隔壁老王家全是内六角工具看着都叫螺丝刀但插进去就是对不上。所以你在 Ubuntu 上敲apt install nginx能一气呵成敲yum install nginx就找不到命令——不是系统坏了而是这套工具压根没预装。这里有个很多人会混淆的点Debian 系其实有个叫alien的工具可以把.rpm转成.deb但它是转换不是兼容转换后能不能正常跑完全看运气尤其是带复杂依赖或者安装脚本的包转换失败率高得很。所以指望用 alien 来让 Ubuntu 支持 rpm基本不现实。1.2 什么情况下才真的需要在 Ubuntu 上折腾 yum说实话日常开发运维Ubuntu 上装 yum 的需求非常少。但确实有几类场景会让人动这个念头我按出现频率排一下。第一类是学习或教学需求。很多 Linux 入门教程、面试题、实验手册是以 CentOS 为模板写的命令全用 yum。手上只有 Ubuntu 机器为了照着教材敲一遍命令就想把 yum 装上。这种情况我建议直接用容器跑一个 CentOS 环境比在 Ubuntu 上硬装 yum 干净得多后面会讲。第二类是兼容老脚本。有些历史遗留的部署脚本、自动化工具里写死了 yum 命令跑到 Ubuntu 上就断。这种最省事的做法是改脚本把yum install替换成apt install改完的脚本还更好维护实在改不动才考虑装 yum。第三类是特定的打包或测试流程。比如你要构建 rpm 包或者验证某些依赖 rpm 的产物需要在 Debian 系机器上装 rpm 工具链。这种一般装的是rpm和rpmbuild不一定真要完整的 yum。提示如果你只是想在 Linux 上学 yum 命令最干净的办法是docker run -it centos:7 bash起一个 CentOS 容器在里面随便折腾 yum退出即销毁绝不污染宿主机。Ubuntu 上装 yum 属于能装但别扭能绕开就绕开。2. 动手前的准备环境确认与依赖盘点2.1 确认系统版本与 Python 环境这一步决定后续路线在 Ubuntu 上装 yum第一个坎就是Python 版本。yum 3.x 是用 Python 2 写的而 Ubuntu 从 20.04 开始就彻底移除了 Python 2 的默认支持系统默认只有 Python 3。这意味着你在 Ubuntu 22.04、24.04 这类新系统上直接apt install yum要么找不到包要么装上了也跑不起来一执行就报No module named yum之类的错。所以第一步是确认自己的系统版本。执行lsb_release -a或者更通用一点cat /etc/os-release输出的VERSION_ID就是你的版本号。我按版本给大家一个大致判断Ubuntu 版本默认 Pythonapt 仓库是否含 yum 包直接装 yum 可行性16.04Python 2.7 3有yum 3.4.x高基本能直接跑18.04Python 2.7 3有yum 3.4.3中需注意 python2 依赖20.04仅 Python 3无低需手动补 python222.04仅 Python 3无低需容器或降级方案24.04仅 Python 3无很低强烈建议换思路看完这张表你就明白了越新的 Ubuntu越不该硬装 yum。如果你就是 16.04/18.04那还好说一条命令的事如果是 22.04 以后我更推荐容器方案。顺便确认一下架构因为下载 deb 包时要选对uname -mx86_64就是 64 位aarch64是 ARM64下载包时别下错。2.2 更新系统并养成备份习惯无论走哪条路动手前先把系统更新到最新能省掉一大堆依赖冲突的麻烦sudo apt update sudo apt upgrade -yapt update是刷新本地软件包索引注意它不装东西只是拉取仓库元数据apt upgrade才是真正升级已安装的包。这两条命令新手经常搞混记住一张图update是对清单upgrade是按清单搬货。还有一个我踩过坑才养成的习惯改任何系统配置文件之前先备份。yum 的源文件放在/etc/yum.repos.d/下改之前先备份sudo cp -r /etc/yum.repos.d /etc/yum.repos.d.bak别嫌麻烦配置改崩了没法回退的时候这个备份能救命。我之前有一次手抖把 repo 文件里的baseurl少打了个斜杠yum 直接全部源失效就是靠备份五分钟恢复的。3. Ubuntu 安装 yum 的三条可行路径3.1 路径一apt 直接安装老版本系统最省事如果你的 Ubuntu 是 18.04 及更早版本仓库里还有 yum 包直接装就行sudo apt install yum -y装完验证一下yum --version能打印出版本号一般是 3.4.3就说明装上了。这条路径的优点是干净、有依赖管理、能跟着 apt 一起升级卸载。缺点是只适用于老版本20.04 之后这条命令基本会返回E: Unable to locate package yum。如果真的遇到找不到包可以先确认仓库索引是不是最新的sudo apt update apt-cache search yum | headapt-cache search用来在本地索引里搜包名如果搜不到任何跟 yum 相关的结果那就说明这个版本确实没这个包别浪费时间了直接看路径二或路径三。3.2 路径二手动下载 deb 包安装新版本系统适用新版 Ubuntu 里装 yum本质是要解决当年 yum 依赖的 Python 2 环境。思路是手动去旧的 Ubuntu 软件源比如 18.04 的 archive把 yum 及其依赖的 deb 包下载下来再本地安装。这条路能走通但比较费劲因为依赖会像滚雪球一样越滚越多。大致流程是这样先加一个旧版本的源再用apt download把 yum 和它的依赖全抓下来。但这里有个大坑——混用不同版本的软件源极易引发系统级依赖冲突稍不注意就把系统的 Python 环境搞乱影响其他正常软件。所以我不太推荐新手走这条路除非你有明确的隔离环境比如虚拟机快照。如果你确实想试务必在虚拟机里做并提前打好快照。核心命令逻辑是下载而非直接安装mkdir ~/yum-pkgs cd ~/yum-pkgs apt-get download yum python2 python2-minimal下完之后用dpkg -i逐个安装遇到依赖报错再手动补对应的 deb。这个过程没有固定的一次性命令全靠看报错补包。说实话有这功夫不如直接上容器。3.3 路径三容器化运行新系统最推荐的方案前面反复提到的容器方案是我在新版 Ubuntu 上最推荐的做法。原理很简单不走 Ubuntu 的 apt 体系而是直接跑一个 CentOS/RHEL 的容器镜像容器内部天然就是 yum 的世界想怎么用怎么用宿主机的 Ubuntu 一点不受影响。前提是本机装了 Docker。如果没装sudo apt install docker.io -y sudo systemctl enable --now docker然后拉一个 CentOS 镜像跑起来sudo docker run -it --name my-yum centos:7 /bin/bash进去之后你会发现yum随手可用yum --version yum repolist想挂载一个本地目录进去共享文件加-v参数sudo docker run -it -v /home/user/share:/mnt centos:7 /bin/bash这样宿主机/home/user/share和容器内/mnt就互通了你在容器里用 yum 装的包、生成的文件都能拿出来。退出容器exit后它自动停止下次docker start -ai my-yum接着用。三条路径我做个对比方便你按自己情况选方案适用版本隔离性上手难度推荐度apt 直接装16.04/18.04低污染系统低老系统可用手动 deb 包20.04低易冲突高不推荐容器化全版本高完全隔离中强烈推荐心得我现在的习惯是只要是想体验另一个发行版的工具链一律开容器绝不在宿主机上东拼西凑。系统环境的干净程度直接决定了你以后排查问题时的痛苦程度。4. yum 源配置与更新搭一套真正能用的仓库4.1 yum 源文件长什么样每个字段管什么装好 yum 之后真正让它能用的关键是配置源repo。yum 的源文件都放在/etc/yum.repos.d/目录下文件名一般以.repo结尾。一个最典型的源配置长这样[base] nameCentOS-Base baseurlhttp://mirror.example.com/centos/7/os/x86_64/ enabled1 gpgcheck1 gpgkeyhttp://mirror.example.com/centos/RPM-GPG-KEY-CentOS-7别小看这几行每个字段都有讲究我逐个拆开讲[base]是仓库的唯一标识必须唯一不能和别的 repo 重名重名会导致 yum 报错。name只是给人看的人类可读描述随便写不影响功能。baseurl是仓库的实际地址这是最关键的一行指向一个包含repodata/子目录的路径。enabled1表示启用这个源设为0就是临时禁用调试时很有用。gpgcheck1表示校验包签名生产环境强烈建议开能防止包被篡改学习环境嫌麻烦可以设 0。gpgkey是签名公钥的地址和 gpgcheck 配套使用。理解这六个字段你就掌握了 yum 源的全部核心。剩下的都是在此基础上的变体。4.2 配置网络 yum 源镜像站加速的正确姿势默认的官方源在国内访问速度堪忧换成国内镜像站能快好几倍。以 CentOS 7 为例换阿里云镜像源的步骤如下。先把原来的源文件备份又见备份这真是好习惯cd /etc/yum.repos.d/ mv CentOS-Base.repo CentOS-Base.repo.backup然后下载对应的镜像源文件curl -o CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo或者用 wgetwget -O CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo下载完清理旧缓存并生成新缓存这是换源之后必须做的一步否则 yum 还在用旧源的元数据yum clean all yum makecacheyum clean all清掉缓存yum makecache根据新的源地址重新拉取元数据并缓存到本地。这两条命令是换源的标准收尾动作记住它们。验证一下源是否生效yum repolist如果输出的仓库列表里有你新配的源且状态是 enabled那就成了。如果报错多半是 baseurl 写错或者网络不通后面的排查章节会细讲。4.3 配置本地 yum 源离线环境的标准做法有些环境比如内网、断网的实验机连不上外网就需要本地 yum 源。最经典的场景是挂载系统安装 ISO 作为源这也是很多实验课里配置本地 yum 源的核心内容。思路是这样的系统安装光盘 ISO 里本身就带了一个完整的Packages目录把它挂载到本地然后让 yum 指向这个挂载点即可。操作如下。先挂载 ISO假设镜像在/mnt/iso/CentOS-7.isomkdir -p /mnt/iso mount -o loop /mnt/iso/CentOS-7.iso /mnt/cdrom如果是虚拟机挂载了光驱通常设备是/dev/sr0mount /dev/sr0 /mnt/cdrom然后新建一个本地源文件/etc/yum.repos.d/local.repo[local] nameLocal CDROM baseurlfile:///mnt/cdrom enabled1 gpgcheck0注意baseurl这里是file://开头指向本地挂载点。改完还是老三样清缓存、建缓存、看列表yum clean all yum makecache yum repolist如果你想验证本地源真能装东西随便挑个小包试试yum install -y tree能装上就说明本地源配通了。这个方案在离线内网环境里非常实用一个 ISO 就能撑起整套离线安装。4.4 常用的源更新命令别只会 install配好源之后日常操作其实就那几个命令但每个都有适用场景别乱用。我整理成表命令作用使用场景yum makecache生成/刷新元数据缓存换源后、缓存失效后yum clean all清理所有缓存换源前、报缓存错误时yum repolist列出已启用仓库验证源配置yum update升级所有可升级的包常规系统更新yum update 包名升级指定包精准更新yum list installed列出已安装包排查已装软件yum search 关键词搜索包找包用yum info 包名查看包详情装前确认信息这里重点说一下yum update和yum upgrade的关系。在 yum 里它俩几乎是等价的都会把系统里的包升到仓库里的最新版。但要注意大规模 update 有风险尤其是跨大版本升级时可能引入不兼容生产环境动手前一定要评估、备份、在测试环境验证。这也是为什么热词里会出现yum update -y --exclude这种带排除参数的写法——更新时用--exclude把关键包排除掉避免被意外升级yum update -y --excludekernel*上面这条意思就是升级系统但不动内核kernel*是通配符把所有内核相关包都排除了。这个技巧在处理不想动内核的场景时特别有用。还有一类常见需求是装 EPEL 源Extra Packages for Enterprise Linux它挂了大量官方源里没有的常用软件yum install -y epel-release装完再yum repolist就能看到多了 epel 仓库之后就能装很多第三方包了。5. 常见报错与排查实录5.1 yum 装上了却跑不起来Python 报错这是 Ubuntu 上装 yum 最高频的问题。现象是执行 yum 直接抛异常比如There was a problem importing one of the Python modules No module named yum或者干脆是一堆 Python traceback。根因只有一个yum 依赖的 Python 环境不对。yum 3.x 认的是 Python 2而系统里只有 Python 3或者环境变量指错了解释器。排查分三步走。第一步确认系统里到底有没有 Python 2which python2 python2 --version如果没有那这个版本系统上装原版 yum 基本没戏老老实实回容器方案。第二步看 yum 脚本头部写的是哪个解释器head -1 /usr/bin/yum正常应该输出#!/usr/bin/python2之类。如果指向了一个不存在的路径可以手动改这个 shebang 行指向真实存在的 Python 2 路径。不过这是权宜之计不保证所有依赖都能跑通。第三步检查 PYTHONPATH 等环境变量有没有被污染。有时是之前装的东西改了全局 Python 配置导致 yum 找不到自己的模块。这种情况最彻底的办法还是隔离环境重建。踩坑记录我见过有人为了让 yum 跑起来把系统默认的 python 软链从 python3 改回 python2结果整个系统的 apt 直接瘫了——因为新版 Ubuntu 的 apt 是 Python 3 写的。永远不要为了迁就一个工具去改系统默认的 Python 软链这是大忌。5.2 源报错大全从连接失败到元数据损坏源相关报错五花八门但套路就那几个。我整理了一份速查表报错关键词大致原因解决方向Cannot retrieve metalink源地址不可达检查网络、换可用镜像Could not resolve hostDNS 解析失败检查/etc/resolv.confConnection timed out网络超时或防火墙检查连通性、代理设置Metadata file does not match checksum缓存损坏yum clean all后重试repomd.xml ... 404baseurl 路径错误核对路径结尾斜杠Cannot find a valid baseurl源配置没生效检查 enabled 和文件后缀几个高频点的排查姿势展开说。遇到Could not resolve host先在命令行验证 DNSping mirrors.aliyun.com nslookup mirrors.aliyun.com如果 ping 不通域名但能 ping 通 IP那基本就是 DNS 问题检查/etc/resolv.conf里有没有配可用的 DNS 服务器。热词里提到linux中配置dns出现的问题多半就是这类。注意这个文件有时是被系统服务动态生成的直接改可能在重启后失效得从源头网络管理服务去配。遇到repomd.xml404八成是 baseurl 结尾的斜杠问题或者路径里版本号写错了。比如漏了末尾的/yum 拼接出的 URL 就少一层目录自然 404。这种低级的错往往最耗时间。遇到 checksum 不匹配或者元数据损坏很多时候是缓存脏了标准操作就是两步走yum clean all yum makecache大部分源类的玄学问题清缓存都能治。5.3 依赖冲突与安全卸载回退在 Ubuntu 上折腾 yum最怕的就是把系统依赖搞乱。典型症状是 apt 突然开始报一堆未满足的依赖或者某些软件莫名跑不起来。这时候要能干净地回退。如果当初是用 apt 装的 yum卸载相对简单sudo apt remove --purge yum -y sudo apt autoremove -yautoremove会把当初为 yum 自动安装、现在没人用的依赖一并清掉。但如果当初是手动 dpkg 装了一堆包卸载就麻烦了得一个个对照着卸还容易误伤系统正在用的包。这也是为什么我前面反复强调新系统别走手动 deb 这条路。如果你只是临时不想用某个源不想删配置可以临时禁用yum --disablerepobase install 包名或者把 repo 文件里的enabled1改成0效果一样。这样比删文件灵活排查源冲突时很好用。6. 我自己的实操心得与避坑清单折腾了这么些年关于Ubuntu 上碰 yum这件事我攒了几条实打实的经验都是吃过亏才明白的。第一条先问自己是不是真的需要装 yum。我统计过自己遇到的需求超过八成最后都被改脚本用 apt或者开容器给替代了。真正需要在 Ubuntu 宿主机上跑 yum 的场景少得可怜。花十分钟想想有没有更简单的路往往比花两小时硬装 yum 划算得多。第二条新版 Ubuntu 一律走容器。20.04 以后就别在宿主机上硬啃了docker run -it centos:7 bash三秒搞定的事没必要跟 Python 依赖较劲。容器的隔离性还能保证你折腾完系统依然是干净的这个好处在长期使用中太重要了。第三条换源永远先备份、后清缓存。cp备份、yum clean all、yum makecache这三步是肌肉记忆级别的操作一次都别省。我见过太多人换完源直接 install然后对着旧缓存的内存玄学问题抓耳挠腮。第四条别碰系统默认 Python 软链。这是我在服务器上见过的最伤系统的误操作之一。为了迁就一个包管理器把整个系统的 Python 环境搞崩得不偿失。第五条本地源是离线环境的救命稻草。内网、断网机器上一个 ISO 配合一个file://的 repo 文件就能撑起完整的离线安装能力。这个技能在处理隔离环境时值千金值得专门花时间练熟。最后再分享一个小技巧不管你用哪种方式配源配完都先跑一次yum repolist -v加-v能看到每个仓库的详细信息包括状态、包数量、baseurl 等。它比默认的repolist多出来的那些细节在排查源问题时特别有用——一眼就能看出哪个源没加载、哪个源包数为零。这个细节没人专门教但用熟了排查效率能高一截。