DNF ( Dandified-YUM ) 介绍

  •   DNF即 Dandified YUM, 是基于 RPM 的 Linux 发行版的下一代软件包管理工具,替代了原先的 YUM (Yellowdog Updater, Modified) 软件包管理工具。它首先在Fedora 18中出现,并且Fedora 22中替代了 YUM 工具集。

  •   DNF致力于改善 YUM 的瓶颈,即性能、内存占用、依赖解决、速度和许多其他方面。DNF使用RPM、libsolv和hawkey库进行包管理。尽管它并未预装在CentOS和RHEL 7中,但用户可以通过 YUM 安装,并同时使用二者。DNF的语法与 YUM 几乎一样。

DNF 优于 YUM

  •   至于为什么要开发一个新的工具来替代 YUM,而不是解决 YUM 现有的问题,其原因在于想要解决 YUM 现有的问题技术上存在很多问题,并且 YUM 团队也不能很快适应更新带来的改变。

  •   另外,更重要的原因是 YUM 的源代码有大概56000行,修改起来工作量巨大。

DNF 与 YUM 比较如下:

序号 DNF (Dandified YUM) YUM (Yellowdog Updater, Modified)
A DNF依赖解决方案采用用由 SUSE 开发的高性能 libsolv 库 YUM依赖解决方案为公共 API
B API 接口文档完备 API 接口文档较完备
C 由 C/C++ 和 Python 编写 由 Python 编写
D DNF 目前应用在 Fedora、RHEL 8、CentOS 8、OEL 8和 Mageia 6/7 YUM 目前应用在 RHEL 6/7、CentOS 6/7 和 OEL 6/7
E DNF 支持各类扩展 YUM 支持 Python 扩展
F 接口文档完备,开发新功能容易 接口文档不完备,开发新功能困难
G 同步软件库元数据时内存消耗低 同步软件库元数据消耗大量内存
H 如果软件包更新过程中存在不相关的依赖包,则软件包不更新 软件包更新时不进行依赖包相关性检查
I 如果允许的软件库没响应,则 DNF 会忽略并继续使用可用软件库 如果允许软件库没响应,则 YUM 程序会立即中止
J DNF 中 update 和 upgrade 相同 YUM 中 update 和 upgrade 不同
K 程序包的依赖包是不会更新的 YUM 提供选项来设置这种行为
L DNF 允许删除所有内核文件,包括正在使用的内核 YUM 禁止删除正在使用的内核
M 如果软件包更新过程中存在不相关的依赖包,则软件包不更新 软件包更新时不进行依赖包相关性检查
N 支持 AppStream module 不支持 AppStream module

CentOS 8 中的 REPO 仓库变化

BaseOS

这部分主要收集的是操作系统核心的功能;

AppStream

这部分则主要收集用户空间的安装包

图中,与yum的安装包并列的,还有一种叫模块的东西。多了这个层次或多了这个管理方法,相应地在yum命令下,增加了一个module子命令:

1
2
dnf module -h
dnf module list

DNF 命令接口

版本信息

1
2
# 查看DNF包管理器版本
dnf --version

帮助相关

1
2
3
4
5
6
7
8
9
10
11
# 查看所有的DNF命令及其用途
dnf help

# 获取命令的使用帮助
dnf help <command>

# 查看 DNF 命令的执行历史
dnf history

# 用户安装的历史记录
dnf history userinstalled

信息查看

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 查看系统中可用的 DNF 软件库
dnf repolist

# 查看系统中所有的 DNF 软件库,包括禁用的
dnf repolist all

# 禁用某个软件源
dnf config-manager --set-disable sublime-text

# 搜索软件库中的RPM包
dnf search <package>

# 列出所有安装的RPM包
dnf list installed

# 列出所有可安装的RPM包
dnf list available

# 查看软件包详情
dnf info <package>

# 查找某一文件的提供者
dnf provides <file>

软件包操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 安装软件包及其所需的所有依赖
dnf install <package>

# 升级软件包
dnf update <package>

# 删除软件包
dnf remove <package>

# 重新安装特定软件包
dnf reinstall <package>

# 更新软件包到最新的稳定发行版
dnf distro-sync

# 删除无用孤立的软件包
dnf autoremove

# 回滚某个特定软件的版本
dnf downgrade acpid

系统软件包操作

1
2
3
4
5
6
7
8
# 检查系统所有软件包的更新
dnf check-update

# 升级所有系统软件包
dnf update

# 删除缓存的无用软件包
dnf clean all

dnf module 操作

  CentOS 8 系列 Linux 版本有一个叫模块的功能,可以选择要安装的版本;这也是 AppStream 的关键。另外,如果从其他存储库安装 CentOS 8 存储库中不存在的版本,只要该存储卡支持模块功能,就可以用相同方式选择版本。

  1. 前置条件
    预先安装 EPEL 存储库,确保可以从多个存储库中选择版本:

    1
    dnf install epel-release
  2. 模块操作是附件参数为 module 命令:

    1
    dnf module ....
  3. 显示所有模块包列表:

    1
    dnf module list
  4. 显示特定模块包列表:

    1
    dnf module list [要查找的模块名称]

    e.g. : dnf module list php

其中:
- Stream 该列代表版本;
- Profiles 列表示开发类型等细分 common[普通版] devel[开发版]minimal[精简版];
- Stream和Profiles字母在括号旁边表示不管你是处于什么状态版本中执行果的提示底部;

  1. 安装特定版本模块,使用:

    1
    dnf module install [Name]:[Stream]/[Profile]

    在 [] 中 Name、Stream 和 Profile 分别表示 模块 名称、版本、开发分类;如果省略 Stream 和 Profile,则自动选择指定为默认值的那个;但是,如果没有默认指定的项目,则会出现错误,您可能会不小心插入与您想要的不同的内容,因此建议指定所有项目。

  2. 删除模块

    1
    dnf module remove [Name]

    由于每次只能安装一个特定版本,所以删除时候无需指定版本及开发类型信息;

  3. 重置

    1
    dnf module reset [Name]

    如果要切换模块版本,需要用 reset 命令重新设置一次版本选择。重置并不会删除安装的版本,如果想干净的删除,使用 remove 删除后在重置。

  4. 几个示例:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    # 列出所有可用的modules
    dnf module lis

    # 列出指定软件包的可用modules:postgresql可用版本有 9.6,10,12三个版
    # 安装指定版本的postgresql:安装postgresql 10版本
    dnf module install postgresql:1

    # 将postgresql 从版本10 切换到 版本9.6 切换之前需要reset 重置,再安装postgresql 9.6
    dnf module rest postgresql
    dnf module install postgresql:9.6
CentOS 8 module 安装 Nginx 1.20

 
1
2
# 查看 Nginx AppStream 版本:
dnf module list nginx
其中,序号 1 显示版本为:1.20;需要 2 中 显示 本机已经安装 Nginx1.20 版本

1
2
#安装 Nginx1.20 版本:
dnf module install nginx:1.20/common