HI,CSDN的码友们,距离上一次我发文章已经过去了半年的时间,现在我又来介绍自己新发现和探究的开源技术了。计算机的发展总是飞速的,当我在写这篇文章的时候,Fedora rawhide已经进入了40版本、默认采用的自动化包管理器为dnf5(这里的默认指的是yum和dnf命令的默认指向,虽然说是dnf5但其实它一直在改变,它可能指向yum/dnf3/dnf5),并且发布了稳定运行的GNOME45 beta。以下是部分图片,记录下来留作纪念吧。
本文的信息来源和依据:
dnf5文档
dnf文档
dnf5GitHub项目
dnfGitHub项目
dnf5速度对比
dnf插件
这回我要介绍的是RedHat系Linux发行版的新一代包管理器dnf5。由于我使用了Fedora rawhide默认的yum源只收录最新的rpm软件包,所以我总是能够接触到最新的Linux内核、驱动与软件包。现在服务器上部署的 rpm系Linux可能大多还是CentOS 7,也就是使用yum作为包管理器,甚至可能还没有使用上dnf,更不用说最新的dnf5。也许企业基于稳定的考量,不会使用最新且可能有bug的技术,不过作为个人电脑桌面Linux来说,使用最新的软件包拿来体验应该是完全没有问题的,我就把我自己的使用体验和经验分享一下吧。我希望通过我的文章更多人愿意使用开源的GNU/Linux作为桌面系统,爱上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(rawhide作为试验田在很多小细节的地方都是不停地修修改改)。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,如果你觉得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 | 仅将软件包更新到提供错误修复、增强功能或安全问题修复的最低可用版本 |
–exclude | 跳过指定的软件包,可以使用通配符匹配包名 |
–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]
例子:
sudo dnf5 downgrade nano-0:6.0-2.fc36
当然了,话又说回来,自动化包管理器毕竟是依靠源里面的软件包index工作的,无论是升级还是降级,都需要你的源里面有对应的软件包,也就是说你的源里必须有低版本的软件包才能够降级。
sudo dnf5 [options]
这其实就是先卸载旧的软件包再安装新的软件包
例子:
sudo dnf5 swap mlocate plocate
sudo dnf5 swap nano vim
sudo dnf5 swap vim neovim
sudo dnf5 search [options]
通过将用户给定的关键字与各种元数据进行匹配来搜索包,不区分大小写。
–all:
至少选出一个软件包来,会从包名、说明、摘要等信息中搜查,属于模糊搜索、搜索范围特别大。
sudo dnf5 download [options]
用于将package-name指定的包名定义的二进制文件和源代码包下载到当前工作目录
选项 | 作用 |
---|---|
–resolve | 解决指定包的依赖关系并下载缺失的包 |
–alldeps | 下载所有依赖项而不是跳过下载已安装的依赖项(要与–resolve一起使用) |
–destdir= | 指定用于下载包的目录,默认是当前的工作目录 |
sudo dnf5 kernel-headers-0:5.17.0-300.fc36.i686
sudo dnf5 download rpm -rpm-devel
sudo dnf5 download maven-compiler --resolve --alldeps
这里提醒一下:只有对系统进行修改的操作才非要sudo不可,像这种下载操作是可以不需要root权限的,只需要你对当前工作目录有写和执行权限即可。
sudo dnf5 remove
从系统中删除指定的已安装的包,如果想仅删除这个包但是保留这个包的依赖项,可以使用clean_requirements_on_remove=False.
可以搭配rpm命令一起使用,rpm命令负责查询待删除的包,dnf命令用于安装或移除包。以下是一个非常常见的例子:
由于Fedora的内核非常新,每个一两天就会更新一次,这些内核会堆积在/boot里,但/boot分配的空间肯定是相对较少的,所以需要在更新内核后把旧的内核给删除,而旧的内核软件包的数量是较多的,这样就可以根据包名的相同部分批量删除rpm包。当然,这里要注意下,当你使用*等通配符去匹配字符串的时候请务必加上一对"".
如果出现依赖问题导致无法卸载,但是你又非常确定可以卸载的时候,可以尝试以下的解决办法。
sudo rpm -e --nodeps
在不检测依赖的情况下卸载,但是可能会有文件残留,需要自己手动去删除。
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 dnf history list
sudo dnf history undo
当作者在写这篇文章的时候,实际上dnf5是没有这个功能的,可能是发展还不完善,不过dnf已经有这个功能了,我觉得这个功能是非常重要的,万一卸载了某个软件包导致系统或桌面挂了,还可以用这个命令救一下。
先用list列出所有的dnf历史操作,再选择你要撤回操作的ID,使用undo就可以恢复。不过还是要在这里提醒一下。
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 [options] []
dnf5命令和前几代dnf命令前端最大的不同可能就是重新定义了子命令,将命令和子命令区分开来。
command | 作用 |
---|---|
list | 列出当前系统的组情况 |
info | 打印指定组的相关信息 |
install | 安装指定组 |
remove | 移除指定组 |
options | 作用 |
---|---|
–avaliable | 仅显示可用组 |
–install | 仅显示已安装的组 |
–hidden | 显示隐藏的组 |
–contains-pkgs | 仅显示包含具有指定名称的组 |
–with-options | 与install子命令一起使用,包含组中的可选包 |
例子:
sudo dnf5 group list --hidden #显示所有组的列表,包括隐藏的组
sudo dnf5 group info "*xfce*" #显示与xfce桌面相关的所有组的详细信息
sudo dnf5 group install mysql --with-options #安装mysal包含可选软件包的组
sudo dnf5 environment [options] []
sudo dnf5 environment list
sudo dnf5 environment info "KDE Plasma Workspaaces"
dnf5 environment用于管理软件包环境,即一组预定义的软件包集合,而dnf5 group用于管理软件包组,即一组相关的软件包。两者都可以方便地安装、管理和删除软件包集合,但它们的操作对象和功能略有不同。
subcommand:list/info
options:–avaliable/–installed
这个命令使用场景实在比较少,这里不再赘述了。
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 #允许你锁定特定软件包的版本,放置其被升级或降级
sudo dnf5 install "dnf5-command(copr)" #COPR是一个Fedora项目,用于一些非官方的包提供个人构建服务,这个我们重点说
dnf额外插件
遇到插件安装失败的情况也不要急,也许是插件的名称写错了,大家可以根据sh的提示信息再次尝试安装
# Ferdora Linux版本升级
sudo dnf upgrade --refresh # 刷新软件包缓存
sudo dnf system-upgrade download --releasever=38 # 下载指定Fedora发行版的软件包
sudo dnf system-upgrade reboot # 重启并安装新操作系统
更新Fedora Linux的官方文档
copr 子命令用于DNF5管理本地系统上的 Copr 存储库(由用户/社区/第三方提供的附加组件)。
Fedora和Arch Linux在软件包维护方面有不同的特点。下面是它们之间的一些比较:
官方软件包:
Fedora:Fedora拥有一个官方软件仓库,其中包含经过官方团队审核和维护的软件包。这些软件包经过一定程度的测试和验证,以确保它们在Fedora操作系统上的稳定性和兼容性。
Arch Linux:Arch Linux也有一个官方软件仓库,提供了一组核心软件包,包括基本的系统工具和服务。与Fedora不同,Arch Linux的官方软件仓库更加精简,专注于提供简洁、轻量级和最新版的软件。
AUR和第三方软件包:
Fedora:Fedora拥有一个名为COPR的项目,它允许社区成员创建和维护第三方软件仓库。COPR中的软件包经过一定程度的审核,以确保它们符合Fedora社区的标准。与AUR不同,COPR中的软件包相对较少,但它们经过了一些审核和测试过程。
Arch Linux:AUR是Arch Linux的一个独特特点,它为用户提供了一个社区驱动的软件仓库。AUR中的软件包由社区成员创建和维护,没有经过官方团队的审核。这使得AUR中的软件包数量非常庞大,涵盖了大量的应用程序和工具,但也意味着用户需要对软件包的可靠性和安全性进行自行评估。
软件包更新:
Fedora:Fedora采用了固定的发布周期,每年发布一个新版本。在每个版本中,官方软件仓库会提供常规的软件包更新和安全补丁。用户可以通过dnf包管理器轻松地更新系统和软件包。
Arch Linux:Arch Linux采用滚动更新模型,没有固定的版本发布。软件包更新是持续进行的,用户可以随时获取最新版本的软件包。通过pacman包管理器,用户可以方便地更新整个系统。
总体而言,Fedora更注重稳定性和可靠性,它的官方软件仓库经过了官方团队的审核和测试。相比之下,Arch Linux更注重简洁和灵活性,它的官方软件仓库提供简明、轻量级和最新版的软件,而AUR则为用户提供了更丰富的第三方软件包选择。选择适合自己需求的操作系统取决于用户对稳定性和灵活性的偏好。
从这里我们就可以看出了Fedora第三方的仓库是星星点点比较分散的,不像Arch Linux那样有一个统一的存放社区打包出来的软件包的aur。当然,如果大家自己也写了一个项目,也可以自己创建一个Copr存储库来发布自己的rpm软件包。
sudo dnf5 copr [options] [arguments]
subcommand | 含义/原理 |
---|---|
list | 列出Copr存储库 |
enable developer_name/project_name | 从Copr服务器下载存储库信息并放置在/etc/yum.repo.d/*.repo |
disable / | 将配置文件中的enable设置为0,dnf会忽略该存储库 |
remove / | 删除该配置文件 |
debug | 打印有关调试有用的系统的信息 |
list | 列出第三方存储库 |
options:
–hub [url]
指定CoprHub服务器的主机名,默认为copr.fedorainfracloud.org.
CoprHub网址
这里举一个例子:
scrcpy项目地址
比如你想要把安卓手机/平板上的画面投屏到电脑上,可以使用scrcpy这个开源项目。而这个项目并不直接在releases里发布rpm包,而是自己建立了一个存储库专门用来存放rpm包。
dnf copr enable zeno/scrcpy && dnf install scrcpy
可以根据文档中的描述启用自建的copr存储库并从该存储库中查找并安装scrcpy软件包。这一切都是自动化操作的。
当然如果你不想自动化配置或者这么做失败了,你也可以手动添加copr存储库,以下是一个例子:
首先访问CoprHub,网址放在上面了。进入后输入开发者/项目名称
这就是你应当添加的源了,源必须放置在/etc/yum/repo.d/目录下,在该目录下创建一个文件名为copr:copr.fedorainfracloud.org:zone:scrcpy的文件,这个页面的所有字符复制粘贴到这个文件里面,这时候存储库就添加好了。
不过这里说了copr第三方软件源的管理了,也就顺便介绍一下repo—用于获取有关系统上配置的存储库信息。
sudo dnf5 repo [options]
子命令:list / info
选项 | 作用 |
---|---|
–all | 显示有关所有已知存储库的信息 |
–enabled | 仅显示已启用存储库的信息(默认) |
–disabled | 仅显示已仅用的存储库的信息 |
sudo dnf5 repo list --disabled "-debuginfo" #打印与调试相关的禁用存储库
这个插件就是前面安装的dnf-plugin-versionlock。不过貌似dnf5无法使用这个插件,那就说一说dnf使用这个插件的方法吧。比如我想把gnome-shell的版本固定下来,不想更新到新的不稳定的版本了。
sudo dnf list gnome-shell
sudo dnf versionlock add gnome-shell #把这个软件包和版本上锁,不让更新,可以在指定时加入版本信息
sudo dnf versionlock list #查看有哪些软件包是上锁的
sudo dnf versionlock delete gnome-shell #给软件包解锁
其实RPM系Linux的源管理其实很简单,不过和Deb系和Arch系Linux不太一样,后者是把链接放到固定的文件里,而前者则是把yum源的配置文件(含链接)放到固定的目录里,即 /etc/yum.repo.d
被放置在这个目录下的.repo结尾的文件会被认为是一个yum源,当然是必须要该目录下,在该目录的子目录下的.repo文件不会被Linux认为这是一个yuim源!
这里我不具体说这个yum源是怎么编写的,如果大家需要的话可以给我留下评论,我再写详细解析。我仅仅分享一下我使用的源,大家可以拿去参考.
大家可以看到,我创建了一个backup目录,在该目录里把现在暂时用不到或者无法使用的yum源给放到里面了。
以.rpmsave结尾的的源:这些是系统备份的源,由于我的Fedora Linux升级了,所以使用的源也会自动更新,因此系统会把旧版本的源给换一个名字,使它们不再以.repo结尾。
以_copr开头的源:这些源并不是RehHat官方提供的源,包的质量和安全性都没有官方的保障,属于第三方、开发者自行维护的源,与上面介绍的scrcpy是类似的,大家可以多去GItHub上找找。
系统级别的源:这些源里面有Fedora Linux安装后自带的官方源也有国内的镜像源,如果大家对访问国外网站有困难,就使用国内的镜像(如果你无法访问国外的源,那么请你把baseurl为国外的yum源放置到backup目录里,以避免下载元数据时发出无效的http请求,这样会白白浪费时间)。系统自带的官方提供的源由于系统安装后本身就存在了,这里不再赘述。国内镜像源 我推荐清华源(可能不稳定)、ustc源(强烈推荐)、阿里源(速度慢)、华为源(需要登录)。
如果你对于配置软件源有困惑,或者是配置文件不知道怎么写的,在ustc的镜像网站里还非常贴心地写了许多文档。
yum源的收录是在精而不在多,你收录的源越多,每次从云端更新元数据的时间就越长,而且很多镜像源里的软件是重复的。基本上你就选择我推荐的这几个源也就差不多了。
Fedora官方Mirror
清华开源镜像站
中国科学技术大学开源镜像站
阿里开源镜像站
华为开源镜像站
某些软件单独的yum源:比如其中的code.repo\skype-stable.repo\google-chrome.repo等,这些源的目的其实很明确,就是为了某个软件单独做的软件源,大家可以在这些软件的官网上找到添加源的方法。
# 我以chrome浏览器的安装过程作例子
sudo dnf install fedora-workstation-repositories #添加额外的Fedora仓库
sudo dnf config-manager --set-enabled google-chrome #启动chrome仓库
sudo dnf install google-chrome-stable #安装chrome稳定版
RPM Fusion和Remi是两个常用的第三方软件源,用于在Fedora和Red Hat Enterprise Linux(RHEL)等基于RPM的Linux发行版中提供额外的软件包和功能。它们的存在意义在于为用户提供访问一些官方软件源中没有的软件包、库和驱动程序的机会,从而扩展系统的功能和兼容性。
以下是关于每个软件源的简要介绍:
RPM Fusion:
RPM Fusion是一个社区驱动的软件源,提供了一些官方软件源中缺失或限制的软件包,例如多媒体编解码器、专有驱动程序、播放器、游戏软件等。它分为两个主要分支:
Free(自由):提供自由和开源的软件包,符合自由软件准则。
Nonfree(非自由):提供一些专有软件和驱动程序,这些软件不符合自由软件准则,但可以在Fedora系统上使用。
RPM Fusion的软件包通常不包含在Fedora官方软件库中,但可以通过添加RPM Fusion源来获得。
Remi:
Remi是一个由Remi Collet维护的软件源,主要关注对RHEL和CentOS发行版的支持。它提供了一些额外的软件包,包括最新版本的PHP、MySQL、Redis、Memcached等。Remi软件源的目标是为企业用户提供先进和稳定的Web开发环境。
Remi软件源还提供了多个软件集合,包括Remi Repository(主版本)、Remi PHP Repository(PHP版本)和Remi Safe Repository(安全补丁),以满足不同用户和环境的需求。
# 添加Free分支
sudo dnf install https://download1.rpmfusion.org/free/fedora/rpmfusion-free-release-$(rpm -E %fedora).noarch.rpm
# 添加Nonfree分支
sudo dnf install https://download1.rpmfusion.org/nonfree/fedora/rpmfusion-nonfree-release-$(rpm -E %fedora).noarch.rpm
# 安装并启用Remi软件源
sudo dnf install https://rpms.remirepo.net/enterprise/remi-release-$(rpm -E %rhel).rpm
当然了,这些网址也位于国外,不过你应该明确我已经强烈建议键入ustc源了,去中科大的开源镜像站看看吧,里面有free的镜像。
下面是dnf配置文件的说明,在/etc/dnf/目录下是对dnf命令的设置
目录/文件 | 作用 |
---|---|
dnf.conf | 这是dnf目录的配置文件,也是本节的重点 |
plugins | 安装的插件被保存的配置文件和信息 |
protected.d | 受保护的rpm包的配置文件存放的目录 |
从这张图片中大家可以看到,凡是在这个目录下的文件里写有的rpm包名,则是被保护的。dnf命令会保护这些rpm包不被卸载。如果大家想避免哪个包不小心被卸载,可以自己创建一个.conf并且把包名写进去。
通过/etc/dnf/dnf.conf这个配置文件改变dnf的一些行为。
大家可以看到,此时dnf5正在以10个下载任务数对待更新的rpm包进行下载。我常常听说dnf因为速度太慢被喷,但我在这里为它正名一下,其实dnf5的下载包的速度很快,10个下载任务同时进行仍然不是它的极限,我们仅需对dnf.conf进行简单的配置一下就好。
大家可以在sh的任意一个工作目录运行 man dnf.conf 就可以看到配置文件的说明文档,我会在这一节的最后提供我的配置文件,大家可以拿去参考。
选项 | 值类型 | 描述 |
---|---|---|
arch | String | 指定rpm包的CPU架构(默认会依从系统架构) |
exclude | String | 跳过指定的软件包 |
assumeyes | boolean | 假定用户输入确认,默认为False |
autocheck_running_kernel | boolean | 自动检查是否安装了比当前运行的内核具有安全更新的更新内核模块。默认值为True |
cachedir | String | 设置DNF的缓存目录 |
checkonly | boolean | 如果设置为True,则DNF将完全从系统缓存中运行,不会更新缓存,即使缓存过期也会使用它。默认值为False |
check_config_file_age | boolean | 指定dnf是否应自动使repos的元数据过期 |
clean_requirements_on_remove | boolean | 删除dnf删除过程中不再使用的依赖项,默认为True |
config_file_path | String | 默认主配置文件的路径/etc/dnf/dnf.conf |
logdir | String | 存储日志文件的目录(/var/log) |
max_parallel_downloads | Integer | 同时下载程序包的最大次数。默认值为3。最多20个 |
proxy | String | 要连接的代理服务器的URL |
gpgcheck | boolean | 是否对此存储库中找到的包执行GPG签名检查,默认值为False(一般在.repo文件里写True) |
skip_if_unavaliable | boolean | 如果某个存储库不可访问,那就直接跳过去,不要在这上面一直发http/ftp请求浪费时间了 |
timeout | Integer | 设置超时的秒数,如果这指定时间内没有反应,就跳过那个存储库 |
user_agent | String | 相信写过爬虫/网站的同学对这个应该不陌生。要包含在DNF发送的HTTP请求中的用户代理字符串 |
username | String | 用于连接到具有基本HTTP身份验证的repo的用户名。默认情况下为空。可能是用来连接华为等需要登录的存储库使用的选项 |
大家注意:这些选项不仅仅是可以写在dnf.conf这个配置文件里面的。实际上dnf.conf是通用配置文件,它的优先级是最低的,但是使用范围最广。在yum源的.repo文件和你使用dnf时的选项里也可以使用这些选项。优先级: dnf命令 >
repo存储库 > dnf.conf全局配置文件。
[main]
arch=x86_64
max_parallel_downloads=10
gpgcheck=True
installonly_limit=3
clean_requirements_on_remove=True
best=False
skip_if_unavailable=True
fastestmirror=True
keepcache=True
assumeyes=False
当然了,这里面的boolean不一定非要写True/False,你写1/0也是一样的。虽然我这里设置了10个任务并行下载,实际上你设置成20个也完全没有任何问题,这下总没人再说dnf命令的速度太慢了吧。
官方文档
我会把dnf5对外提供的API放到最后更新。