前言
HI,CSDN的码友们,距离上一次我发文章已经过去了半年的时间,现在我又来介绍自己新发现和探究的开源技术了。计算机的发展总是飞速的,当我在写这篇文章的时候,Fedora rawhide已经进入了40版本、默认采用的自动化包管理器为dnf5,并且发布了稳定运行的GNOME45 beta。以下是部分图片,记录下来留作纪念吧。
本文的信息来源和依据:
dnf5文档
dnf文档
dnf5GitHub项目
dnf5速度对比
dnf插件
简介
这回我要介绍的是RedHat系Linux发行版的新一代包管理器dnf5。由于我使用了Fedora rawhide默认的yum源只收录最新的rpm软件包,所以我总是能够接触到最新的Linux内核、驱动与软件包。现在服务器上部署的 rpm系Linux可能大多还是CentOS,也就是使用yum作为包管理器,甚至可能还没有使用上dnf,更不用说最新的dnf5。也许企业基于稳定的考量,不会使用最新且可能有bug的技术,不过作为个人电脑桌面Linux来说,使用最新的软件包拿来体验应该是完全没有问题的。我就把我自己的使用体验和经验分享一下吧。本文的信息和依据主要来自官方文档,可以说是对文档的翻译说明。虽然文章讲述的是dnf5,但是包管理器前端命令的选项都是大同小异,这些选项和前辈包管理器其实差不多,大家也可以拿来看一看。
我首先介绍一下RPM系Linux包管理器和它们的发展过程与特点。
-
RPM (Red Hat Package Manager): RPM是最早的版本,首次发布于1997年。它包含了一组核心实用程序,用于管理.rpm文件,这些文件是软件包的预编译二进制版本或者源代码。RPM的主要特点包括:可以查询包数据库以获取有关已安装的包的信息;可以升级包,同时自动处理依赖关系;可以验证包的完整性等。
-
YUM (Yellowdog Updater, Modified): YUM是在RPM的基础上开发的,首次发布于2000年。它是第一个能自动解决软件包依赖问题的RPM系包管理器。YUM的主要特点是:自动下载RPM包并解决依赖关系;提供了一个简单的命令行接口;可以自动安装和升级软件包;支持多个仓库等。
-
DNF (Dandified YUM): DNF是在YUM的基础上开发的,首次发布于2012年。DNF的主要改进是在包管理器的内部结构和依赖解析算法上。DNF的主要特点包括:提供了更好的依赖关系解决方案;提供了更好的API;改进了性能;增加了新的特性,如快照和回滚等。
-
DNF 5: 在DNF的基础上,DNF 5进一步改进了包管理器的性能和可用性。DNF 5的主要特点包括:支持并行下载;改进了软件包的安装和升级过程;提供了更好的交互式命令行接口;增强了插件系统等。
可以看到DNF这个包管理器已经是第5个版本了,说明RedHat以及Fedora社区开发者、个人贡献者对于包管理器可以说是非常重视了,只是可能它的开发比较低调。一点点去修改,也不会在发行版上突然就默认使用最新的包管理器。我在Fedora rawhide(Fedora的试验田)上的dnf5也是自己安装的,并不是说rawhide就会自带dnf5.dnf5最大的亮点可能是使用了C++编写,速度比使用Python编写的dnf要快,并且也不容易出现依赖问题。
正文
DNF5是一个命令行包管理器,可以以一致的方式自动执行安卓、升级、配置和删除计算机程序的过程。
libdnf5是包管理库。现在发展成为了一个多功能库,通过它来构建加载存储库、查询包、解析依赖项和安装包的自定义工具。
它由libsolv提供支持,并使用易于使用的编程接口进行包装。libsolv 的功能使得软件包管理器能够更好地处理依赖关系,并确保软件包的安装和升级过程更加可靠和一致。许多流行的 Linux 发行版使用 libsolv 或基于 libsolv 开发自己的依赖关系解析器。
DNF5对外有开发接口,因此开源开发者也可以根据自己的想法和开放的接口自己做一个基于DNF5的包管理器并且带上自己特色,比如加上图形界面、加入deb包名转rpm包名的能力等。以下是DNF5对于几种编程语言的绑定情况:
Language | support |
---|---|
C++ | 完全支持 |
Python3 | 完全支持 |
Perl5 | 部分功能支持 |
Ruby | 部分功能支持 |
Go | 暂不考虑支持(寻找GO开发志愿者) |
C语言 | 不支持(选择C++即可) |
安装dnf5
sudo dnf install dnf5
当然这么做的前提是你已经使用dnf作为包管理器,如果你现在的包管理器是yum,也就使用yum就好了。
那么dnf5软件包对于的命令就是dnf5,如果你觉得dnf5这个命令看起来敲起来很难受,你可以使用软连接指定过去。
sudo ln -s /usr/bin/dnf5 /usr/bin/dnf
建立元数据缓存命令
sudo dnf5 makecache
这其实就是在dnf5 update之前将源中的元数据(版本信息)等缓存起来,但是有时候缓存可能会失效(元数据太老旧)可以先清理再缓存。这个缓存的问题呢,对于不同执行的用户来说可能有自己的缓存,所以比如你习惯了使用sudo dnf5那么你就一直sudo这种形式就好;如果你习惯先切换到root用户再更新或建立缓存,那就继续保持。不然的话,可能会为不同用户各自建立缓存,这样会占用更多的磁盘空间。
sudo dnf5 clean all && sudo dnf5 makecache
安装和更新命令
模板:
sudo dnf5 install [options] <package-name>
sudo dnf5 upgrade/update [options] <package-name>
这里的package-name可以是远程的包或者命令的名字也可以是本地的rpm包。由于安装和更新其实本质都是一样的所以就放到一起了。我也不知道为什么,在dnf5强调了upgrade的存在,在这之前都是使用update,不过在当前版本的dnf5.这二者没有什么差别;如果你的要求是更新所有软件包,可以选择upgrade.
选项:
–allowerasing:
允许删除已安装的软件包以解决任何潜在的依赖性问题。
–minimal:
仅将软件包更新到提供错误修复、增强功能或安全问题修复的最低可用版本
–best:
当多个软件包出现冲突问题的时候,会根据综合情况(版本、稳定性等)自动选择最合适的那个软件包。
–skip-broken:
当出现软件包依赖问题无法解决的时候,出问题的软件包不安装(跳过)
–forcearch=x86_64/aarch64
指定待安装软件包的CPU架构(无视你的主机系统的架构情况)
–advisory-severities=[critical/important/medium/low/none]
仅考虑具有指定严重性的建议中包含的内容
常见的安全公告严重级别:
Critical(严重):指示严重的漏洞,可能导致系统受到远程攻击并完全受损。
Important(重要):指示较为重要的漏洞,可能导致系统受到攻击并有一定的风险。
Moderate(中等):指示中等风险的漏洞,可能导致系统遭受某些攻击或数据泄露。
Low(低):指示较低的风险漏洞,可能对系统的影响较小。
None(无):指示没有特定的严重级别要求。
使用 --advisory-severities 选项,你可以将这些严重级别中的一个或多个作为参数传递给 dnf update 命令来仅更新满足指定严重级别要求的安全公告。这有助于根据你的需求选择性地安装或更新具有特定安全级别的软件包,从而确保系统的安全性和稳定性。
降级命令
降级命令可以说是非常重要了,在更新到最新的软件包后完全有可能出现一堆bug,这时候就需要降级命令来回退rpm包的版本。
sudo dnf5 downgrade [options] <package-name>
例子:
sudo dnf5 downgrade nano-0:6.0-2.fc36
当然了,话又说回来,自动化包管理器毕竟是依靠源里面的软件包index工作的,无论是升级还是降级,都需要你的源里面有对应的软件包,也就是说你的源里必须有低版本的软件包才能够降级。
交换命令
sudo dnf5 [options] <remove-name> <install-name>
这其实就是先卸载旧的软件包再安装新的软件包
例子:
sudo dnf5 swap mlocate plocate
sudo dnf5 swap nano vim
包搜索命令
sudo dnf5 search [options] <pattern>
通过将用户给定的关键字与各种元数据进行匹配来搜索包,不区分大小写。
–all:
至少选出一个软件包来,会从包名、说明、摘要等信息中搜查,属于模糊搜索、搜索范围特别大。
包移除命令
sudo dnf5 remove <package-name>
从系统中删除指定的已安装的包,如果想仅删除这个包但是保留这个包的依赖项,可以使用clean_requirements_on_remove=False.
可以搭配rpm命令一起使用,rpm命令负责查询待删除的包,dnf命令用于安装或移除包。以下是一个非常常见的例子:
由于Fedora的内核非常新,每个一两天就会更新一次,这些内核会堆积在/boot里,但/boot分配的空间肯定是相对较少的,所以需要在更新内核后把旧的内核给删除,而旧的内核软件包的数量是较多的,这样就可以根据包名的相同部分批量删除rpm包。当然,这里要注意下,当你使用*等通配符去匹配字符串的时候请无比加上一对"".
自动移除命令
sudo dnf5 autoremove
这个命令是用于删除多于的rpm包,dnf会自动查找rpm数据库,寻找没有被依赖的软件包并删除,执行这个命令前一定要小心,虽然有的软件包没有被依赖,但是也是可能会出错的,因此我会在执行这条命令之前重构rpm依赖数据库,避免dnf分析错误。
sudo rpm --rebuilddb
清理命令
sudo dnf clean [cache-types]
这个命令前面已经讲到了,用于删除元数据或将缓存标记为过期。比如说当你认为你应该可以更新某个包的新版本但是直接更新却提示说已经是最新版本了,那么很有可能就是你的包缓存过期了还没更新包index,也许缓存中是昨天的信息,导致你无法获取今天刚发布的新rpm包,这时候你就可以先清理再缓存/更新。
cache-types | 含义 |
---|---|
all | 所有存储库缓存的数据 |
packages | 所有缓存的包 |
dbcache | dbcache元数据 |
以上都是非常常用的命令,下面是一些不太常用的命令,大家可以略过这部分
发行版同步命令
sudo dnf5 distro-sync
其中distro是Linux发行版的意思,sync是同步的意思。当你执行完update/upgrade时,使用最新的软件包可能是会破坏依赖的,那么这个命令其实就是使用尽可能新的软件包(在不会破坏依赖性的前提下)。
dnf distro-sync是一个用于系统包管理的命令,它用于解决软件包之间的依赖关系冲突。当你运行dnf distro-sync命令时,它会根据系统中已安装的软件包的版本和依赖关系,升级、降级或删除软件包,以确保系统中的软件包保持一致和可用。
与dnf upgrade命令相比,dnf distro-sync更加强大和细粒度。dnf upgrade主要用于升级系统中的所有软件包到其最新可用版本,而不考虑依赖关系。它会尝试将所有软件包升级到最新版本,但如果存在依赖关系问题,可能会导致一些软件包无法升级或出现冲突。
dnf distro-sync更注重系统中软件包的一致性和依赖关系。它会检查系统中所有软件包的版本和依赖关系,并尝试通过升级、降级或删除软件包来解决任何冲突。它可以确保系统中的软件包与系统发布版本或存储库中的软件包保持一致。
因此,如果你想要确保系统中的软件包与系统发布版本或存储库保持一致,包括解决依赖关系冲突,你可以使用dnf distro-sync命令。如果你只想简单地将系统中的软件包升级到它们的最新版本,而不考虑依赖关系,你可以使用dnf upgrade命令。
组管理
sudo dnf5 group <subcommamd> [options] [<group-name>]
dnf5命令和前几代dnf命令前端最大的不同可能就是重新定义了子命令,将命令和子命令区分开来。
command | 作用 |
---|---|
list | 列出当前系统的组情况 |
info | 打印指定组的相关信息 |
install | 安装指定组 |
remove | 移除指定组 |
options | 作用 |
---|---|
–avaliable | 仅显示可用组 |
–install | 仅显示已安装的组 |
–hidden | 显示隐藏的组 |
–contains-pkgs | 仅显示包含具有指定名称的组 |
–with-options | 与install子命令一起使用,包含组中的可选包 |
例子:
sudo dnf5 group list --hidden #显示所有组的列表,包括隐藏的组
sudo dnf5 info "*xfce*" #显示与xfce桌面相关的所有组的详细信息
sudo dnf5 group install mysql --with-options #安装mysal包含可选软件包的组
环境管理
sudo dnf5 environment <subcommand> [options] [<environment-name>]
sudo dnf5 environment list
sudo dnf5 environment info "KDE Plasma Workspaaces"
dnf5 environment用于管理软件包环境,即一组预定义的软件包集合,而dnf5 group用于管理软件包组,即一组相关的软件包。两者都可以方便地安装、管理和删除软件包集合,但它们的操作对象和功能略有不同。
subcommand:list/info
options:–avaliable/–installed
这个命令使用场景实在比较少,这里不再赘述了。
在dnf5命令的文档里还有一些其他命令,大家可以自行去了解。
下面是对dnf的插件的讲解
dnf插件也是以软件包的形式发布和安装,可以通过dnf包管理器直接安装,它们通常以dnf-plugin或dnf-plugins开头。
sudo dnf5 install dnf-plugins-core #提供了一些核心插件
sudo dnf5 install dnf-plugin-system-upgrade #用于系统升级的插件
sudo dnf5 install dnf-plugin-protectbase #允许你保护特定存储库的软件包,以防止被其他存储库中的软件包覆盖
sudo dnf5 install dnf-plugin-versionlock #允许你锁定特定软件包的版本,放置其被升级或降级
dnf额外插件
# Ferdora Linux版本升级
sudo dnf upgrade --refresh # 刷新软件包缓存
sudo dnf system-upgrade download --releasever=38 # 下载指定Fedora发行版的软件包
sudo dnf system-upgrade reboot # 重启并安装新操作系统
更新Fedora Linux的官方文档