当我想列出已安装的软件包时,我通常采用以下两种方法之一。
老式的方法是使用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”被定义为“命令行存储库”的“存储库名称”。因此,@@commandline
在dnf 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
这表明他们不再拥有任何源代码库。例如,sitecopy
Fedora 软件包现已退役。我从7 或 8 版本之前的fedora
or updates
repo 安装了它,并且仍然安装了它:
$ 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 )。@
因此,从某种意义上说,我们只是用一种不一致来换取另一种不一致,因为该列不再总是带有@
前缀的源存储库。尽管如此,我还是更喜欢目前的状况。
脚注
- “...显示的...”
(有时会显示。“可用软件包”不一定会在每次dnf list
运行时显示:如果软件包的安装版本是最佳可用版本,则它会列在“已安装软件包”下因此,将其列在“可用包”下是多余的,使用--showduplicates
将强制“可用包”部分包含所有已知实例,无论版本如何,无论是已安装还是可下载。)