1. RPM与Yum软件仓库的核心设计逻辑
1.1 为什么需要软件包管理器
在Linux系统里手动装软件是什么体验?下载源码包、解压、./configure、make、make install,一套流程走下来,轻则半小时,重则半天,还经常卡在依赖报错上——装A提示缺B,装B提示缺C,装C又提示跟D版本冲突。这种“依赖地狱”在早期Linux运维中几乎是家常便饭。
RPM(Red Hat Package Manager)的出现解决了“怎么把软件打包成标准格式”的问题,它把二进制文件、配置文件、依赖声明、安装脚本统一封装进一个.rpm文件,安装时自动校验依赖关系。但RPM本身有个致命短板:它只管“装”,不管“找”。你告诉它装某个包,它就去装,但如果你不知道包名、不知道依赖链怎么解,RPM就无能为力了。
Yum(Yellowdog Updater Modified)就是在这个背景下补位的。它的核心价值在于仓库管理和依赖自动解析——把所有可用的RPM包集中放在一个仓库里,维护一份元数据索引,安装时自动从索引里查出依赖关系,按顺序把所有需要的包一次性装好。打个比方,RPM是快递员,你给他地址他就能送;Yum是快递调度中心,你只说“我要买台电脑”,它自动帮你把主机、显示器、键鼠、线材全部配齐送到家。
这套机制在CentOS、RHEL、Fedora、Rocky Linux、AlmaLinux等红帽系发行版里是标配,也是运维人员日常打交道最多的工具之一。不管你是刚接触Linux的新手,还是管着上百台服务器的老手,把Yum仓库的配置、排障、优化吃透,都能省下大量重复劳动。
1.2 Yum仓库的架构与工作原理
Yum的工作流程可以拆成四个阶段来理解。
第一阶段是仓库配置读取。Yum启动后会扫描/etc/yum.repos.d/目录下所有.repo后缀的文件,每个文件里可以定义一个或多个仓库。每个仓库必须包含几个关键字段:name(仓库描述名)、baseurl(仓库地址,可以是HTTP、FTP或本地文件路径)、enabled(是否启用)、gpgcheck(是否校验包签名)。这些字段决定了Yum去哪里找包、找哪些包、要不要验证包的合法性。
第二阶段是元数据下载与缓存。Yum不会直接去仓库里翻RPM文件,而是先下载仓库的元数据(repodata),里面记录了每个包的名称、版本、依赖关系、文件列表等信息。元数据下载后会缓存在本地/var/cache/yum/目录下,默认有效期一段时间,过期后自动重新拉取。这个设计的好处是:日常查询操作(比如yum search)走本地缓存,速度极快,不用每次都请求远程仓库。
第三阶段是依赖解析。当你执行yum install时,Yum会根据元数据里的依赖声明,构建一棵依赖树。比如装Nginx,元数据里写着它依赖pcre、zlib、openssl,Yum就会把这几个包也加入安装列表,再检查这些包有没有自己的依赖,层层递归直到所有依赖都满足。如果某个依赖找不到,Yum会直接报错并列出缺失项,不会装到一半卡住。
第四阶段是包下载与安装。依赖树确定后,Yum从baseurl指定的地址下载所有需要的RPM包到缓存目录,然后调用RPM逐个安装。安装顺序由依赖关系决定——被依赖的包先装,依赖别人的包后装。安装完成后,Yum会更新本地RPM数据库,记录这次操作装了哪些包、装了什么版本。
理解这四个阶段,后面遇到“为什么Yum这么慢”“为什么明明有包却搜不到”“为什么依赖报错”这类问题,排查起来就有方向了。
1.3 本地仓库与网络仓库的选型考量
实际工作中,Yum仓库的部署方式主要分两种:网络仓库和本地仓库。
网络仓库是把RPM包放在HTTP或FTP服务器上,所有客户端通过URL访问。这种方式的优势是集中管理——管理员只需要在一台服务器上更新包,所有客户端都能同步获取。适合有多台服务器的生产环境,尤其是集群部署场景。缺点是依赖网络,如果仓库服务器挂了或者网络不通,客户端就装不了包。
本地仓库是把RPM包放在本机某个目录下,通过file://协议访问。优势是不依赖网络,速度快,适合单机环境或者网络受限的场景。缺点是需要手动同步包,每台机器都得存一份,占用磁盘空间。
还有一种混合模式:本地镜像仓库。用reposync把远程仓库的所有包同步到本地,再用createrepo生成本地元数据,客户端指向本地镜像。这种方式兼顾了速度和可控性,适合内网环境——既不用每台机器都去外网拉包,又能保证包版本的一致性。
选哪种方式,核心看三个因素:机器数量、网络条件、更新频率。机器多、网络好、更新频繁,优先网络仓库;机器少、网络差、更新少,本地仓库更省事;介于两者之间,本地镜像仓库是折中方案。
2. Yum仓库配置的核心细节与实操要点
2.1 repo文件的关键字段拆解
一个标准的.repo文件长这样:
[base] name=CentOS-$releasever - Base baseurl=http://mirror.example.com/centos/$releasever/os/$basearch/ enabled=1 gpgcheck=1 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7逐字段说明:
[base]是仓库ID,必须唯一,Yum命令里用--enablerepo=base或--disablerepo=base时引用的就是这个ID。ID命名建议用有意义的短名称,别用repo1、repo2这种,时间长了根本记不住哪个是哪个。name是仓库的描述名,只用于显示,不影响功能。但建议写清楚,比如“CentOS 7 Base Repository”,执行yum repolist时一眼就能看出是哪个仓库。baseurl是仓库地址,支持HTTP、HTTPS、FTP和file://。这里可以用变量:$releasever代表系统主版本号(如7、8、9),$basearch代表CPU架构(如x86_64、aarch64)。用变量的好处是同一份repo文件在不同版本的系统上都能用,不用手动改。enabled=1表示启用该仓库,设为0则禁用。默认不写这个字段时是启用的。gpgcheck=1表示安装前校验RPM包的GPG签名,确保包没被篡改。生产环境强烈建议开启,关掉虽然省事但等于放弃了安全校验。gpgkey指定GPG公钥的位置,可以是本地文件路径,也可以是远程URL。首次使用时会提示导入公钥,导入后后续安装自动校验。
还有一个常用字段priority,用于多仓库场景下指定优先级,数字越小优先级越高。比如系统仓库设为1,第三方仓库设为10,这样同名包会优先从系统仓库安装,避免第三方包覆盖系统关键组件。
2.2 仓库配置的常见操作命令
配置完repo文件后,日常操作主要围绕这几个命令:
# 查看当前启用的仓库列表 yum repolist # 查看所有仓库(包括禁用的) yum repolist all # 清理缓存(元数据损坏或仓库地址变更后必做) yum clean all # 重建缓存(清理后执行,重新下载元数据) yum makecache # 搜索包 yum search nginx # 查看包信息(版本、依赖、描述) yum info nginx # 安装包 yum install nginx # 卸载包 yum remove nginx # 更新所有包 yum update # 只更新指定包 yum update nginx # 查看包依赖关系 yum deplist nginx # 查看某个文件属于哪个包 yum provides /usr/sbin/nginx这里重点说两个容易被忽略的命令。yum provides在排查“这个命令是哪个包提供的”时特别有用,比如系统里有个htpasswd命令但不知道装了什么包,yum provides */htpasswd就能查出来。yum deplist在排查依赖冲突时很有价值,它会列出指定包的所有依赖以及每个依赖由哪个包提供。
注意:执行
yum clean all后一定要跟yum makecache,否则下次安装时会重新下载元数据,速度会慢很多。这两个命令建议成对使用。
2.3 多仓库优先级与冲突处理
当系统里配置了多个仓库时,同一个包可能在多个仓库里都有。比如Nginx在系统仓库里有,在EPEL仓库里也有,在Nginx官方仓库里还有。默认情况下,Yum会选择版本最新的那个,但这不一定是你想要的——系统仓库的Nginx可能版本旧但经过充分测试,官方仓库的版本新但可能跟系统其他组件不兼容。
这时候就需要用priority字段来控制。安装yum-plugin-priorities插件后,在repo文件里加上priority=N,数字越小优先级越高。Yum会优先从高优先级仓库找包,只有高优先级仓库里没有时才去低优先级仓库找。
另一个常见问题是仓库冲突。比如两个仓库提供了同一个包的不同版本,且依赖关系互相矛盾,Yum会报“Error: Package X conflicts with Y”。排查方法是先用yum list available | grep 包名看看哪些仓库提供了这个包,再用yum info 包名对比版本和来源,最后用--disablerepo临时禁用某个仓库来测试。
实操心得:生产环境建议只启用必要的仓库,第三方仓库能少则少。每多一个仓库,就多一份依赖冲突的风险。如果确实需要第三方包,优先找官方提供的仓库,其次选维护活跃的社区仓库。
3. 从零搭建Yum仓库的完整实操流程
3.1 环境准备与基础配置
假设我们要在一台内网服务器上搭建本地Yum仓库,给同网段的其他机器提供包管理服务。系统是CentOS 7,服务器IP是192.168.1.100,仓库目录放在/var/www/html/repo。
第一步,安装必要工具:
yum install -y httpd createrepo yum-utilshttpd提供HTTP服务,createrepo用于生成本地仓库元数据,yum-utils里包含reposync等实用工具。
第二步,启动HTTP服务并设置开机自启:
systemctl start httpd systemctl enable httpd第三步,创建仓库目录结构:
mkdir -p /var/www/html/repo/base mkdir -p /var/www/html/repo/extras mkdir -p /var/www/html/repo/updates这里按仓库类型分了三个子目录,实际使用时可以根据需要调整。目录结构清晰的好处是后续维护方便,找包、更新包都有明确的位置。
第四步,配置防火墙放行HTTP端口:
firewall-cmd --permanent --add-service=http firewall-cmd --reload如果内网没有防火墙,这一步可以跳过。但生产环境建议保留防火墙规则,只放行必要的端口。
3.2 同步远程仓库到本地
用reposync把远程仓库的RPM包同步到本地目录:
reposync -r base -p /var/www/html/repo/base/ reposync -r extras -p /var/www/html/repo/extras/ reposync -r updates -p /var/www/html/repo/updates/-r指定仓库ID,-p指定下载目录。reposync会自动创建以仓库ID命名的子目录,把所有RPM包下载进去。同步时间取决于仓库大小和网络速度,CentOS 7的base仓库大概有上万个包,首次同步可能需要几十分钟到几个小时。
如果只想同步特定包,可以用--download-metadata配合--newest-only只下载最新版本,减少磁盘占用。但生产环境建议全量同步,避免需要某个旧版本时找不到。
同步完成后,用createrepo生成元数据:
createrepo /var/www/html/repo/base/ createrepo /var/www/html/repo/extras/ createrepo /var/www/html/repo/updates/createrepo会扫描目录下所有RPM包,提取依赖信息,生成repodata目录。这个目录里的文件就是Yum客户端下载的元数据。
注意:每次新增或删除RPM包后,都需要重新执行
createrepo更新元数据。如果只是新增少量包,可以用createrepo --update增量更新,速度比全量重建快很多。
3.3 客户端配置与验证
在客户端机器上创建repo文件:
[local-base] name=Local Base Repository baseurl=http://192.168.1.100/repo/base/ enabled=1 gpgcheck=0 [local-extras] name=Local Extras Repository baseurl=http://192.168.1.100/repo/extras/ enabled=1 gpgcheck=0 [local-updates] name=Local Updates Repository baseurl=http://192.168.1.100/repo/updates/ enabled=1 gpgcheck=0保存到/etc/yum.repos.d/local.repo,然后执行:
yum clean all yum makecache yum repolist如果yum repolist能列出刚才配置的三个仓库,且状态正常,说明仓库搭建成功。接下来可以测试安装一个包:
yum install -y tree如果安装成功,说明整个链路都通了。
这里gpgcheck=0是因为本地仓库的包是从官方仓库同步过来的,已经校验过签名,客户端再校验一次意义不大。但如果仓库里混入了自己打的包,建议开启GPG校验并配置对应的公钥。
3.4 仓库的日常维护与更新
仓库搭建好只是开始,日常维护才是重头戏。建议制定一个更新策略:
- 每周同步一次:用
reposync拉取远程仓库的最新包,保持本地仓库与上游同步。 - 同步后重建元数据:
createrepo --update更新元数据,让客户端能感知到新包。 - 定期清理旧包:用
repomanage工具删除旧版本包,只保留最新版本,节省磁盘空间。
# 查看旧版本包 repomanage --old /var/www/html/repo/base/ # 删除旧版本包 repomanage --old /var/www/html/repo/base/ | xargs rm -f # 重建元数据 createrepo --update /var/www/html/repo/base/实操心得:清理旧包前一定要确认没有客户端还在依赖旧版本。如果生产环境有版本锁定需求,建议保留最近两到三个版本,不要只留最新版。另外,清理操作建议在业务低峰期执行,避免影响客户端安装。
4. 常见问题排查与避坑技巧实录
4.1 仓库配置类问题速查
| 问题现象 | 可能原因 | 排查方法 | 解决方案 |
|---|---|---|---|
yum repolist显示仓库为0 | repo文件未生效或格式错误 | 检查/etc/yum.repos.d/下文件后缀是否为.repo | 修正文件名,确保enabled=1 |
| 仓库显示但无法访问 | baseurl地址错误或网络不通 | curl测试baseurl是否可达 | 修正地址,检查防火墙和DNS |
| 元数据下载失败 | 仓库未生成repodata或权限不足 | 检查仓库目录下是否有repodata目录 | 执行createrepo生成元数据 |
| GPG校验失败 | 公钥未导入或包签名不匹配 | rpm --import导入公钥 | 导入正确公钥或临时关闭gpgcheck |
| 包搜不到 | 仓库未启用或元数据未更新 | yum repolist all查看仓库状态 | 启用仓库并执行yum makecache |
这张表覆盖了八成以上的仓库配置问题。实际排查时,建议按“先看仓库状态,再看网络连通性,最后看元数据”的顺序来,从外到内逐层排除。
4.2 依赖冲突的排查思路
依赖冲突是Yum使用中最头疼的问题,典型报错是“Error: Package X requires Y, but none of the providers can be installed”。
排查步骤:
- 确认缺失的依赖是什么:报错信息里会明确写出缺哪个包、需要什么版本。
- 检查该依赖是否在已启用的仓库里:
yum provides 依赖包名或yum list available | grep 依赖包名。 - 如果依赖在禁用的仓库里:用
--enablerepo=仓库ID临时启用,或者修改repo文件永久启用。 - 如果依赖版本不匹配:可能是仓库里的版本太旧或太新,需要找对应版本的仓库,或者用
--skip-broken跳过冲突包(不推荐,可能导致系统不稳定)。 - 如果多个仓库提供同名包:用
priority字段控制优先级,或者用--disablerepo排除干扰仓库。
避坑技巧:遇到依赖冲突时,先用
yum deplist 包名看清楚完整的依赖树,再决定怎么处理。盲目用--skip-broken或--nobest可能装上一个残缺的系统,后续问题更多。
4.3 缓存与性能优化技巧
Yum默认的缓存策略是“下载后保留一段时间”,但实际使用中经常遇到缓存过期导致操作变慢的问题。几个优化点:
调整缓存过期时间:在/etc/yum.conf里设置metadata_expire,单位是秒。默认是6小时(21600秒),内网仓库可以设长一些,比如24小时(86400秒),减少元数据重复下载。
启用 fastestmirror 插件:安装yum-plugin-fastestmirror后,Yum会自动测试各个镜像的速度,选择最快的那个。对于配置了多个baseurl的仓库特别有用。
使用本地缓存:如果多台机器装同样的包,可以在内网搭一个缓存代理,比如yum-plugin-local或squid,避免每台机器都去远程拉包。
定期清理无用缓存:yum clean packages清理下载的RPM包,yum clean metadata清理元数据,yum clean all全清。建议每月执行一次,释放磁盘空间。
# 查看当前缓存占用 du -sh /var/cache/yum/ # 清理所有缓存 yum clean all # 重建缓存 yum makecache4.4 仓库安全与权限管理
仓库里放的是系统级软件包,一旦被篡改,影响的是所有使用该仓库的机器。几个安全措施:
- 开启GPG校验:生产环境必须开启
gpgcheck=1,并配置正确的gpgkey。自己打的包也要签名,把公钥分发给客户端。 - 限制仓库目录权限:
/var/www/html/repo目录建议设为755,属主为root,避免普通用户修改包文件。 - HTTP服务加固:如果仓库通过HTTP暴露,建议加访问控制,比如只允许内网IP访问,或者加Basic认证。
- 定期校验包完整性:用
rpm -K校验RPM包签名,用sha256sum对比包的哈希值,确保没被篡改。
# 校验RPM包签名 rpm -K /var/www/html/repo/base/Packages/nginx-1.20.1-1.el7.x86_64.rpm # 生成包的哈希值 sha256sum /var/www/html/repo/base/Packages/nginx-1.20.1-1.el7.x86_64.rpm实操心得:内网仓库虽然相对安全,但也不能完全放松。我见过因为仓库服务器被入侵,导致所有客户端被植入恶意包的案例。GPG校验和权限控制这两道防线,能挡住大部分低级攻击。
5. 进阶玩法:自定义RPM包与私有仓库
5.1 用fpm快速打RPM包
有时候需要把自研工具或配置文件打包成RPM,方便通过Yum分发。用fpm(Effing Package Management)可以快速把目录、脚本、配置文件打成RPM包。
安装fpm:
yum install -y ruby ruby-devel rubygems gcc make rpm-build gem install fpm打包一个简单的脚本:
fpm -s dir -t rpm -n mytool -v 1.0.0 \ --description "My custom tool" \ --vendor "Internal" \ --license "MIT" \ -C /opt/mytool \ .这条命令会把/opt/mytool目录下的所有文件打包成mytool-1.0.0-1.x86_64.rpm。-s dir表示源类型是目录,-t rpm表示目标类型是RPM,-n是包名,-v是版本号,-C是切换到的目录。
打包完成后,把RPM放到仓库目录,执行createrepo --update,客户端就能通过yum install mytool安装了。
5.2 私有仓库的版本管理策略
私有仓库的包版本管理是个容易被忽视的问题。建议遵循几个原则:
- 版本号语义化:用
主版本.次版本.修订号的格式,比如1.2.3。主版本变更表示不兼容改动,次版本表示新增功能,修订号表示bug修复。 - 保留历史版本:不要只留最新版,至少保留最近三个版本,方便回滚。
- 变更日志记录:每个版本附一个
changelog,说明改了什么。可以用rpm --changelog查看。 - 测试后再发布:新包先在测试环境验证,确认没问题再同步到生产仓库。
# 查看包的变更日志 rpm -q --changelog mytool # 查看包的文件列表 rpm -ql mytool # 查看包的依赖 rpm -qR mytool5.3 仓库自动化同步脚本
手动同步仓库费时费力,写个脚本自动执行:
#!/bin/bash # repo-sync.sh - 自动同步远程仓库并更新元数据 REPO_DIR="/var/www/html/repo" LOG_FILE="/var/log/repo-sync.log" DATE=$(date "+%Y-%m-%d %H:%M:%S") echo "[$DATE] Starting repo sync..." >> $LOG_FILE # 同步base仓库 reposync -r base -p $REPO_DIR/base/ --newest-only >> $LOG_FILE 2>&1 if [ $? -eq 0 ]; then echo "[$DATE] base repo synced successfully" >> $LOG_FILE else echo "[$DATE] base repo sync failed" >> $LOG_FILE fi # 同步extras仓库 reposync -r extras -p $REPO_DIR/extras/ --newest-only >> $LOG_FILE 2>&1 # 更新元数据 createrepo --update $REPO_DIR/base/ >> $LOG_FILE 2>&1 createrepo --update $REPO_DIR/extras/ >> $LOG_FILE 2>&1 echo "[$DATE] Repo sync completed" >> $LOG_FILE把脚本加到crontab里,每周日凌晨执行:
0 2 * * 0 /opt/scripts/repo-sync.sh注意:
--newest-only只同步最新版本的包,能大幅减少同步时间和磁盘占用。但如果客户端需要旧版本,就得去掉这个参数做全量同步。建议根据实际需求选择。
6. 从Yum到DNF:新一代包管理器的演进
6.1 DNF与Yum的关系
CentOS 8之后,默认的包管理器从Yum换成了DNF(Dandified Yum)。DNF可以看作是Yum的下一代版本,底层依赖解析引擎换成了libsolv,速度更快,依赖解析更准确,内存占用也更低。
但DNF的命令行接口跟Yum几乎完全兼容——dnf install、dnf update、dnf search这些命令跟Yum用法一样。repo文件的格式也完全兼容,/etc/yum.repos.d/目录下的文件DNF照样能读。所以从Yum迁移到DNF,学习成本几乎为零。
CentOS 7及更早版本默认用Yum,CentOS 8及之后默认用DNF。但CentOS 7上也可以手动装DNF,体验新引擎带来的性能提升。
6.2 DNF的新特性与优势
DNF相比Yum有几个明显改进:
依赖解析更快更准:libsolv引擎用SAT求解器算法处理依赖关系,比Yum的老引擎快很多,尤其在依赖复杂的场景下优势明显。
支持模块化:DNF引入了模块(module)概念,同一个仓库里可以有多个版本的软件流(stream),用户可以选择启用哪个流。比如Node.js有10、12、14三个流,用户按需选择,不用手动切换仓库。
更好的事务处理:DNF在安装前会做完整的事务检查,如果发现冲突会提前报错,不会装到一半失败。还支持dnf history查看和回滚历史操作。
API更完善:DNF提供了Python API,方便写自动化脚本。Yum的API比较老旧,DNF的API更现代、更易用。
# DNF查看历史操作 dnf history # 回滚到指定事务 dnf history undo 5 # 查看可用模块 dnf module list # 启用指定模块流 dnf module enable nodejs:146.3 迁移注意事项
从Yum迁移到DNF时,有几个点需要注意:
- 插件兼容性:部分Yum插件在DNF下不可用,需要找对应的DNF版本。比如
yum-plugin-priorities对应dnf-plugin-priorities。 - 配置文件差异:DNF的主配置文件是
/etc/dnf/dnf.conf,但也会读取/etc/yum.conf和/etc/yum.repos.d/下的文件。迁移时建议把配置统一到DNF的目录下。 - 缓存目录不同:Yum缓存在
/var/cache/yum/,DNF缓存在/var/cache/dnf/。迁移后旧缓存可以清理掉。 - 命令别名:CentOS 8里
yum命令实际上是dnf的软链接,执行yum时实际调用的是DNF。所以不用改脚本,原来的Yum命令照样能用。
实操心得:如果是从CentOS 7迁移到CentOS 8,建议先在测试环境验证所有依赖Yum的脚本和自动化工具,确认兼容后再上生产。虽然命令兼容,但底层行为还是有差异,比如依赖解析结果可能不同,需要实际测试。
7. 个人实操经验与建议
7.1 仓库规划的几个原则
干了这么多年运维,在Yum仓库这件事上踩过的坑不少,总结几条实用原则:
仓库目录结构要清晰。按用途分目录,比如base、extras、updates、thirdparty,每个目录对应一个仓库。不要把所有包混在一个目录里,时间长了根本分不清哪个包来自哪里。
仓库命名要有意义。repo文件里的仓库ID用短横线分隔的描述性名称,比如local-base、local-extras,别用repo1、repo2。执行yum repolist时一眼就能看出每个仓库的用途。
版本控制要严格。私有仓库的包版本号必须规范,每次更新都要记录变更日志。我见过因为版本号乱写导致回滚时找不到正确版本的案例,教训很深刻。
定期备份仓库配置。/etc/yum.repos.d/目录和仓库的repodata目录建议定期备份。万一配置丢失或元数据损坏,能快速恢复。
7.2 性能优化的实际效果
在一个管理着50台服务器的内网环境里,我把远程仓库换成本地镜像仓库后,实测数据:
| 操作 | 远程仓库耗时 | 本地镜像仓库耗时 | 提升幅度 |
|---|---|---|---|
| yum makecache | 45秒 | 8秒 | 82% |
| yum install nginx | 32秒 | 12秒 | 62% |
| yum update(全量) | 8分钟 | 3分钟 | 62% |
| yum search | 5秒 | 1秒 | 80% |
本地镜像仓库的优势非常明显,尤其是makecache和search这类频繁操作,提升幅度都在80%左右。对于有大量服务器的环境,这个优化带来的时间节省非常可观。
7.3 给新手的入门建议
如果你是刚接触Linux运维的新手,在Yum仓库这块,我的建议是:
先学会用,再学配。先把yum install、yum search、yum info、yum remove这几个命令用熟,理解Yum的基本工作方式。然后再去研究repo文件怎么写、仓库怎么搭。
从本地仓库练手。搭本地仓库比网络仓库简单,不用配HTTP服务,不用管防火墙,一个file://路径就能搞定。练熟了再尝试网络仓库。
多查文档少猜。Yum和DNF的官方文档写得很详细,遇到问题先查文档,比在网上搜零散的答案靠谱得多。man yum、man dnf、man yum.conf这几个手册页值得反复看。
养成看日志的习惯。Yum的操作日志在/var/log/yum.log,DNF的在/var/log/dnf.log。安装失败时,日志里的信息比终端报错详细得多,能帮你快速定位问题。
别怕重装。Yum仓库配置错了,最坏的情况就是yum命令用不了。这时候用rpm手动装一个正确的yum包,或者从其他机器拷贝一份正确的repo文件,就能恢复。所以大胆试,试错了再改。
最后分享一个小技巧:如果yum命令突然变慢,先执行yum clean all && yum makecache,八成能解决问题。如果还慢,检查/etc/resolv.conf里的DNS配置,DNS解析慢也会拖累Yum。这个坑我踩过好几次,每次都是DNS的问题。