如何知道从哪个yum存储库安装了软件包?


152

在按yum安装软件包(配置了多个存储库)之后,如何找到已从哪个存储库安装的软件包?

如果我运行yum info package-name(或yum list package-name),则只能看到该软件包已“安装”。


1
好问题!我安装了yum-utils并尝试了一种叫做repoquery的utils,但是没有运气。
肖恩·斯塔斯


@warren您的链接没有用,因为您的链接是一个有关“存储在什么回购中的rpm的问题”,但是此问题询问“从何处安装了一个回购的rpm”。不同的问题。
特雷弗·博伊德·史密斯

如果你是用来干什么的rpm -qa|grep NAME,那么你可以yum list installed|grep NAME,以查找回购的转速是从
特雷弗·博伊德·史密斯

@TrevorBoydSmith-7年前,它很接近。今天,它仍然相似。从来没有说过是一样的。只是有关。
沃伦

Answers:


81

安装yum-utils后,repoquery将提供您要查找的信息(此处为“ epel”作为存储库)。

└─[$]> repoquery -i cherokee

Name        : cherokee
Version     : 0.99.49
Release     : 1.el5
Architecture: i386
Size        : 8495964
Packager    : Fedora Project
Group       : Applications/Internet
URL         : http://www.cherokee-project.com/
Repository  : epel
Summary     : Flexible and Fast Webserver
Description :
Cherokee is a very fast, flexible and easy to configure Web Server. It supports
the widespread technologies nowadays: FastCGI, SCGI, PHP, CGI, TLS and SSL
encrypted connections, Virtual hosts, Authentication, on the fly encoding,
Apache compatible log files, and much more.

2
repoquery似乎工作不正常,然后我得到了不同的软件包版本yum info package_name,似乎不以与yum相同的顺序查询存储库。
Mike Miller 2010年

在几台服务器上也一样。yum info package_name返回的结果明显多于repoquery。这就是为什么堆栈交换不应锁定投票的原因。
reflexiv

8
我发现熊加米奥夫的答案不正确。repoquery -i $pkg给出从中$pkg可用的仓库,而不是从中$pkg安装的仓库。我执行了该命令,rpm -qi $pkg并获得了不同的版本号。rpm导致版本号早于repoquery

您的本地副本可能是过时的,或者它是与附加命令一起安装的(例如--use-mirror)。我认为不可能总是得到正确的答案。
熊加米奥夫

user158844是正确的。这将告诉您提供给定程序包的存储库,而不是特定程序包的存储库。如果您从某个仓库中安装了一个软件包,然后删除了该仓库,然后安装了另一个仓库,该仓库提供了一个具有相同名称的软件包,则运行“ repoquery -i”,这样会返回给您列出新安装的仓库的软件包,而不是那些您实际上是从安装软件包的。询问者想知道安装的软件实际来自哪个软件包。当前存储库中没有哪个具有相同名称的软件包。
托德·沃尔顿

43

什么版本的yum?

在当前版本上,如果已安装的软件包与最新的可用软件包的版本相同,则会显示其安装源。

$ yum info irssi
Installed Packages
Name       : irssi
Arch       : i586
Version    : 0.8.14
Release    : 1.fc11
Size       : 2.3 M
Repo       : installed
From repo  : updates
Summary    : Modular text mode IRC client with Perl scripting
URL        : http://irssi.org/
License    : GPLv2+
Description: Irssi is a modular IRC client with Perl scripting. Only text-mode
           : frontend is currently supported. The GTK/GNOME frontend is no
           : longer being maintained.

$ yum --version
3.2.23

如果有可用的较新软件包,则将单独显示该软件包,新版本将显示可从中使用的仓库。


我在CentOs 5.3上使用yum 3.2.19,并且“从仓库”行不存在。
lg。

是的...我正在3.2.21上对其进行测试,但该信息在任何地方都没有。当我在具有3.2.23的盒子上进行操作时,它起作用了。
亚历克斯

现在,这是最好的解决方案,但不适用于RHEL / Centos 5.3。我接受此解决方案,但是如果可以用于RHEL / Centos 5.3,我准备选择其他答案。
lg。

