“dnf list”中仓库名称前面的“@”是什么意思?

“dnf list”中仓库名称前面的“@”是什么意思?

当我想列出已安装的软件包时,我通常采用以下两种方法之一。

老式的方法是使用rpm -qa | grep <whatever I look for>,就是这样。

但最近我想要更全面地展示我的包,从今以后,我使用了dnf list --installed <whatever I look for>.

然而,当查看结果时,有几件事我不明白。

考虑这个例子:

# dnf list --installed zsh                  
Last metadata expiration check: 0:13:25 ago on Mon Jul 11 05:48:04 2016.
Installed Packages
zsh.x86_64            5.2-5.fc24            @@commandline

(实际打印输出的空格更宽)

因此,结果条目是:“package”“version”“repo”。

在我的例子中是:

  • 包:zsh.x86_64
  • 版本:5.2-5.fc24
  • 仓库:@@命令行

到目前为止,结果表是可以理解的,但我很困惑存储库名称前面的两个“@@”是什么意思。

另外,“commandline”表明该软件包是从命令行安装的(下载 RPM,然后执行dnf install whatever.rpm 在命令行中, ETC。)。不过我很确定我已经zsh通过安装了dnf install zsh

但这还不是全部。

我的系统上有几个从存储库安装的软件包@System@fedora但也有fedora没有@)和类似的东西@@commandline

那么存储库名称前面的这个@或到底意味着什么?@@

@@commandline尽管我非常确定我是从存储库安装的,但为什么我安装了这么多重要的软件包?

答案1

就让我在这里抛砖引玉吧。

dnf list all | less显示所有软件包(包括已安装和可用的软件包)。输出有两个部分:“已安装的包”和“可用的包”。所有“已安装的软件包”前面都有@符号,而“可用的软件包”则没有。所以我相信@迹象表明软件包已安装。如果安装了一个软件包但其原始存储库被删除,我想@@会给出标志。

dnf 源代码托管于https://github.com/rpm-software-management/dnf。下载src代码后,grep commandline -ri .在目录中执行a,它不会返回任何内容。然而,它的 github 页面确实提到了这一点,

它使用 RPM、libsolv 和 hawkey 库进行包管理。

所以我看看 hawkey,它是在同一项目下托管的,位于https://github.com/rpm-software-management/hawkey。通过查看其代码grep -ri commandline .,它确实显示了一些结果。

./src/types.h:#define HY_CMDLINE_REPO_NAME "@commandline"
./hawkey.spec:- fix: commandline RPMs do not provide their files (RhBug:1112810) (Ales Kozumplik)

所以commandline来自hawkey包。至于为什么在命令@comandline中显示的问题dnf list,我的疯狂猜测是dnf代码无法hawkey正确使用。

答案2

(免责声明:我无法提供任何这些内容的来源,因为我从未见过任何实际讨论这些事情的文档。接下来的信息仅仅是我通过检查、黑盒实验、偶然发现的信息反复试验,以及简单的猜测。此外,公平警告,它已经过度解释了。哇啊啊太长。)

DNF 添加一个@来表示repo已安装软件包已安装, 在dnf list上下文中。正如您所指出的:

我的系统上从@System、@fedora(但是也有没有@的fedora)和@@commandline之类的东西安装了几个软件包。

但实际上,您永远不会看到任何fedora来自已安装列表,因为那里的每个包都显示一些 @-repo 作为其源。 (您可以通过运行sudo dnf list installed和检查来验证这一点;列出的存储库都至少有一个 @ 符号。)当您使用 查看软件包的信息时dnf info,“ From repo:”字段将显示不带@. (所以“ From repo: fedora”是绝对可以的,并且相当于@fedora已安装列表中的值。)

但有些回购协议是命名的@前面有一个标志。正如 JohnKoch 在 hawkey 来源中发现的那样,“@commandline”被定义为“命令行存储库”的“存储库名称”。因此,@@commandlinednf list列表中仅表示一个已安装的软件包From repo: @commandline,一个令人困惑的存储库,其名称以自己的@符号开头。

dnf info在任何已安装的软件包上都会显示Repository: @System,这是另一个@名为的虚拟存储库。看起来这@System是保存当前安装的软件包集的虚拟存储库,并且@commandline虚拟存储库源代码库一个包从哪里来,但它不是来自任何仓库。

@commandline自从我第一次写这个答案以来,和的含义@System以及它们之间的关系似乎已经发生了变化。在某些方面它更加一致,并且解决了我之前关于如何@commandline使用的一些反对意见。我不再看见任何列出的已安装软件包来自@@System,并且带外安装现在确实会显示From repo: @commandline@@commandline在列表上下文中)。dnf info带外安装的软件包上通常显示如下内容:

$ dnf info remi-release
Installed Packages
Name         : remi-release
---✀---
Repository   : @System
From repo    : @commandline

如果我做一个dnf reinstall remi-release(因为包remi存储库中),它更改为:

$ dnf info remi-release
Installed Packages
Name         : remi-release
---✀---
Repository   : @System
From repo    : remi

更新 2020 年后的变化

包的源代码库习惯于依赖于当前包数据库中现有的存储库,但幸运的是,这已经改变了。现在DNF查询其历史数据库,而不是当前的软件包存储库集,以获取有关已安装软件包的信息。因此,即使在系统升级过程中,源存储库的名称现在也会被保留。

以前的、现已过时的信息

关于源存储库的另一件事:该From repo:字段中列出的存储库始终是存在的存储库在当前的回购上下文中。换句话说,包的安装源不仅仅是包含存储库名称的字符串;它还包括一个包含存储库名称的字符串。安装的软件包链接到身份系统中存在(或已存在)的提供存储库的信息。

由于大多数存储库都是发行版的,因此每个新的 Fedora 版本都会重新定义它们。 (例如,“ fedora”存储库成为组成新版本的软件包集,与fedora先前版本下存在的“”存储库完全不同。)因此,每当系统升级完成时,都会出现许多旧的存储库标识失效。

DNF(或 hawkey)用于将从不再存在的存储库安装的软件包降级@commandline为其源存储库。我说“曾经”,因为(谢天谢地)不再这样做了。来自不再存在的存储库的已安装软件包将不再将其源显示为@@commandline/ From repo: @commandline。事实上,dnf info这表明他们不再拥有任何源代码库。例如,sitecopyFedora 软件包现已退役。我从7 或 8 版本之前的fedoraor updatesrepo 安装了它,并且仍然安装了它:

$ dnf info sitecopy
Installed Packages
Name         : sitecopy
Version      : 0.16.6
Release      : 14.fc22
Architecture : x86_64
Size         : 373 k
Source       : sitecopy-0.16.6-14.fc22.src.rpm
Repository   : @System

没有From repo:列出“ ”。

这确实令人困惑地意味着dnf list installed将显示包(以及其他类似的包),旁边列出了@System(one )。@因此,从某种意义上说,我们只是用一种不一致来换取另一种不一致,因为该列不再总是带有@前缀的源存储库。尽管如此,我还是更喜欢目前的状况。

脚注

  1. “...显示的...”
    (有时会显示。“可用软件包”不一定会在每次dnf list运行时显示:如果软件包的安装版本是最佳可用版本,则它会列在“已安装软件包”下因此,将其列在“可用包”下是多余的,使用 --showduplicates将强制“可用包”部分包含所有已知实例,无论版本如何,无论是已安装还是可下载。)

相关内容