将我的本地仓库设为最高优先级。

摘要

我如何让apt-get优先选择本地仓库的软件包,而不是再次从官方仓库下载相同版本的软件包?本地仓库已经签名并受信任。我们已经尝试过apt偏好设置的优先级。


原始问题是:“如何在不使用sources.list文件的情况下将最高优先级分配给本地仓库”

我已经设置了一个包含我下载的软件包的本地仓库。当我需要重新安装Ubuntu时,我使用它来避免重复从互联网上下载相同的软件包。这是一个基本的仓库,使用apt-ftparchive packages . > Packages创建。我将其设置为可信任的仓库,以避免“未经身份验证的仓库”警告。(当你有一个不受信任的仓库时,aptsynaptic会尝试从互联网上下载相同的软件包,因为它是可信任的)。

我至少使用了这个本地仓库1年。但是我必须始终将我的本地仓库行放在sources.list文件的顶部才能使用它。但这很烦人,因为每次重新安装Ubuntu时,我都必须打开一个终端并进行一些输入,尽管有一个更好的工具software-properties-gtk。我不能使用这个工具,因为它将源行放在`sources.list`的末尾。

而且,真正的问题是,aptsynaptic总是从之前提到的源下载软件包,而不检查这些软件包是否已经在本地存储库中可用。因此,我别无选择,只能通过终端将本地源放在sources.list的顶部(我实际上并不讨厌终端,但我需要一个解决方案)。

我尝试过this method,但这对我没有帮助。

我的首选文件位于/etc/apt/preferences.d/local-pin-900中。

    Package: *
    Pin: release o=Local,n=ubuntu-local
    Pin-Priority: 900

我的发布文件就是这个。
    Origin: Local
    Label: Local-Ubuntu
    Description: Local Ubuntu Repository
    Codename: ubuntu-local
    MD5Sum:
     ed43222856d18f389c637ac3d7dd6f85          1043412 Packages
     d41d8cd98f00b204e9800998ecf8427e                0 Sources

当我启用apt-preference时,apt-cache policy正确显示了优先级,例如它显示本地仓库具有最高优先级。
但是当我执行sudo apt-get install 时,apt尝试从互联网下载。但是当我将本地仓库放在顶部时,它会从本地仓库安装。
所以,我的问题是->“是否可能强制apt在本地仓库中可用时使用本地仓库,而无需显式将“本地源”放在我的仓库列表(例如sources.list文件)的顶部?”
编辑:apt-cache policy $package_name的输出如下:
nautilus-wipe: 已安装:(无) 候选版本:0.1.1-2 版本表: 0.1.1-2 0 500 http://archive.ubuntu.com/ubuntu/ precise/universe i386 Packages 900 file:/media/Main/Linux-Software/Ubuntu/Precise/ Packages

显示我的本地仓库优先级更高,尽管它不是在sources.list文件中排在第一位的。

这是apt-get install nautilus-wipe的输出:

正在读取软件包列表... 完成
正在构建依赖关系树       
正在读取状态信息... 完成
将会安装下列新软件包:
  nautilus-wipe
升级了 0 个软件包,新安装了 1 个软件包,要卸载 0 个软件包,有 131 个软件包未被升级。
需要下载 30.7 kB 的归档文件。
此操作后将使用额外的 150 kB 磁盘空间。
'http://archive.ubuntu.com/ubuntu/pool/universe/n/nautilus-wipe/nautilus-wipe_0.1.1-2_i386.deb' nautilus-wipe_0.1.1-2_i386.deb 30730 MD5Sum:7d497b8dfcefe1c0b51a45f3b0466994

尽管我认为它应该满足于本地文件,但它仍然试图从互联网获取该文件。


使用""或localhost的结果如mediageek建议

使用localhost没有效果,但""有效果,但与我的方法没有区别

    Package: *
    Pin: origin ""
    Pin-Priority: 1001

我在发布问题之前就已经使用过它们了。但是我再次尝试了一下(为了确保)。结果还是一样的。`apt-cache policy`显示我的本地仓库确实具有最高优先级,但当我尝试安装时,它却说“需要获取XXX/XXX KB的存档”。