2
这在CentOS 5.5中也不可行。
Mike Miller 2010年

即使在centos 5.8中也无法使用“ From rep”
sepehr 2013年

22

即将到来,但是(至少在Fedora 15上)可以使用yumdb进行类似的查询:

yumdb info 'python*'

我实际上需要列出给定回购中的软件包:

yumdb search from_repo 'my-*-repo'

它也适用于Fedora 14
lg。

1
在RHEL 6.2上运行
pixelbeat

8

如果所有其他方法均失败,则可以手动检查yumdb。它位于,/var/lib/yum/yumdb其中包含有关每个已安装软件包的详细信息。您会特别感兴趣from_repo。例如,对于bind-utils包:

# for i in /var/lib/yum/yumdb/b/*bind-utils*/*; do echo $i: `cat $i`; done
/var/lib/yum/yumdb/b/73ea08770fa666e18c59842bf65fa0f3a0b103d8-bind-utils-9.8.2-0.23.rc1.el6_5.1-x86_64/checksum_data: 39f7840f93d3d76825a9e8da79cfe0366f7fad68f018a273477aee62cccfa3f4
/var/lib/yum/yumdb/b/73ea08770fa666e18c59842bf65fa0f3a0b103d8-bind-utils-9.8.2-0.23.rc1.el6_5.1-x86_64/checksum_type: sha256
/var/lib/yum/yumdb/b/73ea08770fa666e18c59842bf65fa0f3a0b103d8-bind-utils-9.8.2-0.23.rc1.el6_5.1-x86_64/command_line: install bind-utils
/var/lib/yum/yumdb/b/73ea08770fa666e18c59842bf65fa0f3a0b103d8-bind-utils-9.8.2-0.23.rc1.el6_5.1-x86_64/from_repo: updates
/var/lib/yum/yumdb/b/73ea08770fa666e18c59842bf65fa0f3a0b103d8-bind-utils-9.8.2-0.23.rc1.el6_5.1-x86_64/from_repo_revision: 1397654451
/var/lib/yum/yumdb/b/73ea08770fa666e18c59842bf65fa0f3a0b103d8-bind-utils-9.8.2-0.23.rc1.el6_5.1-x86_64/from_repo_timestamp: 1397654759
/var/lib/yum/yumdb/b/73ea08770fa666e18c59842bf65fa0f3a0b103d8-bind-utils-9.8.2-0.23.rc1.el6_5.1-x86_64/installed_by: 0
/var/lib/yum/yumdb/b/73ea08770fa666e18c59842bf65fa0f3a0b103d8-bind-utils-9.8.2-0.23.rc1.el6_5.1-x86_64/reason: user
/var/lib/yum/yumdb/b/73ea08770fa666e18c59842bf65fa0f3a0b103d8-bind-utils-9.8.2-0.23.rc1.el6_5.1-x86_64/releasever: 6

要获取所需的信息:

# cat /var/lib/yum/yumdb/b/*bind-utils*/from_repo
updates

更高版本将提供更多数据。例如在EL 7中,从中下载软件包的确切镜像和URL存储在此处。


+1。但最好执行以下操作:for i in /var/lib/yum/yumdb/b/*bind-utils*/*; do echo $i: `cat $i` | grep -oP 'from_repo:\ \K.*'; done在上面的示例中返回:updates-更具可读性!
格雷格·杜比奇

1
@GregDubicki命令的重点是显示正在发生的事情以及如何存储内容的更多上下文。显然,它没有这样做:这里不需要grep任何东西,您甚至可以放弃循环。一个简单的cat /var/lib/yum/yumdb/b/*bind-utils*/from_repo就是您所需要的。
迈克尔·汉普顿

6
rpm -qi packagename

会告诉您供应商和包装商


5

要查看从repo epel安装的内容:(应该在Centos 5.5下工作)请注意,如果没有名为epel的repo,它将吐出所有已安装的东西。

repoquery --repoid = epel -a | xargs yum列表已安装


