如何判断软件包来自哪个Ubuntu或Debian存储库?


168

在包括Ubuntu在内的基于Debian的系统上,如何能够在不实际开始下载的情况下确定要从哪个存储库下载软件包?aptitude showapt-cache info显示该部分(例如,元软件包,基础,图形),但不显示软件包所属的存储库(例如,http://ppa.launchpad.net/mactel-support/ppa/ubuntuhttp:// us .archive.ubuntu.com / ubuntu /)。

安装软件包时,实际的存储库会在下载过程中出现(它会打印在apt和类似程序的“从...下载中”输​​出中),但是如何获得包含该软件包(或特定软件包)的存储库上的信息版本的软件包)而不先下载并安装?

此外,如何确定已经安装的软件包的源存储库?


1
我发现这是Apt的不足之一;在软件包安装程序工具中很难分辨哪个存储库提供了某个软件包。
quack quixote 2010年

Answers:


203

我跑apt-cache policy <package name>

$ apt-cache policy wajig
wajig:
  Installed: 2.1
  Candidate: 2.1
  Version table:
 *** 2.1 0
        100 /var/lib/dpkg/status
     2.0.47 0
        500 file:/home/wena/.repo_bin/ squeeze/main i386 Packages
        500 ftp://ftp.is.co.za/debian/ squeeze/main i386 Packages

这意味着有三个wajig软件包:

  • 已安装的一个(/var/lib/dpkg/status

  • 可以从本地存储库(file:/home/wena/.repo_bin/)获得的一个

  • 可从远程存储库(ftp://ftp.is.co.za/debian)获得的一个版本,该版本也恰好具有与本地存储库中的版本相同的版本(2.0.47)。


此外,apt-cache madison <package name>将以表格格式显示类似信息。

 wajig |        2.2 | mirror://mirrors.ubuntu.com/mirrors.txt/ precise/universe amd64 Packages
 wajig |        2.2 | mirror://mirrors.ubuntu.com/mirrors.txt/ precise/universe Sources

但是它没有显示安装的软件包的来源,对吗?
Adobe

2
@Adobe就我而言,该2.1版本无法从任何存储库获得。它是本地建造的。
tshepang

2
什么是已安装软件包的标志?***还是/var/lib/dpkg/status
2013年

也许两者都有?不确定。
tshepang 2013年

未安装该软件包时,请apt-cache policy说:Installed: (none)
John McGehee '18年

28

啊哈!显然,正确的apt命令不是apt-cache info,而是apt-cache showpkg

$ apt-cache showpkg linux-generic
Package: linux-generic
Versions: 
2.6.31.19.32 (/var/lib/apt/lists/us.archive.ubuntu.com_ubuntu_dists_karmic-updates_main_binary-amd64_Packages) (/var/lib/apt/lists/security.ubuntu.com_ubuntu_dists_karmic-security_main_binary-amd64_Packages) (/var/lib/dpkg/status)
 Description Language: 
                 File: /var/lib/apt/lists/us.archive.ubuntu.com_ubuntu_dists_karmic-updates_main_binary-amd64_Packages
                  MD5: 5d722da329763b9342d322f5a140005c

2.6.31.14.27 (/var/lib/apt/lists/us.archive.ubuntu.com_ubuntu_dists_karmic_main_binary-amd64_Packages)
 Description Language: 
                 File: /var/lib/apt/lists/us.archive.ubuntu.com_ubuntu_dists_karmic_main_binary-amd64_Packages
                  MD5: 5d722da329763b9342d322f5a140005c


Reverse Depends: 
Dependencies: 
2.6.31.19.32 - linux-image-generic (5 2.6.31.19.32) 
2.6.31.14.27 - linux-image-generic (5 2.6.31.14.27) 
Provides: 
2.6.31.19.32 - 
2.6.31.14.27 - 
Reverse Provides: 

File:行在后面提供存储库信息/var/lib/apt/lists/

一个错误报告aptitude无法显示源存储库,但目前看来该功能仍在愿望清单上。


8年后,该智能功能仍在关注中,我不知道为什么未将此答案(apt-cache showpkg)标记为正确答案。
Csaba Toth

8

这对我有用(显示2vcard软件包在哪里):

$ grep 2vcard /var/lib/apt/lists/* | grep "Filename:"

/var/lib/apt/lists/us.archive.ubuntu.com_ubuntu_dists_karmic_universe_binary-i386_Packages:Filename: pool/universe/2/2vcard/2vcard_0.5-3_all.deb

如果有多个版本,则可以应用其他过滤来检查版本等。


务实。不过,我很惊讶无法通过的任何前端访问此信息dpkg
gotgenes 2010年


8

我不知道为什么没人提到aptitude。我用它所有的时间。

能力是:

  • 默认情况下附带许多基于Debian的发行版。可以通过以下方式安装到其他(例如Ubuntu)上sudo apt install aptitude
  • 不需要管理特权(至少对于以下命令)
  • 确实有一个不错的ncursesGUI(但是大部分时间没有它)
  • 提供了一个非常漂亮的输出。要显示软件包的版本,请使用aptitude versions命令:

    me@wheezy:~$ aptitude versions kde-standard
    Package kde-standard:                        
    i A 5:77+deb7u1     stable              500
    p A 5:84            testing,unstable    130
    
  • 没有超级牛的力量

每个字符串前面的字母表示软件包的状态,i已安装且p已清除(或从未安装),稳定测试不稳定是存储库定义,最后的数字是引脚优先级

关于aptitude的最新版本的一个警告在这里值得一提:默认情况下,它会显示所有软件包,其中包括您要搜索的名称,因此请使用正规表达式魔术一点点来搜索严格的名称,例如aptitude versions ^kde-workspace$


1
好的命令,但未按要求列出存储库。
bjhend


你不明白 可以安装其他PPA。重要的是要知道一个软件包是否来自这样的PPA。事实上,这就是我现在要设法解决的问题-如果是这样,我可以删除PPA,以减少出现问题的风险。
reinierpost

是的,您是对的,versions您只需检查给定软件包的apt pinning值,而不是相关的存储库即可。但是,如果您知道所有存储库以及如何固定它们,它仍然很有用。
TranslucentCloud

6

遗憾的是,在软件包安装期间未记录此信息。如果存储库仍在源列表中,并且存储库仍具有软件包,则可以做出合理的猜测:

grep -l PKG /var/lib/apt/lists/*

apt-cache showpkg 正在显示来自存储库数据库的数据(不是已安装的数据),因此它是来自grep的相同信息的另一种形式。

即使是突触也无法告知(在“原始”屏幕中)是否禁用了存储库并进行了更新。


2

或者,受Sunny启发,您可以尝试:

# list installed restricted packages
for i in `dpkg --get-selections | awk '{ print $1 }'`; do egrep -lRI "^Filename: .*/${i}_[^/]+.deb" /var/lib/apt/lists/ | grep -q 'restricted' && echo $i; done

# list installed multiverse packages
for i in `dpkg --get-selections | awk '{ print $1 }'`; do egrep -lRI "^Filename: .*/${i}_[^/]+.deb" /var/lib/apt/lists/ | grep -q 'multiverse' && echo $i; done

ps。并非100%准确。

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.