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-7

1.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=0

2. 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 repo

2.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=False

2.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=1

3. 仓库管理

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 &amp;&amp; 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-7

3.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
EOF

4. 依赖管理

4.1 依赖解析

依赖类型:

依赖类型 描述 示例
运行时依赖 软件运行时需要的依赖 Requires: python &gt;= 3.6
构建依赖 软件构建时需要的依赖 BuildRequires: gcc
冲突 与其他软件包冲突 Conflicts: old-package
替换 替换其他软件包 Obsoletes: old-package

依赖解析过程:

  1. 分析请求:分析用户请求的软件包
  2. 检查依赖:检查软件包的依赖关系
  3. 递归解析:递归解析所有依赖项
  4. 解决冲突:解决依赖冲突
  5. 生成事务:生成安装/更新事务

4.2 依赖问题解决

常见依赖问题:

问题 原因 解决方法
依赖缺失 依赖包不存在或版本不匹配 启用正确的仓库,安装缺失的依赖
版本冲突 不同软件需要不同版本的依赖 使用模块流,或选择兼容的版本
架构冲突 软件包架构与系统不匹配 安装正确架构的软件包
循环依赖 软件包之间相互依赖 同时安装所有循环依赖的软件包

解决依赖问题的命令:

# 清理并重建缓存
yum clean all
yum makecache

# 检查依赖关系
yum deplist package

# 尝试修复依赖
yum install -f

# 使用 --skip-broken 跳过损坏的依赖
yum update --skip-broken

# 查看详细的依赖信息
yum info package

5. 事务管理

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 repolist

CentOS 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 repolist

Fedora:

# 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

最佳实践

  1. 使用官方仓库:优先使用发行版官方仓库,保证软件的安全性和稳定性。

  2. 合理配置仓库:根据需要配置合适的仓库,避免过多的第三方仓库导致依赖冲突。

  3. 定期更新:定期更新系统和软件包,获取安全补丁和新功能。

  4. 使用国内镜像:配置国内镜像源,提高下载速度。

  5. 备份配置:在修改配置文件前,先备份原配置。

  6. 锁定关键软件:对于关键软件,使用版本锁定功能防止意外更新。

  7. 清理缓存:定期清理缓存,减少磁盘空间占用。

  8. 检查依赖:安装软件前,检查其依赖关系,避免依赖冲突。

  9. 使用事务历史:利用事务历史功能,在出现问题时可以快速回滚。

  10. 学习 DNF:对于新发行版,建议学习使用 DNF,它是 YUM 的继任者,性能更好。

总结

本教程详细介绍了 YUM 和 DNF 包管理器的使用方法、配置和最佳实践。通过实际案例,我们学习了如何配置国内镜像源、锁定软件包版本、使用 COPR 仓库等实用技巧。掌握这些知识后,可以更加高效地管理 Linux 系统中的软件包,保证系统的稳定性和安全性。

YUM 和 DNF 是 RPM 包管理系统的核心工具,它们简化了软件的安装、更新和卸载过程,自动处理依赖关系,为用户提供了便捷的软件管理体验。随着 DNF 的逐渐普及,它将成为未来主要的包管理工具,但 YUM 在一些旧版本的系统中仍然广泛使用。因此,掌握这两个工具的使用方法,对于 Linux 系统管理员来说是非常重要的。

« 上一篇 包管理系统概述 下一篇 » APT 包管理器