你本地的软件包是否比官方软件包更新或相等? - tumbleweed
是的,当然了,我用apt-get命令进行了验证。它显示"需要下载0 kb"。 - Anwar
你想用 apt-cache policy 来验证一下吗? - tumbleweed
之前的评论是个错误。我以为我在另一个问题中提到了这个(关于使用软件中心从本地仓库安装软件)。是的,我已经通过apt-cache policy进行了验证,并且看到本地仓库具有更高的优先级。但是apt-get仍然试图从互联网上安装它。我认为如果不使用sources.list文件,这是不可能的。 - Anwar
我在问的是apt-cache policy是否显示版本相同。 - tumbleweed
我认为你想说的是 apt-cache show package-name,是的,它显示相同的版本。apt-cache policy 不显示版本号。 - Anwar
是的,它会。请在您的问题中包含apt-cache policy $packagename的完整输出结果。 - tumbleweed
@tumbleweed,抱歉回复晚了。我已经给出了结果。 - Anwar
1个回答

简短回答:

APT首选项文件/etc/apt/preferences可用于控制安装时选择的软件包版本。

这是文件/etc/apt/preferences,apt-get使用它来决定如果有多个版本的单个软件包,应选择哪个版本。通过这种方式,任何来自本地仓库的软件包都将优先于其他软件包。

Package: *  
Pin: origin ""  
Pin-Priority: 1001  

这不会控制版本,而是控制源的优先级,如果两个软件包具有相同的版本。如果您需要为本地仓库中的相同软件包版本分配最高优先级,请将它们列在/etc/apt/sources.list文件的顶部。

对原问题的回答:

如何在不使用sources.list文件的情况下为本地仓库分配最高优先级?

没有办法在不使用sources.list文件的情况下为本地仓库分配最高优先级。如果您想为本地仓库分配最高优先级,必须将它们放在"sources.list"的顶部。

回答该问题的摘要:

如何让apt-get优先使用本地仓库中的软件包,而不是再次从官方仓库下载相同版本的软件包?本地仓库已经签名并受信任。我们已经尝试了apt偏好设置。

使用/etc/apt/sources.list文件,您需要将本地仓库行放在此文件的顶部。像下面这样。

deb cdrom:[Kubuntu 12.04 LTS _Precise Pangolin_ - Release i386 (20120424)]/ precise main restricted deb file:/media/Main/Precise-Debs-New / deb file:/media/Main/Linux-Software/Ubuntu/Precise /
deb http://archive.ubuntu.com/ubuntu precise main universe restricted multiverse deb-src http://archive.ubuntu.com/ubuntu precise universe main multiverse restricted #Added by software-properties
# deb cdrom:[Xubuntu 12.04 LTS _Precise Pangolin_ - Release i386 (20120423.1)]/ precise main multiverse restricted universe # deb cdrom:[Ubuntu 12.04 LTS _Precise Pangolin_ - Release i386 (20120423)]/ precise main restricted
# deb http://archive.canonical.com/ubuntu precise partner # deb-src http://archive.canonical.com/ubuntu precise partner # deb http://extras.ubuntu.com/ubuntu precise main # deb-src http://extras.ubuntu.com/ubuntu precise main
而且,“apt_preference”与选择具有相同版本的软件包的“实例”无关。这里的重点是,您不能使用“/etc/apt/preference”文件来强制选择/使用来自本地存储库的.deb文件,并将最高优先级分配给本地存储库。该文件(preference)用于选择特定版本,而不是相同版本的特定实例(.deb文件)。对于后一种情况,您需要使用上述方法中提到的“/etc/apt/sources.list”文件。

解释:

看起来我们都误解了apt_preference的目的,apt_preference手册在前三段中对此进行了描述!

APT首选项文件/etc/apt/preferences可用于控制选择安装哪个版本的软件包。

当sources.list(5)文件包含对多个发行版(例如stable和testing)的引用时,可能有多个软件包版本可供安装。APT为每个可用版本分配一个优先级。在依赖约束的情况下,apt-get(8)会选择具有最高优先级的版本进行安装。APT首选项文件通过覆盖APT默认分配给软件包版本的优先级,从而使用户能够控制选择哪个版本进行安装。

而第三段非常重要

当sources.list(5)文件包含对多个源的引用时,可能会有同一版本的多个实例可用。在这种情况下,apt-get(8)会下载在sources.list(5)文件中最早列出的实例。APT首选项文件不影响实例的选择,只影响版本的选择。

这些斜体是我添加的

让我们通过一个例子来看看:

我有一个精确版本的compiz-fusion-plugins-extra,但为了演示,我已经禁用了它。