1
只要存储库中没有更新的软件包,这似乎就可以工作。因此,您需要在使用前运行yum update。
codewaggle,2012年

4

如果该软件包是最近安装的,则可以在/ var / cache / yum中查找。

在该目录中,每个存储库都有一个目录,在该目录中有一个packages目录。因此,您将执行以下操作:

find /var/cache/yum -name [package-name]*

但是,必须在/etc/yum.conf文件中启用缓存:

cachedir=/var/cache/yum
keepcache=1

请注意,a yum clean [packages|all]将清除缓存目录。

如果缓存目录为空,则有另一种方法。读取的信息yum info [package]来自/var/cache/yum/repo/primary.xml.gz

您可以通过输入以下内容浏览文件:

gunzip -d -c /var/cache/yum/[repo]/primary.xml.gz | grep '<name>[package]'

但是,在yum info [package]如“ theotherreceive”所示的未显示“ From repo:”的机器上,这是因为该文件不在primary.xml文件中,因此将无法检索该信息。因此,如果程序包位于两个或多个primary.xml文件中,则必须确定系统上的存储库优先级。


这个解决方案也许是一个选择(我投票赞成),但我正在寻找一个明确的答案。
lg。

4

基于Swoogan
在RedHat和CentOS 上的回答,可以做到

sudo grep -ir PACKAGE_NAME /var/cache/yum/

结果应该看起来像

Binary file /var/cache/yum/REPOSITORY_NAME/primary.xml.gz.sqlite matches

其中repository_name 是可以找到您的软件包的存储库,它可能是从列表中的第一个安装的(请参阅yum repolist)


1

该信息可以在任何地方捕获吗?程序包没有该信息,并且yum在找到程序包后也不会在意。您可以通过弄清楚哪些存储库包含该程序包,然后确定哪个优先级来将其组合在一起。


此解决方案可能是一个选项(我投票赞成),但仅适用于最近安装的软件包,因为我可以更改存储库及其优先级。
lg。

1

这不是一个很好的解决方案,但是我发现可用的yum列表会向您显示每个软件包的最新版本,例如:

yum列表| grep gstreamer

PackageKit-gstreamer-plugin.x86_64 0.3.16-1.fc10          updates               

bluez-gstreamer.i386 4.30-2.fc10更新了
gstreamer.i386 0.10.21-2.fc10 fedora
gstreamer-devel.i386 0.10.21-2.fc10 fedora
gstreamer-devel.x86_64 0.10.21-2.fc10 fedora
gstreamer- plugins-bad-devel.i386 0.10.9-1.fc10 rpm无融合
gstreamer-plugins-bad-devel.x86_64 0.10.9-1.fc10 rpm无融合

因此,您可以在软件包中创建一个可用的yum列表,然后使用已安装的yum list来比较安装的版本,并很好地了解版本匹配时来自哪个回购。


仅当尚未安装该软件包时,这是正确的。
lg。

虽然它不能完全回答OP的问题,但对我来说非常有用,因为它仅在yum且没有其他utils的情况下可以在Centoss 5.5中运行,并且您可以:1.卸载软件包,然后查询以查看存储库,然后重新安装或2.在未安装软件包的其他计算机上查询。
lreeder 2014年

1

您可以将详细标志添加到“ yum info”:

yum info -v <package_name>

安装库将在“从仓库”输出中。


这似乎是唯一不需要安装yum-utils的解决方案。
马克·爱丁顿

这只会为我列出“已安装”。
frogstarr78

1

所以我知道这是一个有点老的问题-但是它出现在Google搜索中以寻找我想要的东西。

还有一种方法可以获取所用存储库的唯一列表:

# repoquery -ai | grep 'Repository  : ' | sort | uniq

这将列出已安装软件包的存储库。


1

无需安装任何额外工具,获取或输出无关信息的最简单,最直接的方法就是:

yum list installed [package name]

第三列将提供安装软件包的存储库的ID。

在使用grep的原始问题的评论中提到了这一点,但这不是必需的。您可以直接将包名称传递给yum进行过滤。



By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.