yum(Yellowdog Updater, Modified) 是 RHEL、CentOS、Fedora 等基于RPM的 Linux 发行版中最经典的软件包管理器。它基于 RPM 包 , 但能自动解决依赖关系、从远程仓库下载安装 , 极大简化了软件管理。
注:
RHEL 8/CentOS 8之后默认改用dnf(下一代包管理器) , 但yum命令在多数系统上仍作为dnf的软链接或兼容别名存在 , 用法基本一致。
YUM 不直接操作 RPM , 先下载仓库元数据到本地缓存 , 解析依赖关系 , 算出需要安装 / 删除哪些 RPM 包 , 再批量下载 RPM 包 , 最后调用 rpm 底层执行安装。
核心概念
yum仓库(repo) : 仓库是存放.rpm包及其元数据的服务器(HTTP/FTP/本地目录)。yum通过一个或多个仓库获取软件包。存放两类东西:
*.rpm: 软件包本身repodata: 仓库元数据(xml/sqlite数据库) , 记录每个包名、版本、架构、依赖关系、提供的文件、冲突信息。
repodata是YUM的灵魂 , 没有元数据yum无法自动解决依赖。客户端配置
/etc/yum.repos.d/*.repo: 定义仓库地址、是否启用、GPG校验。/etc/yum.conf: 全局配置(缓存、日志、keepcache等)本地缓存
路径 :
/var/cache/yum/$basearch/$releasever/缓存内容 : 仓库元数据 +(可选)已经下载好的
rpm包(keepcache=1才保留)RPM底层程序yum最终调用系统rpm命令完成包写入数据库、文件部署。yum本身不实现文件安装逻辑。
1. 仓库配置
/etc/yum.conf:yum全局主配置文件 ,[main]段 , 所有仓库共用的默认参数。/etc/yum.repos.d/:仓库配置目录 , 所有以.repo结尾的文件会被 yum 加载。可以有多个
.repo文件 ; 单个.repo文件内可以写多个仓库[repoid]备份时后缀改为
.bak, yum 自动忽略 , 不会加载。
/var/cache/yum/:yum缓存目录 , 存放仓库元数据(repodata)和下载的rpm包。/var/log/yum.log: yum 操作日志
1.1 全局配置文件
全局配置文件:/etc/yum.conf
[main]
cachedir=/var/cache/yum/$basearch/$releasever
keepcache=0
debuglevel=2
logfile=/var/log/yum.log
exactarch=1
obsoletes=1
gpgcheck=1
plugins=1
installonly_limit=5参数解释 :
1.2 .repo 仓库配置文件详解
单个仓库段配置模板:
[base]
name=CentOS-$releasever - Base
baseurl=https://mirrors.aliyun.com/centos/$releasever/os/$basearch/
#mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=os
enabled=1
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7逐行参数分析 :
[repoid]: 仓库ID, 本机必须唯一 , 不能有空格、中文。yum内部识别标识 ,yum repolist可以看到。name仓库描述名称 , 仅展示作用 , 随便写 , 无功能影响。支持yum内置变量。baseurl仓库核心地址 ,rpm包所在位置 , 和mirrorlist二选一 , 不能同时启用。 支持三种协议 :http:///https://: 互联网远程源(阿里云、清华源)file://: 本地目录(离线自建源 , 格式file:///data/rpms, 三个斜杠)ftp://:ftp服务器源(极少使用)
需要注意
baseurl指向yum仓库的根目录, 这个根目录必须要直接包含repodata/repomd.xmlmirrorlist镜像列表地址 , 访问该地址返回一堆baseurl,yum自动挑选可用镜像。CentOS官方源默认使用 ; 国内镜像源一般注释掉 , 改用baseurl固定地址。enabled是否启用当前仓库段 :1启用,0禁用。默认 1。enabled=0仓库不会自动加载 , 但可以在命令行用--enablerepo临时启用。gpgcheck: 是否校验RPM包 ~数字签名 , 防止包被篡改:1: 开启校验 , 必须配置gpgkey0: 关闭校验(内网离线源常用 , 不推荐公网源)
gpgkey:GPG公钥地址 , 可以是http/https, 也可以本地文件file:///etc/pki/rpm-gpg/xxx。gpgcheck=1时必填。
扩展高级参数(生产常用)
exclude=kernel* mysql*
includepkgs=nginx*
cost=50exclude: 黑名单。该仓库不提供匹配的包 , 常用于禁止内核自动升级。多个包用空格分隔。includepkgs: 白名单。仅允许匹配包从该仓库获取 , 其他包不走此源。cost: 仓库优先级 , 原生自带 , 无需插件。默认值100;数字越小优先级越高。当多个仓库存在同名同版本包 ,
yum优先选择cost小的仓库。priority=1是yum-plugin-priorities插件的优先级 ,1最高 , 需要额外安装插件 , 不建议和cost混用。
其他参数 :
failovermethod={roundrobin|priority}: 故障转移方式:roundrobin, 意为随机挑选 , 默认值 ;priority, 按顺序访问。priority=: 仓库优先级(需要安装yum-plugin-priorities)数字越小优先级越高 ,1最高 ,99最低。sslverify=: https 源是否校验证书 ,1校验 ,0不校验(自建https源证书不信任时用)
内置变量(yum自动替换)
$releasever: 系统版本号 ,CentOS7就是7$basearch: 系统架构 ,x86_64/aarch64$arch: 完整架构,i386,i486,i586,x86_64等YUM9: 自定义环境变量
1.3 命令行管理仓库
yum-config-manager 是 YUM(Yellowdog Updater Modified)包管理器的辅助工具 , 主要用于管理 YUM 仓库(repository)配置和 yum 配置选项。它来自 yum-utils 软件包(注意 : dnf 环境下对应的是 dnf config-manager , 来自 dnf-plugins-core)
语法 :
yum-config-manager [options] [section ...]选项 :
--save: 保存本次修改到repo文件 ; 配合--setopt使用 ,写入磁盘永久生效--enable REPOID: 启用指定仓库 , 自动保存(等价修改enabled=1)--disable REPOID: 禁用指定仓库 , 自动保存(等价修改enabled=0)--add-repo=URL/PATH: 添加并自动启用仓库 , 支持远程repo url或本地repo文件。(自动在/etc/yum.repos.d/下生成.repo文件)
示例
# 启用epel仓库
yum-config-manager --enable epel
# 禁用epel仓库
yum-config-manager --disable epel
# 添加阿里CentOS7源
yum-config-manager --add-repo https://mirrors.aliyun.com/repo/Centos-7.repo
# 修改epel的baseurl并保存
yum-config-manager --save --setopt=epel.baseurl=https://mirrors.aliyun.com/epel/7/$basearch
# 查看epel仓库全部配置
yum-config-manager epel
yum-config-manager --help 命令可以看到两部分 : Yum Base Options; yum-config-manager options
Yum Base Options: # yum主程序通用参数(yum-config-manager只是继承显示)
....
--downloadonly
--downloaddir
...
yum-config-manager options: # 这个才是 yum-config-manager 原生支持的参数
--save
--enable
--disable
--add-repoyum-config-manager 是 yum-utils 里基于 yum 库开发的工具 , 它会加载 yum 所有基础参数和插件 , 所以help输出会把全部 Yum Base Options 一并打印出来。
这些Yum Base Options通用参数 : --enablerepo/--disablerepo/--downloadonly/--downloaddir , 是给 yum install/yum update 这类包安装子命令用的 , 不是给yum-config-manager命令使用。
有用的 Yum Base Options 搭配 yum-config-manager 的示例
# 安静模式查看epel仓库配置
yum-config-manager -q epel
# 指定自定义yum配置文件查看仓库
yum-config-manager -c /etc/yum/myyum.conf epel
# 临时禁用base仓库 , 查看epel仓库配置(本次命令生效)
yum-config-manager --disablerepo=base epel
# 禁用所有插件 , 查看仓库配置
yum-config-manager --noplugins epel
以下示例为 Yum Base Options中不能生效的参数
# 不会下载任何rpm!只会打印epel仓库配置
yum-config-manager --downloadonly --downloaddir=/tmp epel在Yum Base Options的通用参数中, --setopts参数配合--save算比较常用的。 --setopts参数使用: --setopt=REPOID.配置项=值
# 修改epel仓库gpgcheck=0
yum-config-manager --save --setopt=epel.gpgcheck=0
# 修改epel仓库name描述
yum-config-manager --save --setopt=epel.name=EPEL7-Mirror
# 修改全局main段配置 /etc/yum.conf
yum-config-manager --save --setopt=main.keepcache=1
2 . yum 命令
基础语法 :
yum [options] [command] [package ...]options: 全局选项(-y、-q、--enablerepo、--disablerepo、--downloadonly)command:yum子命令(install/remove/update/repolist等)package: 包名 , 支持版本nginx-1.20.1、通配符nginx*
2.1 全局选项
全局选项(Options) : 作用于整条 yum 命令 , 临时生效 , 不会修改 /etc/yum.conf 和 .repo 文件 ; 放在 yum 之后、子命令(install/repolist 等)之前。
部分选项由插件提供(如--downloadonly需要yum-plugin-downloadonly)
基础交互于输出控制
配置文件与环境控制
仓库临时开关
临时生效 , 仅当前这条
yum命令 , 不修改repo文件 ; 永久启用 / 禁用仓库用yum-config-manager --enable / --disable
包过滤、排除规则
GPG 签名、插件控制
依赖与事务控制
缓存相关
下载插件参数(yum-plugin-downloadonly)
插件参数 , 仅搭配
install/reinstall/update子命令生效! 单独repolist/info无效 ;yum-config-manager使用该参数无下载效果
安全更新筛选参数(update 专用)
2.2. yum子命令
子命令是 yum 的核心动作 , 分为五大类 : 仓库查询、包查询、包安装 / 更新 / 卸载、缓存管理、事务与辅助工具
说明 : 部分子命令在 CentOS8+ dnf 中保留 , 少数改名 ; yum-utils 是独立工具包 , 不属于 yum 原生子命令。
2.2.1 仓库相关子命令
repolist:yum repolist [enabled|disabled|all]yum repolist: 默认 , 列出已启用仓库 , 显示仓库 ID、名称、可用包数量yum repolist enabled: 同上 , 显式指定启用仓库yum repolist disabled: 列出被禁用的仓库yum repolist all: 列出全部仓库(启用 + 禁用)
2.2.2 软件包查询
list:yum list [installed|available|updates|extras|obsolete|all]yum list: 列出所有包(已安装 + 仓库可用)yum list installed: 列出本机已经安装的所有rpm包yum list available: 列出仓库内可安装的包yum list updates: 列出本机可以升级的包yum list extras: 列出本机已安装 , 但不在任何yum仓库中的包(本地手动rpm安装)yum list obsolete: 列出会被新版本软件废弃替换的包支持过滤 :
yum list installed | grep nginx
info: 查看软件包详细信息 , 版本、发布者、仓库、大小、描述、依赖。类似rpm -qi, 但是可以查看仓库里未安装的包。yum info nginxsearch: 按包名、包描述搜索仓库软件包 , 适合模糊查找软件。yum search nginx yum search "web server"provides(等价whatprovides) : 查询某个文件 / 命令属于哪个rpm包。服务器缺少某个命令 , 不知道装哪个包 , 用这个查。yum provides /usr/bin/nginx yum whatprovides /usr/bin/nginxdeplist: 查看一个软件包所有依赖 , 以及每个依赖来自哪个仓库。yum deplist nginxgrouplist/groupinfo:yum grouplist yum groupinfo "Development Tools"grouplist: 列出所有软件包组(例如开发工具、GNOME 桌面)groupinfo: 查看某个包组内包含哪些软件
2.2.3 安装、更新、卸载
install: 安装软件包 , 自动解析并安装依赖。yum install nginx yum install nginx-1.20.1 yum install /tmp/nginx.rpm如果包已经安装 , 不会执行任何动作 ; 搭配
--downloadonly时 ,不会下载依赖包。需要使用reinstallreinstall: 重新安装已存在的软件包 , 覆盖现有文件 , 强制重新解析全部依赖。yum reinstall nginxupdate: 升级软件包到仓库最新版本 , 不带包名代表全系统更新yum update yum update nginx yum update --exclude=kernel*--exclude全局选项 , 升级时排除指定包(常见排除kernel)downgrade: 软件包版本降级 , 将已安装包降低到仓库里的旧版本 ,自动处理依赖。# 自动降级到仓库中可用的低版本(自动匹配版本 , 处理依赖) yum downgrade nginx # 指定降级到某个具体版本(推荐 , 可控) yum downgrade nginx-1.18.0-1.el7`
check-update: 只检查 , 不升级 , 列出所有可更新的包。脚本巡检常用 ; 有可更新包返回非0退出码。yum check-updateremove(别名erase) : 卸载软件包 , 同时卸载当初因这个包安装的依赖。yum remove nginx yum erase nginx被其他软件依赖的包不会被删除 , 防止破坏系统。
localinstall: 安装本地磁盘上的rpm文件 , 自动从yum仓库下载解决依赖。yum localinstall /tmp/nginx.rpmCentOS8 dnf中localinstall合并进install, 直接dnf install xxx.rpm。groupinstall/groupremove/groupupdateyum groupinstall "Development Tools" yum groupremove "Development Tools" yum groupupdate "Development Tools"groupinstall: 安装一组软件包(例如开发工具组gcc、make等一次性安装)groupremove: 卸载软件包组groupupdate: 升级包组内所有软件
2.2.4 缓存管理子命令
cleanyum clean [all|metadata|packages|expire-cache]yum clean all: 清理元数据缓存 + 已经下载的rpm包 , 换源 / 修改仓库后最常用yum clean metadata: 只清理仓库元数据(仓库包信息) , 保留已经下载好的rpmyum clean packages: 只清理缓存目录里下载完成的rpm包 , 保留元数据yum clean expire-cache: 标记元数据过期 ,下次yum操作自动重新拉取
makecache: 联网下载所有启用仓库的元数据 , 生成本地缓存。yum makecache yum makecache fast修改
repo、新增仓库、换镜像源后 , 必须执行yum clean all && yum makecache。makecache fast:CentOS7简写 , 快速构建缓存。
2.2.5 事务历史与排错类子命令
historyyum history yum history info 10 yum history undo 10 yum history redo 10yum会记录每一次安装 / 卸载 / 更新事务 , 带事务ID。yum history: 列出所有yum操作记录 ,ID、操作、时间yum history info ID: 查看这条事务详细安装 / 卸载了哪些包yum history undo ID: 回滚这条yum事务 , 撤销操作(安装→卸载 , 卸载→安装)yum history redo ID: 重新执行这条事务

使用
yum history之后显示所有的安装 , 卸载过程 , 按照图片中序号进行的 ,undo/redo命令涉及到的序号则是history中ID值
2.2.6 辅助子命令
shell: 进入yum交互式shell, 可以批量执行多个yum操作(一次性多个install/remove, 作为同一个事务)。yum shell示例
# yum shell > install nginx > install redis > run
3. yum仓库自建
yum仓库自建的思路在于将互联网中的rpm包直接下载至本地, 然后通过createrepo命令生成对应的元数据信息。之后通过httpd或者nginx将本地库共享出去即可。
工作流程 :
reposync读取本地.repo文件中对应仓库的baseurl, 拉取远程repomd.xml元数据 ;解析元数据 , 获取仓库内所有
rpm包的下载地址 ;根据参数过滤包(
--newest-only、--arch等) ;下载
rpm包到本地目录 ;默认不会生成
repodata(除非加--download-metadata);下载结束 , 手动
createrepo生成本地元数据。
3.1. rsyncrepo
reposync : yum/dnf 仓库同步工具 , 作用是把远程 YUM 仓库的 RPM 包下载到本地 , 本身不生成 repodata 元数据 , 下载完包后需要配合 createrepo 生成元数据才能作为本地仓库使用。 版本区分:
CentOS7: 属于yum-utils包 , 命令 :reposyncCentOS8/9/Rocky: 属于dnf-plugins-core, 命令 :dnf reposync(新版是dnf子命令)
安装
# CentOS7
yum install -y yum-utils createrepo
# CentOS8+/Rocky/AlmaLinux
dnf install -y dnf-plugins-core createrepo
语法
# CentOS7 reposync [选项] # CentOS8+ dnf reposync [选项]选项
生产推荐完整同步命令:
reposync -r base -p /data/mirror --newest-only --delete --downloadcomps同步完成后生成元数据:
createrepo -g /data/mirror/base/comps.xml /data/mirror/base--download-metadata 重点说明 : 直接拉取远程仓库现成的 repodata , 不需要本地执行 createrepo
reposync -r base -p /data/mirror --download-metadata--download-metadata优点:省去
createrepo构建元数据步骤 ;comps.xml、元数据校验信息和远程仓库完全一致。
--download-metadata缺点 :远程
repodata是针对远程仓库文件列表生成 ; 如果本地包不全 , 直接使用会出现元数据和本地包不匹配 ;远程仓库
GPG签名、元数据哈希校验严格 , 内网使用时容易报校验失败 ;
一旦本地手动增删
rpm包 , 下载来的repodata就失效 , 必须重新createrepo。
👉 使用场景 : 完整镜像、包不做任何修改 ; 如果后续本地要增删
rpm包 , 不要使用该参数。
3.2 createrepo
createrepo 用于生成 YUM 仓库的元数据(metadata) , 让目录中的 RPM 包能被 yum 识别和使用。简单说 : 把一堆 RPM 文件变成一个可用的 YUM 仓库。
RPM 文件本身只是一堆二进制包 , yum 无法直接识别目录中有哪些包、版本多少、依赖关系如何。createrepo 会扫描目录中的所有 RPM , 生成元数据索引文件 , 之后就可以通过 baseurl=file:///目录 或 HTTP 方式作为仓库使用。
安装
# CentOS7
yum install -y createrepo
# CentOS8+/Rocky/AlmaLinux
dnf install -y createrepo_c语法 :
createrepo [OPTIONS] <仓库根目录>后面跟的是仓库根目录 , 不是
Packages目录! 工具会扫描这个目录下所有.rpm文件(包括子目录Packages里的rpm) , 然后在当前仓库根目录下生成repodata/常用参数
示例
新建仓库, 带软件组支持
createrepo -g /data/mirror/base/comps.xml /data/mirror/base新增 rpm 包后增量更新(生产最常用)
createrepo --update /data/mirror/base大仓库 , 4 线程扫描 , 指定sha256 校验
createrepo --workers 4 --checksum sha256 /data/mirror/base