Linux包管理入门:从yum源配置到依赖解决,一篇讲透命令行软件商店
先说个开门见山的结论如果你刚接触Linux不用管那些“软件包依赖地狱”“编译源码装软件”的传说先学会用yum你就已经拥有了一个开箱即用的软件仓库。我第一次在虚拟机里装完CentOS第一件事就是打开浏览器找“Linux版本的QQ怎么下载”结果发现全是tar.gz压缩包和不知所云的README文件折腾一下午最后连依赖都没搞定。后来干运维久了才明白Linux世界早就有自己的“应用商店”只不过它长在命令行里名字叫yum。你在Windows上打开商店点“安装”做的事在Linux上只需要一行yum install剩下的网络下载、依赖检查、环境配置、垃圾清理全都帮你安排得明明白白。这篇文章我打算把yum从原理到实操一次讲透包括yum源到底是个什么东西、在线源和本地yum源怎么配、CentOS 7/RedHat 6.5/银河麒麟这类系统的通用玩法以及日常高频命令和踩坑实录。无论你是刚装好Linux虚拟机的新手还是需要在内网环境做离线交付的运维工程师这篇内容都应该对你有用。1. 为什么说yum是Linux自己的应用商店1.1 没有yum之前装个软件有多折腾很多年轻人可能没有经历过早期的Linux软件安装方式我简单说一下这个历史背景你就知道yum的价值了。早期Linux装软件主流方式是自己下载源码包执行套路固定的“三步曲”./configure、make、make install。这三个命令的每一个都会弹出让你抓狂的报错。./configure会提示缺某某依赖库你千辛万苦把依赖库装上再运行make又提示缺另一个开发包。就像你准备做一桌菜结果发现要买锅、买铲、买食材、买调料、买燃气灶每一项都不是套餐得单独跑腿。后来RedHat推出了RPMRed Hat Package Manager软件包格式把编译好的二进制文件、配置文件、依赖说明全部打成一个.rpm文件。这确实比源码安装方便但RPM有个著名的大坑就是“依赖地狱”。你想安装A.rpm系统提示需要先装B.rpm你去装B.rpm又提示需要先装C.rpm等你把C装好回头装B又发现B要求C的版本必须大于某个值而你刚装的C版本偏低。手动处理这种依赖链纯靠意志力在撑。yum的出现等于把这套“手动跑腿买食材、逐个检查调料保质期”的流程完全自动化了。你只需要说“我要做鱼香肉丝”yum会自动把肉、胡萝卜、木耳、泡椒、豆瓣酱全部采购好而且版本都匹配好一次性送到你面前。1.2 yum解决的四个核心痛点第一个痛点是依赖解析。yum底层会读取软件包的元数据metadata构建出一个完整的依赖关系树。你执行yum install nginx它会自动计算出nginx需要哪些共享库、哪些辅助包并把它们一起装上。这个过程就是我们常说的“自动解决依赖”。第二个痛点是软件包来源一致性。yum从统一的软件仓库repository下载软件所有RPM包都经过仓库维护者的测试和签名校验不会像你在网上随便下载的安装包那样带一堆来源不明的动态库和安全隐患。第三个痛点是卸载干净。用RPM手动卸载经常卸完主程序还留一堆配置文件、依赖包、开机启动项时间长了系统变得很脏。而yum remove或yum erase会在移除软件包的同时检查并处理不再被其它软件需要的孤立依赖清理动作相对彻底。第四个痛点是批量升级。服务器安全漏洞爆出来之后一条yum update就能把系统里几乎所有软件升级到仓库内的最新版本不用你在成百上千台机器上一台台去手动替换RPM包。这一点对于生产环境批量运维价值是不可替代的。1.3 别搞混了yum和dnf是同一家人如果你用CentOS 7或者RedHat 6.x输入yum命令没毛病这就是经典包管理器。但如果你用的是CentOS 8/9、RHEL 8/9、Rocky Linux 8/9、Fedora这类新版本系统可能会发现系统里还有一个叫dnf的命令甚至输入yum也能用。实际情况是dnf是yum的下一代实现它们使用相同的仓库格式和类似的命令语法。从RHEL 8开始dnf成为默认包管理器但为了兼容用户习惯系统做了软链接让yum命令直接指向dnf。所以你在Rocky 9.2里输入yum install nginx实际执行的是dnf但结果和习惯都和旧版yum一脉相承。我一直觉得你没必要纠结底层是yum还是dnf只要知道这是一套“命令行软件商店”的完整生态就行。真正需要配置的是“商店的供货渠道”——也就是yum源。2. yum源的核心概念一篇文章看懂配置2.1 yum源就是软件仓库相当于应用商店背后的服务器我们平时在Windows应用商店里看到的每个应用背后都有微软或第三方开发者维护的服务器存储着应用程序本体和更新包。Linux里的“yum源”承担的就是这个角色一台或多台存放RPM软件包、并生成好软件索引元数据的服务器。yum源分三类第一类是网络yum源最常见的就是CentOS官方镜像、阿里云镜像源、腾讯云镜像源、清华TUNA镜像源。它们把发行版官方仓库整个同步到国内服务器让你在大陆网络环境下也能快速下载软件包。第二类是本地yum源适合没有外网、处于隔离内网环境的服务器。运维人员把操作系统ISO镜像或特定RPM包集合放到一台服务器上甚至直接挂在某一台机器本地目录然后用file://协议告诉yum从这里安装软件。第三类是第三方yum源最典型的是EPELExtra Packages for Enterprise Linux。它是Fedora社区维护的扩展软件仓库包含大量不在系统默认源里的实用工具和软件包。比如你想装xdotool用来模拟鼠标键盘操作的Linux命令行工具默认源里经常没有装完EPEL后一条命令就搞定。2.2 读懂一个repo配置文件yum的所有仓库配置都写在/etc/yum.repos.d/目录下文件名以.repo结尾。我拿CentOS 7的本地源配置举个例子[local] nameLocal CentOS 7 Repository baseurlfile:///mnt/cdrom enabled1 gpgcheck1 gpgkeyfile:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7[local]是仓库ID必须全局唯一随便起名但建议有意义。name是仓库描述信息yum repolist命令展示的就是这个字段。baseurl是仓库地址支持file://、http://、https://、ftp://这几种协议。enabled1表示启用这个仓库如果写0仓库会被跳过。gpgcheck1表示开启GPG签名校验防止软件包被篡改gpgkey则告诉yum到哪儿去导入公钥。有一个细节很多人不知道baseurl指向的目录下必须存在一个repodata子目录里面保存着仓库的元数据文件。yum要先下载这些元数据才知道仓库里有哪些软件包、版本是多少、依赖是什么。如果没有repodatayum会直接报错哪怕RPM文件就摆在眼前。2.3 本地源和网络源什么时候选哪个刚入门的话照着网上的教程配置网络源就好阿里云源的下载速度在国内比较理想而且社区资料多遇到问题容易找到解决方案。但如果你是给内网服务器、军工单位、银行机房这类不能接入公网的机器配置或者你在用国产化系统比如银河麒麟、统信UOS网络源根本连不通这时候就必须搭建本地yum源。国产系统这块我想多说一句。很多人一听到“银河麒麟”“统信UOS”就觉得无从下手其实这些系统的底层包管理机制兼容RHEL体系很多基于CentOS源码构建yum/dnf命令、repo配置格式、RPM包安装方式跟CentOS/RHEL基本一致。你只要掌握RHEL系yum源的配置思路到国产平台上只是换个baseurl地址和GPG key路径的事内核、软件管理逻辑是相通的。3. 手把手实操本地yum源与网络yum源配置3.1 搭建本地yum源以CentOS 7为例本地yum源最经典的场景是把CentOS 7的DVD ISO挂载到服务器目录让这台服务器可以用自己的安装盘当软件源实现完全离线安装。RedHat 6.5、银河麒麟V10的做法一脉相承换一下ISO镜像和挂载路径就行。第一步准备系统镜像。一般去镜像站下载CentOS-7-x86_64-DVD-2009.iso这类DVD版完整安装镜像大小大概4GB左右。第二步把ISO上传到服务器或虚拟机宿主机然后挂载。如果你在虚拟机里直接通过虚拟光驱加载ISO文件如果你手边只有文件则用命令挂载mkdir -p /mnt/cdrom mount -o loop /path/to/CentOS-7-x86_64-DVD-2009.iso /mnt/cdrom挂载成功后检查一下/mnt/cdrom/repodata目录是否存在。如果存在说明这个ISO内置了仓库元数据可以直接当yum源用。第三步备份原有repo文件创建自己的本地源配置mkdir /etc/yum.repos.d/backup mv /etc/yum.repos.d/*.repo /etc/yum.repos.d/backup/这一步非常关键。如果不把原来的网络源repo文件移走yum会同时启用外部源和本地源一旦网络源访问超时整个操作会变得非常慢。然后编辑本地源vim /etc/yum.repos.d/local.repo写入之前展示过的那段配置。这里我建议把gpgcheck暂设为0因为ISO自带的GPG公钥有时没有提前导入第一次配置总会卡在签名校验上。等你用熟了再把它改回1并导入公钥。第四步清理缓存并生成缓存yum clean all yum makecache执行完以后用yum repolist查看仓库状态再比如用yum list httpd验证能不能搜到软件包。能搜索到本地源就算配置成功了。有一点得提醒你CentOS 7的DVD镜像软件包数量并不是全部它只包含常用的几百个包。如果你需要离线安装的软件不在DVD里得去下载Everything版ISO或者单独把RPM包拷进去再用createrepo命令重建元数据。3.2 配置阿里云网络yum源适配不同系统版本如果你在云主机上部署或者虚拟机本身能访问外网配置阿里云镜像源是最快的路。先备份系统自带的repo配置mkdir /etc/yum.repos.d/backup mv /etc/yum.repos.d/*.repo /etc/yum.repos.d/backup/然后分系统版本操作。CentOS 7直接用阿里云的在线脚本或者手动下载curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo yum clean all yum makecacheCentOS 8/9或Rocky Linux 9.2类似只不过repo文件URL要换成对应的curl -o /etc/yum.repos.d/Rocky-Base.repo https://mirrors.aliyun.com/repo/rocky.repo这里有个常见坑CentOS 8、CentOS 9官方源因为生命周期结束镜像站改到了归档目录直接访问旧地址会404。如果你用CentOS 8/9配置阿里源发现下载元数据报错搜索一下“vault.centos.org”的替换方法或者改换Rocky/AlmaLinux的源思路是一样的。配完后顺手验证yum repolist yum install -y vim wget另外我强烈建议你顺手装一下EPEL仓库很多常用软件包比如xdotool、htop、ncdu都在EPEL里yum install -y epel-release yum makecache装完再执行一次yum repolist你会看到多出一个名为epel的仓库。之后搜软件的范围就广很多了。3.3 离线交付必备批量下载rpm包实际项目里我经常遇到这种情况开发环境能联网生产环境完全隔离但生产环境要安装某个软件却缺少各种依赖。这时候需要“批量下载yum包”功能。常用工具是yumdownloader需要提前安装yum-utilsyum install -y yum-utils yumdownloader --resolve --destdir/root/packages nginx--resolve选项会连带下载所有依赖包--destdir指定保存目录。执行完以后/root/packages下会出现nginx主包和一堆依赖包。还有一种不需要额外工具的方式yum install nginx --downloadonly --downloaddir/root/packages注意--downloadonly在CentOS 7上是yum原生命令支持的在CentOS 8/9上因为底层是dnf也保留了兼容写法。把下载好的RPM包拷贝到离线机器后安装方式有两种。简单粗暴的方式是rpm -ivh /root/packages/*.rpm如果包数量多且存在复杂的依赖关系rpm可能会因为安装顺序报错。我更推荐把整个目录做成一个临时本地yum源yum install -y createrepo createrepo /root/packages然后配置一个指向file:///root/packages的repo文件再用yum install nginx安装。这样依赖关系会由yum自动处理成功率远高于手动rpm安装。4. yum高频命令实战与避坑指南4.1 这些常用命令够你应付90%的场景我把日常运维和开发中经常用到的yum命令整理成了一张表新手可以照着练几遍基本就熟悉了。命令作用常用参数yum list installed查看已安装的所有软件包可配合grep过滤yum list available查看仓库中可用但未安装的包同上yum search 关键词按关键词搜索软件包不加参数会列出全部yum info 包名查看软件包的详细信息、版本、依赖无yum install 包名安装软件包-y跳过确认--downloadonly只下载不安装yum remove 包名卸载软件包-y跳过确认yum update 包名升级指定软件包不写包名则升级全部yum check-update检查有哪些包可升级无yum clean all清理缓存换源后必用yum makecache重新生成缓存换源后必用yum history查看yum事务历史可回滚yum repolist列出所有已启用仓库-v显示更详细信息举个例子很多Java开发新手问“怎么在CentOS上装Java”用yum只需要一条命令yum install -y java-1.8.0-openjdk java-1.8.0-openjdk-devel然后java -version验证即可。不用去Oracle官网下载安装包不用设置复杂的JAVA_HOME环境变量——openjdk包安装时已经把可执行文件放到了/usr/bin默认就在PATH里。4.2 yum update要不要执行这个问题很多人问生产环境最忌讳无脑执行yum update。因为yum update没有带包名时会一次性把所有软件包升级到仓库内的最新版本其中可能包括内核、glibc这些底层组件。升级内核本身不可怕可怕的是内核升级后需要重启而如果新内核和你机器上第三方编译的驱动模块不兼容重启后服务可能直接起不来。我的建议是如果你是在测试环境或新装的开发虚拟机随便yum update没问题还能让系统处于较新的补丁状态。如果你维护的是生产服务器升级之前先想清楚这次升级的目的是什么如果是等保测评要求补安全漏洞建议只更新漏洞相关的软件包或者用yum update-minimal --security只装安全更新。如果是配套软件版本要求升级某个运行环境比如yum update nginx精确到软件名更安全。有时候你不想更新内核但想让其它软件保持最新可以加上--exclude参数yum update -y --excludekernel*这个kernel*会匹配kernel、kernel-devel、kernel-headers等一系列内核相关包把它们排除在更新范围之外。这是生产环境常用的保命写法网上很多教程提到了yum update -y --exclude这两个词指的就是这个用法。另外一个实用技巧是yum history。如果你执行了一次误操作比如不小心升级了某个软件导致环境异常可以查看事务ID然后回滚yum history list yum history undo 事务ID这个命令会尝试把那次事务涉及的所有变更回退虽然不是100%都能成功比如依赖冲突场景但关键时刻能救你一命。4.3 内网机器没有源怎么应对内网机器最怕的就是“没源也没包”。如果你只有一台系统刚装好的机器什么都没有最稳妥的方案是找一台同版本发行版的临时微云服务器把常用的RPM包批量下载好拷进内网。下载哪些包是个学问。我一般先把基础组包拉下来比如yum groupinstall Development Tools --downloadonly --downloaddir/root/devtools然后在离线机器上把包目录做成临时源再执行yum groupinstall Development Tools。这样开发工具链、编译器、make等基础组件一次性备齐。如果你连createrepo工具都没有那只能在有网机器上先yum install -y createrepo把createrepo也打进包里一起带走。这是个很常见的坑——离线机器上没有createrepo就无法构建本地源没有本地源又装不了createrepo陷入死循环。所以有网机器准备离线物料时一定要把createrepo放进去。5. 常见问题排查遇到报错别慌5.1 metadata下载失败的完整排查思路热词里有个特别典型的报错完整表述是errors during downloading metadata for repository ...。这个报错在CentOS 8/9和Rocky上非常常见。原因一般有四种第一仓库baseurl已经失效比如CentOS 8停止维护后官方源被移走第二DNS解析不了镜像域名第三服务器防火墙拦截了对yum服务器的访问第四本机时间不对导致TLS握手失败。我的排查顺序是先用curl -I测试仓库地址能不能访问curl -I http://mirrors.aliyun.com/centos/7/os/x86_64/repodata/repomd.xml如果curl能通yum却报错多半是/etc/yum.repos.d/下某个repo文件有问题特别是baseurl写错了。如果curl不通检查DNS和路由ping mirrors.aliyun.com cat /etc/resolv.conf如果发现DNS配置不对修改后重启网络服务再试。如果服务器时间差了老远用date -s或chrony同步一下时间再重新yum makecache。最后一个大招是加参数强制刷新缓存yum clean all yum makecache --refresh5.2 找不到软件包可能是源不对yum install 包名提示No package xxx available时很多人的第一反应是包名拼错了。实际上很多时候是仓库里根本没有这个包。你先用yum search 关键词搜一下确认包的真实名称——有些包名字和你想象中不一样比如“解压工具unzip”在仓库里就叫unzip而“网络抓包工具”叫tcpdump。用关键词搜索能帮你找到正确包名。搜索确认仓库里确实没有那就考虑两个方向一是安装EPEL扩展源刚说过的方法yum install -y epel-release二是更换镜像源比如从官方源换到阿里云源因为不同镜像站同步的仓库策略和完整度略有差异。运维生产中我遇到搜索不到xdotool这类小众工具好几次了基本都是EPEL没装。5.3 GPG签名校验失败的处理报错信息一般是Public key for xxx.rpm is not installed或者GPG key retrieval failed。这种情况是gpgcheck1开启但系统没有导入对应的公钥。处理方式很简单先手动导入发行版的GPG key。CentOS 7的公钥目录通常在/etc/pki/rpm-gpg/下rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7然后重新yum install。对于第三方源如EPEL如果提示无法获取GPG key也可以去官网下载公钥文件后导入。我个人的建议是不要图省事直接把gpgcheck0尤其在生产环境。GPG签名校验虽然增加了配置复杂度但它能避免软件包被中间人替换或损坏的问题。你可以把公钥维护纳入初始配置流程一次性导入到位。5.4 缓存冲突与repo配置残留换源之后偶尔会遇到Cache status相关奇怪报错或者明明配置了正确的源安装包时安装的却是旧版本。这多半是缓存和系统元数据没刷新。解决方法三条命令一步到位yum clean all rm -rf /var/cache/yum yum makecache第一步清理的是yum缓存索引第二步是彻底删除缓存目录第三步重建缓存。另外千万不要忽略/etc/yum.repos.d/下同时存在多个互相冲突的repo文件。比如你配置了阿里云源但旧的官方源文件还在且有enabled1yum会同时拉取两个源有时会选中其中一个较慢或失效的源导致超时。所以每次配置源之前先备份并隔离旧repo文件这是一个好习惯。5.5 常见问题速查表报错现象大概率原因快速解决方法errors during downloading metadatabaseurl失效或网络不通curl -I测试地址检查DNS/时间更换可用镜像源No package xxx available包不在当前仓库或EPEL未装yum search确认包名安装epel-release后再试GPG key retrieval failed公钥未导入rpm --import对应公钥再尝试安装cache ... error缓存数据旧或损坏yum clean all rm -rf /var/cache/yum yum makecache执行yum命令超时仓库地址不可达或DNS慢检查镜像源连通性修改baseurl为国内镜像源6. 一些后知后觉的经验真正让我对“yum是Linux应用商店”这句话产生共鸣的是一次给国产化服务器做环境交付的坑。当时现场机器不能联网我按老经验把CentOS 7的本地源方式套用到银河麒麟V10上挂载ISO、创建repo文件、yum makecache一路通畅。结果安装某个商业软件时缺了一个很冷门的依赖库这个库正好不在基础ISO里。幸好当时我提前在有外网的机器上把那个依赖和它的父依赖全部下载了下来直接rpm -ivh强行安装才没影响项目进度。后来我养成了两个习惯这里分享给你。第一给内网机器做软件交付时永远多带一份依赖包。即便用本地源也会提前在有外网的机器上用yumdownloader --resolve把目标软件和全部依赖下载成目录放在U盘里一起带过去。多带这份物料能让你在现场少说十句“等我查一下”。第二新服务器装机之后的第一个操作一定是配置yum源。先把本地源或公司内部源配好再执行一次yum makecache最后安装vim、wget、tree、epel-release这些基础工具。这些事情做完后面的所有部署才会顺畅。不少人把yum当成一个“装软件的临时命令”用完就忘直到系统报错才回头看实际上下好离线的软件源才是一台Linux服务器真正“通网”的开始。