这里是文件/etc/apt/preferencesapt-get使用它来决定如果有多个版本的单个软件包,应该选择哪个版本。(在这个例子中,compiz-fusion-plugins-extra有几个版本。

Package: *  
Pin: origin ""  
Pin-Priority: 1001  

这个文件告诉apt-get对于所有在不同仓库中存在多个版本的软件包,从本地仓库安装。

换句话说,如果我在我的本地仓库中有版本为1.0的软件包xapps,而且这个相同的软件包xapps在精确版本的仓库中有更高的版本,比如2.0apt-get将优先选择本地仓库的版本,即版本1.0

这是我的/etc/apt/sources.list文件

deb http://archive.ubuntu.com/ubuntu precise main universe restricted multiverse deb-src http://archive.ubuntu.com/ubuntu precise universe main multiverse restricted #Added by software-properties deb http://security.ubuntu.com/ubuntu/ precise-security universe main multiverse restricted deb http://archive.ubuntu.com/ubuntu precise-updates universe main multiverse restricted deb http://archive.ubuntu.com/ubuntu precise-backports universe main multiverse restricted
# deb http://archive.canonical.com/ubuntu precise partner #deb-src http://archive.canonical.com/ubuntu precise partner # deb http://extras.ubuntu.com/ubuntu precise main # deb-src http://extras.ubuntu.com/ubuntu precise main
deb file:/media/Main/Linux-Software/Ubuntu/Oneiric / #this is oneiric repository. deb file:/media/Main/Linux-Software/Ubuntu/Natty/natty / deb file:/media/Main/Linux-Software/Ubuntu/Natty/kubuntu / deb file:/media/Main/Linux-Software/Ubuntu/Natty/natty_new /
尽管我在文件中早些时候列出了precise的存储库,但这并不会导致apt-get从该存储库选择软件包。正如手册中所述,
引用: APT首选项文件不影响实例的选择,只影响版本的选择。
所以,命令apt-cache policy compiz-fusion-plugins-extra的输出如下所示:
anwar@edubuntu-lenovo:/etc/apt$ apt-cache policy compiz-fusion-plugins-extra 
compiz-fusion-plugins-extra:
  已安装: (无)
  候选版本: 0.9.5.94-0ubuntu1  / **选择较低版本作为优先级** /
  版本表:
     0.9.7.0~bzr9-0ubuntu6 0
        500 http://archive.ubuntu.com/ubuntu/ precise/universe i386 Packages
     0.9.5.94-0ubuntu1 0
       1001 file:/media/Main/Linux-Software/Ubuntu/Oneiric/  Packages
     0.9.4-0ubuntu3 0
       1001 file:/media/Main/Linux-Software/Ubuntu/Natty/natty/  Packages
在这里,候选版本是0.9.5.94-0ubuntu1(位于本地存储库中),而不是0.9.7.0~bzr9-0ubuntu6 0,后者位于precise存储库中。尽管precise的版本在sources.list文件中排在第一位。
一个示例运行的apt-get尝试在将最高优先级设置为本地仓库后安装compiz-fusion-plugins-extra
anwar@edubuntu-lenovo:~$ sudo apt-get install compiz-fusion-plugins-extra 正在读取软件包列表... 完成 正在构建依赖关系树 正在读取状态信息... 完成 以下软件包是自动安装的,现在不再需要: x11-apps x11-xfs-utils xinit x11-session-utils libfs6 使用 'apt-get autoremove' 命令来移除它们。 将会安装下列额外的软件包: compiz-core compiz-plugins-default compiz-plugins-extra compiz-plugins-main-default libdecoration0 xserver-xorg-core xserver-xorg-video-intel 建议安装的软件包: compizconfig-settings-manager xfonts-100dpi xfonts-75dpi 将会删除下列软件包: compiz compiz-gnome compizconfig-backend-gconf edubuntu-desktop libcompizconfig0 ubuntu-desktop unity xorg xserver-xorg xserver-xorg-input-all xserver-xorg-input-evdev xserver-xorg-input-mouse xserver-xorg-input-synaptics xserver-xorg-input-vmmouse xserver-xorg-input-wacom xserver-xorg-video-all xserver-xorg-video-ati xserver-xorg-video-cirrus xserver-xorg-video-fbdev xserver-xorg-video-geode xserver-xorg-video-mach64 xserver-xorg-video-mga xserver-xorg-video-neomagic xserver-xorg-video-nouveau xserver-xorg-video-openchrome xserver-xorg-video-qxl xserver-xorg-video-r128 xserver-xorg-video-radeon xserver-xorg-video-s3 xserver-xorg-video-savage xserver-xorg-video-siliconmotion xserver-xorg-video-sis xserver-xorg-video-sisusb xserver-xorg-video-tdfx xserver-xorg-video-trident xserver-xorg-video-vesa xserver-xorg-video-vmware 将会安装下列新软件: compiz-fusion-plugins-extra compiz-plugins-extra 以下软件包将会降级: compiz-core compiz-plugins-default compiz-plugins-main-default libdecoration0 xserver-xorg-core xserver-xorg-video-intel 升级了 0 个软件包,新安装了 2 个软件包,降级了 6 个软件包,移除了 37 个软件包,有 698 个软件包未被升级。 需要下载 0 B/5,772 kB 的归档文件。 在此操作之后,将释放 8,294 kB 的磁盘空间。 是否继续执行 [Y/n]?
奇怪!!!它正在尝试将已安装的precise compiz软件包降级以解决依赖关系(与Oneiric的匹配),并选择新的compiz-fusion-plugins-extra!!!
更危险的是,它正在尝试删除图形驱动程序包(xserver-xorg-....)以避免与新的compizes冲突。
(可能,如果我也在本地存储库中拥有它们,它们可能会安全地想要降级。但由于这些软件包通常已安装,我没有下载它们,因此不在本地存储库中,因此出现了这种结果)。
结论:因此,仅建议在本地系统中具有完整存储库的情况下使用/etc/apt/preferences。
如果许多存储库中存在相同版本的几个实例(.deb文件),该如何处理?
这是apt_preference手册所描述的。
引用:
当sources.list(5)文件包含对多个源的引用时,可能会提供相同版本的软件包的几个实例。在这种情况下,apt-get(8)会下载在sources.list(5)文件中最早列出的实例。
使用/etc/apt/preferences文件的用例示例:
一个强制使用自定义仓库中可用版本的示例是"Linux Mint"发行版。他们使用这个自定义的偏好文件。
Package: * Pin: release o=linuxmint Pin-Priority: 700
Package: * Pin: origin packages.linuxmint.com Pin-Priority: 700
Package: * Pin: release o=Ubuntu Pin-Priority: 500
这有效地使他们在他们的存储库中有这些软件包时提供软件包。但如果他们没有这些软件包,他们将使用Ubuntu的标准存储库。

在将本地存储库设置为最高优先级后运行apt-get的示例

我只是想在Ubuntu上安装kubuntu-desktop软件包来测试KDE。(我忘记了,我使用/etc/apt/preference文件设置了首选项)。我有一个kubuntu-12.04-alternate-installer的iso文件,所以我想可以使用它。

(在正确设置iso作为存储库源之后),我运行了
sudo apt-get install kubuntu-desktop,然后惊讶地看到下面的输出。

anwar@edubuntu-lenovo:~$ sudo apt-get install kubuntu-desktop 读取软件包列表... 完成 正在构建依赖关系树 读取状态信息... 完成 某些软件包无法安装。这可能意味着您提出了一个不可能的情况,或者如果您使用的是不稳定的发行版,则某些所需软件包尚未创建或已移出。 以下信息可能有助于解决问题:
以下软件包存在无法满足的依赖关系: kubuntu-desktop:依赖于language-selector-kde,但将不会安装 建议安装amarok,但将不会安装 建议安装apturl-kde,但将不会安装 建议安装gdebi-kde,但将不会安装 建议安装gpgsm,但将不会安装 建议安装ibus-qt4,但将不会安装 建议安装jockey-kde,但将不会安装 建议安装kdegraphics-strigi-plugins,但将不会安装 建议安装kdepim-wizards,但将不会安装 建议安装kpackagekit,但将不会安装 建议安装libreoffice-kde,但将不会安装 建议安装libreoffice-style-oxygen,但将不会安装 建议安装network-manager-pptp-kde,但将不会安装 建议安装plasma-widget-facebook,但将不会安装 建议安装plasma-widget-kimpanel,但将不会安装 建议安装usb-creator-kde,但将不会安装 E: 无法纠正问题,您有损坏的软件包。
我对结果感到惊讶。突然我记起来,我在/etc/apt/preference中设置了一个偏好(用于编写这个答案),将最高优先级设置为我的本地仓库。
所以,我运行了apt-cache policy kubuntu-desktop命令,输出如下:
anwar@edubuntu-lenovo:~$ apt-cache policy kubuntu-desktop kubuntu-desktop: Installed: (none) Candidate: 1.222.1kde47~ppa2 Version table: 1.254 0 500 cdrom://Kubuntu 12.04 LTS _Precise Pangolin_ - Release i386 (20120424)/ precise/main i386 Packages 500 http://archive.ubuntu.com/ubuntu/ precise/main i386 Packages 1.222.1kde47~ppa2 0 1001 file:/media/Main/Linux-Software/Ubuntu/Natty/natty/ Packages 1.222.1 0 1001 file:/media/Main/Linux-Software/Ubuntu/Natty/natty/ Packages 1.222 0 1001 file:/media/Main/Linux-Software/Ubuntu/Natty/kubuntu/ Packages
在这个输出中,我们可以看到"cdrom"和"precise main repository"都有版本号1.254,而本地仓库的版本是1.222.1kde47~ppa2,比较低。尽管它们在sources.list文件中位于本地版本之前,但本地软件包具有优先权。
为了明确地看到apt-get确实尝试从本地安装,我运行了synaptic并得到了以下结果,显示Apt系统将1.222.1kde47~ppa2作为要安装的候选版本。

enter image description here

此外,apt-cache policy kubuntu-desktop也显示相同的内容。
anwar@edubuntu-lenovo:~$ apt-cache policy kubuntu-desktop
kubuntu-desktop:
  已安装:(无)
  候选版本:1.222.1kde47~ppa2
  版本表:
     1.254 0
        500 cdrom://Kubuntu 12.04 LTS _Precise Pangolin_ - Release i386 (20120424)/ precise/main i386 Packages
        500 http://archive.ubuntu.com/ubuntu/ precise/main i386 Packages
     1.222.1kde47~ppa2 0
       1001 file:/media/Main/Linux-Software/Ubuntu/Natty/natty/  Packages
     1.222.1 0
       1001 file:/media/Main/Linux-Software/Ubuntu/Natty/natty/  Packages
     1.222 0
       1001 file:/media/Main/Linux-Software/Ubuntu/Natty/kubuntu/  Packages

为了解决这个问题,我通过sudo rm /etc/apt/preference删除了/etc/apt/preference文件。

然后再次运行apt-cache policy kubuntu-desktop,只看到了预期的输出。

anwar@edubuntu-lenovo:~$ sudo rm /etc/apt/preferences anwar@edubuntu-lenovo:~$ sudo apt-cache policy kubuntu-desktop kubuntu-desktop: 已安装: (无) 候选版本: 1.254 版本表: 1.254 0 500 cdrom://Kubuntu 12.04 LTS _Precise Pangolin_ - Release i386 (20120424)/ precise/main i386 Packages 500 http://archive.ubuntu.com/ubuntu/ precise/main i386 Packages 1.222.1kde47~ppa2 0 500 file:/media/Main/Linux-Software/Ubuntu/Natty/natty/ Packages 1.222.1 0 500 file:/media/Main/Linux-Software/Ubuntu/Natty/natty/ Packages 1.222 0 500 file:/media/Main/Linux-Software/Ubuntu/Natty/kubuntu/ Packages

还运行了以下命令:sudo apt-get install kubuntu-desktop,输出如下:

0 升级,213 新安装,0 删除和150 未升级。 需要获取 0 B/89.6 MB 的存档。 执行此操作后,将使用额外的 269 MB 磁盘空间。 您是否要继续 [Y/n]?
您可以在此处查看完整结果。
然后我对解释部分非常确定。

参考文献1:apt_preference手册

参考文献2:如何保留特定版本的软件包安装


1对于"What if several instances of the same version" 部分的+1,很好地解释了这种行为。不过我会等到本周末,也许有人能给出更好的解释。:) - Savvas Radevic
我应该添加一个使用本地仓库的示例吗? - Anwar
4耶稣...我的意思是谢谢你详细解答,但这个问题应该要简单得多才对。为什么在运行apt-add-repository时不能分配优先级呢? - Adam Plocher
这句话似乎是错误的,它并不控制版本,而是控制源偏好,即使两个软件包具有相同的版本。 - rosshjb

  • 相关问题