YUM/DNF 包管理器
核心知识点
1. YUM 包管理器
1.1 YUM 概述
YUM(Yellowdog Updater, Modified)是一个基于 RPM 的包管理工具,主要用于 Red Hat、CentOS、Fedora 等发行版。它提供了自动依赖解析、软件包管理等功能,简化了软件的安装、更新和卸载过程。
YUM 的特点:
| 特点 | 描述 |
|---|---|
| 自动依赖解析 | 自动解决软件包依赖关系 |
| 仓库管理 | 支持多个软件仓库 |
| 事务处理 | 支持事务回滚,确保操作原子性 |
| 插件系统 | 可通过插件扩展功能 |
| 命令简洁 | 提供直观的命令接口 |
1.2 YUM 命令
# 安装软件包
yum install package
# 安装多个软件包
yum install package1 package2
# 安装指定版本的软件包
yum install package-1.0
# 更新软件包
yum update package
# 更新所有软件包
yum update
# 检查更新
yum check-update
# 卸载软件包
yum remove package
# 搜索软件包
yum search package
# 查看软件包信息
yum info package
# 列出已安装的软件包
yum list installed
# 列出可安装的软件包
yum list available
# 查看软件包的依赖关系
yum deplist package
# 清理缓存
yum clean all
# 重建缓存
yum makecache
# 查看事务历史
yum history
# 撤销事务
yum history undo <transaction-id>
# 查看组信息
yum group list
# 安装软件组
yum group install "Development Tools"
# 卸载软件组
yum group remove "Development Tools"1.3 YUM 配置
YUM 配置文件:
| 配置文件 | 描述 |
|---|---|
/etc/yum.conf |
主配置文件 |
/etc/yum.repos.d/ |
仓库配置目录 |
/etc/yum/pluginconf.d/ |
插件配置目录 |
主配置文件示例 (/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
bugtracker_url=http://bugs.centos.org/set_project.php?project_id=23&ref=http://bugs.centos.org/bug_report_page.php?category=yum
distroverpkg=centos-release仓库配置文件示例 (/etc/yum.repos.d/CentOS-Base.repo):
[base]
name=CentOS-$releasever - Base
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=os&infra=$infra
baseurl=http://mirror.centos.org/centos/$releasever/os/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
[updates]
name=CentOS-$releasever - Updates
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=updates&infra=$infra
baseurl=http://mirror.centos.org/centos/$releasever/updates/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
[extras]
name=CentOS-$releasever - Extras
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=extras&infra=$infra
baseurl=http://mirror.centos.org/centos/$releasever/extras/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
[centosplus]
name=CentOS-$releasever - Plus
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=centosplus&infra=$infra
baseurl=http://mirror.centos.org/centos/$releasever/centosplus/$basearch/
gpgcheck=1
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-71.4 YUM 插件
常用 YUM 插件:
| 插件 | 描述 | 命令 |
|---|---|---|
| fastestmirror | 选择最快的镜像源 | yum install yum-plugin-fastestmirror |
| priorities | 管理仓库优先级 | yum install yum-plugin-priorities |
| protectbase | 保护基础仓库 | yum install yum-plugin-protectbase |
| versionlock | 锁定软件包版本 | yum install yum-plugin-versionlock |
| changelog | 查看软件包变更日志 | yum install yum-plugin-changelog |
插件配置示例 (/etc/yum/pluginconf.d/priorities.conf):
[main]
enabled=1
verbose=02. DNF 包管理器
2.1 DNF 概述
DNF(Dandified YUM)是 YUM 的继任者,于 Fedora 22 中首次引入,后来被 CentOS 8、RHEL 8 等发行版采用。DNF 解决了 YUM 的一些缺点,如内存使用过高、依赖解析速度慢等问题。
DNF 的优势:
| 优势 | 描述 |
|---|---|
| 更快的依赖解析 | 使用 libsolv 库,依赖解析速度更快 |
| 更低的内存占用 | 相比 YUM,内存使用显著降低 |
| 更好的性能 | 整体性能优于 YUM |
| 现代化的代码库 | 使用 Python 3 重写,代码更清晰 |
| 保持兼容性 | 命令接口与 YUM 兼容 |
2.2 DNF 命令
# 安装软件包
dnf install package
# 安装多个软件包
dnf install package1 package2
# 安装指定版本的软件包
dnf install package-1.0
# 更新软件包
dnf update package
# 更新所有软件包
dnf update
# 检查更新
dnf check-update
# 卸载软件包
dnf remove package
# 搜索软件包
dnf search package
# 查看软件包信息
dnf info package
# 列出已安装的软件包
dnf list installed
# 列出可安装的软件包
dnf list available
# 查看软件包的依赖关系
dnf repoquery --requires package
# 清理缓存
dnf clean all
# 重建缓存
dnf makecache
# 查看事务历史
dnf history
# 撤销事务
dnf history undo <transaction-id>
# 查看组信息
dnf group list
# 安装软件组
dnf group install "Development Tools"
# 卸载软件组
dnf group remove "Development Tools"
# 查看仓库信息
dnf repolist
# 启用仓库
dnf config-manager --enable repo
# 禁用仓库
dnf config-manager --disable repo2.3 DNF 配置
DNF 配置文件:
| 配置文件 | 描述 |
|---|---|
/etc/dnf/dnf.conf |
主配置文件 |
/etc/yum.repos.d/ |
仓库配置目录 |
/etc/dnf/plugins/ |
插件配置目录 |
主配置文件示例 (/etc/dnf/dnf.conf):
[main]
gpgcheck=1
installonly_limit=3
clean_requirements_on_remove=True
best=False
skip_if_unavailable=True仓库配置文件示例 (/etc/yum.repos.d/fedora.repo):
[fedora]
name=Fedora $releasever - $basearch
metalink=https://mirrors.fedoraproject.org/metalink?repo=fedora-$releasever&arch=$basearch&infra=$infra&content=$contentdir
enabled=1
metadata_expire=7d
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-fedora-$releasever-$basearch
skip_if_unavailable=False
[fedora-debuginfo]
name=Fedora $releasever - $basearch - Debug
metalink=https://mirrors.fedoraproject.org/metalink?repo=fedora-debug-$releasever&arch=$basearch&infra=$infra&content=$contentdir
enabled=0
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-fedora-$releasever-$basearch
skip_if_unavailable=False
[fedora-source]
name=Fedora $releasever - Source
metalink=https://mirrors.fedoraproject.org/metalink?repo=fedora-source-$releasever&arch=$basearch&infra=$infra&content=$contentdir
enabled=0
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-fedora-$releasever-$basearch
skip_if_unavailable=False2.4 DNF 插件
常用 DNF 插件:
| 插件 | 描述 | 命令 |
|---|---|---|
| fastestmirror | 选择最快的镜像源 | dnf install dnf-plugins-core |
| priorities | 管理仓库优先级 | dnf install libdnf-plugin-priorities |
| versionlock | 锁定软件包版本 | dnf install python3-dnf-plugin-versionlock |
| builddep | 安装构建依赖 | dnf install dnf-plugins-core |
| copr | 管理 COPR 仓库 | dnf install dnf-plugins-core |
插件配置示例 (/etc/dnf/plugins/versionlock.conf):
[main]
enabled=13. 仓库管理
3.1 官方仓库
CentOS/RHEL 官方仓库:
| 仓库 | 描述 |
|---|---|
| BaseOS | 提供核心操作系统组件 |
| AppStream | 提供应用程序流 |
| Extras | 提供额外的软件包 |
| PowerTools | 提供开发工具和库(CentOS 8) |
| CRB | CodeReady Builder,提供开发工具和库(RHEL 8+) |
Fedora 官方仓库:
| 仓库 | 描述 |
|---|---|
| fedora | 主仓库 |
| updates | 更新仓库 |
| updates-testing | 测试更新仓库 |
| rpmfusion-free | RPM Fusion 自由软件仓库 |
| rpmfusion-nonfree | RPM Fusion 非自由软件仓库 |
3.2 第三方仓库
常用第三方仓库:
| 仓库 | 描述 | 安装命令 |
|---|---|---|
| EPEL | Extra Packages for Enterprise Linux | yum install epel-release |
| RPM Fusion | 提供额外的多媒体和软件 | yum install https://download1.rpmfusion.org/free/el/rpmfusion-free-release-7.noarch.rpm |
| ELRepo | 提供硬件相关的驱动和工具 | rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org && rpm -Uvh https://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm |
| IUS | 提供更新版本的软件包 | yum install https://repo.ius.io/ius-release-el7.rpm |
| Remi | 提供 PHP、MySQL 等软件的更新版本 | yum install https://rpms.remirepo.net/enterprise/remi-release-7.rpm |
第三方仓库配置示例 (/etc/yum.repos.d/epel.repo):
[epel]
name=Extra Packages for Enterprise Linux 7 - $basearch
baseurl=http://download.fedoraproject.org/pub/epel/7/$basearch
metalink=https://mirrors.fedoraproject.org/metalink?repo=epel-7&arch=$basearch
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-73.3 本地仓库
创建本地仓库:
# 1. 安装 createrepo 工具
yum install createrepo
# 2. 创建仓库目录
mkdir -p /var/www/html/repo
# 3. 复制 RPM 包到仓库目录
cp *.rpm /var/www/html/repo/
# 4. 初始化仓库
createrepo /var/www/html/repo/
# 5. 更新仓库
createrepo --update /var/www/html/repo/
# 6. 配置本地仓库文件
cat > /etc/yum.repos.d/local.repo << EOF
[local]
name=Local Repository
baseurl=file:///var/www/html/repo/
enabled=1
gpgcheck=0
EOF
# 7. 清理缓存并重建
yum clean all
yum makecache使用 HTTP 服务提供仓库:
# 1. 安装 HTTP 服务
yum install httpd
# 2. 启动并启用 HTTP 服务
systemctl start httpd
systemctl enable httpd
# 3. 配置防火墙
firewall-cmd --add-service=http --permanent
firewall-cmd --reload
# 4. 其他机器配置仓库
cat > /etc/yum.repos.d/remote.repo << EOF
[remote]
name=Remote Repository
baseurl=http://server-ip/repo/
enabled=1
gpgcheck=0
EOF4. 依赖管理
4.1 依赖解析
依赖类型:
| 依赖类型 | 描述 | 示例 |
|---|---|---|
| 运行时依赖 | 软件运行时需要的依赖 | Requires: python >= 3.6 |
| 构建依赖 | 软件构建时需要的依赖 | BuildRequires: gcc |
| 冲突 | 与其他软件包冲突 | Conflicts: old-package |
| 替换 | 替换其他软件包 | Obsoletes: old-package |
依赖解析过程:
- 分析请求:分析用户请求的软件包
- 检查依赖:检查软件包的依赖关系
- 递归解析:递归解析所有依赖项
- 解决冲突:解决依赖冲突
- 生成事务:生成安装/更新事务
4.2 依赖问题解决
常见依赖问题:
| 问题 | 原因 | 解决方法 |
|---|---|---|
| 依赖缺失 | 依赖包不存在或版本不匹配 | 启用正确的仓库,安装缺失的依赖 |
| 版本冲突 | 不同软件需要不同版本的依赖 | 使用模块流,或选择兼容的版本 |
| 架构冲突 | 软件包架构与系统不匹配 | 安装正确架构的软件包 |
| 循环依赖 | 软件包之间相互依赖 | 同时安装所有循环依赖的软件包 |
解决依赖问题的命令:
# 清理并重建缓存
yum clean all
yum makecache
# 检查依赖关系
yum deplist package
# 尝试修复依赖
yum install -f
# 使用 --skip-broken 跳过损坏的依赖
yum update --skip-broken
# 查看详细的依赖信息
yum info package5. 事务管理
5.1 事务概念
事务是指一组原子性的操作,要么全部成功,要么全部失败。YUM/DNF 使用事务管理来确保软件包操作的一致性和可靠性。
事务的特点:
| 特点 | 描述 |
|---|---|
| 原子性 | 事务要么全部成功,要么全部失败 |
| 一致性 | 事务执行前后系统状态一致 |
| 隔离性 | 事务之间相互隔离,不影响 |
| 持久性 | 事务成功后,结果持久保存 |
5.2 事务操作
事务管理命令:
# 查看事务历史
yum history
# 或
dnf history
# 查看特定事务的详细信息
yum history info <transaction-id>
# 或
dnf history info <transaction-id>
# 撤销事务
yum history undo <transaction-id>
# 或
dnf history undo <transaction-id>
# 重做事务
yum history redo <transaction-id>
# 或
dnf history redo <transaction-id>
# 查看事务中执行的命令
yum history list all
# 或
dnf history list all事务回滚示例:
# 1. 查看事务历史
[root@server ~]# yum history
ID | Command line | Date and time | Action(s) | Altered
-------------------------------------------------------------------------------
5 | install httpd | 2023-06-01 10:00 | Install | 5
4 | update | 2023-05-30 15:30 | Update | 12
3 | install mysql | 2023-05-25 09:15 | Install | 8
2 | install php | 2023-05-20 14:45 | Install | 6
1 | | 2023-05-15 08:00 | Install | 150
# 2. 撤销事务 5(安装 httpd)
[root@server ~]# yum history undo 5
# 3. 确认撤销结果
[root@server ~]# yum history
ID | Command line | Date and time | Action(s) | Altered
-------------------------------------------------------------------------------
6 | history undo 5 | 2023-06-01 10:10 | Erase | 5
5 | install httpd | 2023-06-01 10:00 | Install | 5
4 | update | 2023-05-30 15:30 | Update | 12
3 | install mysql | 2023-05-25 09:15 | Install | 8
2 | install php | 2023-05-20 14:45 | Install | 6
1 | | 2023-05-15 08:00 | Install | 150实用案例分析
案例 1:配置国内镜像源
场景描述
默认的官方镜像源速度较慢,需要配置国内镜像源以提高下载速度。
配置步骤
CentOS 7:
# 1. 备份原配置
mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
# 2. 下载国内镜像源配置
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
# 3. 清理缓存并重建
yum clean all
yum makecache
# 4. 验证配置
yum repolistCentOS 8:
# 1. 备份原配置
mv /etc/yum.repos.d/CentOS-Linux-BaseOS.repo /etc/yum.repos.d/CentOS-Linux-BaseOS.repo.backup
mv /etc/yum.repos.d/CentOS-Linux-AppStream.repo /etc/yum.repos.d/CentOS-Linux-AppStream.repo.backup
# 2. 下载国内镜像源配置
wget -O /etc/yum.repos.d/CentOS-Linux-BaseOS.repo http://mirrors.aliyun.com/repo/Centos-8.repo
# 3. 修改配置文件
sed -i 's/$releasever/8-stream/g' /etc/yum.repos.d/CentOS-Linux-BaseOS.repo
# 4. 清理缓存并重建
dnf clean all
dnf makecache
# 5. 验证配置
dnf repolistFedora:
# 1. 修改 DNF 配置,添加 fastestmirror 插件
cat >> /etc/dnf/dnf.conf << EOF
fastestmirror=True
EOF
# 2. 清理缓存并重建
dnf clean all
dnf makecache
# 3. 验证配置
dnf repolist案例 2:锁定软件包版本
场景描述
需要锁定特定软件包的版本,防止其被意外更新。
配置步骤
使用 YUM versionlock 插件:
# 1. 安装 versionlock 插件
yum install yum-plugin-versionlock
# 2. 锁定软件包版本
yum versionlock add package
# 3. 查看已锁定的软件包
yum versionlock list
# 4. 解锁软件包
yum versionlock delete package
# 5. 解锁所有软件包
yum versionlock clear使用 DNF versionlock 插件:
# 1. 安装 versionlock 插件
dnf install python3-dnf-plugin-versionlock
# 2. 锁定软件包版本
dnf versionlock add package
# 3. 查看已锁定的软件包
dnf versionlock list
# 4. 解锁软件包
dnf versionlock delete package
# 5. 解锁所有软件包
dnf versionlock clear案例 3:使用 COPR 仓库
场景描述
需要安装官方仓库中没有的软件包,可以使用 COPR(Cool Other Package Repositories)仓库。
配置步骤
# 1. 安装 COPR 插件
dnf install dnf-plugins-core
# 2. 启用 COPR 仓库
dnf copr enable user/repo
# 3. 安装软件包
dnf install package
# 4. 查看已启用的 COPR 仓库
dnf copr list
# 5. 禁用 COPR 仓库
dnf copr disable user/repo示例:安装最新版本的 Vim:
# 1. 启用 Vim COPR 仓库
dnf copr enable agriffis/neovim-nightly
# 2. 安装 Neovim
dnf install neovim
# 3. 验证安装
nvim --version最佳实践
使用官方仓库:优先使用发行版官方仓库,保证软件的安全性和稳定性。
合理配置仓库:根据需要配置合适的仓库,避免过多的第三方仓库导致依赖冲突。
定期更新:定期更新系统和软件包,获取安全补丁和新功能。
使用国内镜像:配置国内镜像源,提高下载速度。
备份配置:在修改配置文件前,先备份原配置。
锁定关键软件:对于关键软件,使用版本锁定功能防止意外更新。
清理缓存:定期清理缓存,减少磁盘空间占用。
检查依赖:安装软件前,检查其依赖关系,避免依赖冲突。
使用事务历史:利用事务历史功能,在出现问题时可以快速回滚。
学习 DNF:对于新发行版,建议学习使用 DNF,它是 YUM 的继任者,性能更好。
总结
本教程详细介绍了 YUM 和 DNF 包管理器的使用方法、配置和最佳实践。通过实际案例,我们学习了如何配置国内镜像源、锁定软件包版本、使用 COPR 仓库等实用技巧。掌握这些知识后,可以更加高效地管理 Linux 系统中的软件包,保证系统的稳定性和安全性。
YUM 和 DNF 是 RPM 包管理系统的核心工具,它们简化了软件的安装、更新和卸载过程,自动处理依赖关系,为用户提供了便捷的软件管理体验。随着 DNF 的逐渐普及,它将成为未来主要的包管理工具,但 YUM 在一些旧版本的系统中仍然广泛使用。因此,掌握这两个工具的使用方法,对于 Linux 系统管理员来说是非常重要的。