当前位置: 首页>>技术教程>>正文


如何仅从特定存储库安装更新?

, ,

问题描述

如何限制安装到特定存储库集的更新?这是可能吗?

最佳解决方案

使用钉扎

Pinning is a process that allows you to remain on a stable release of Ubuntu (or any other debian system) while grabbing packages from a more recent version. — help.ubuntu.com

您可以禁用某些存储库的自动更新,而无需通过apt策略完全删除它们:

要从存储库repo禁用自动更新,请添加具有以下内容的文件/etc/apt/preferences.d/repo

Package: *
Pin: release n=repo
Pin-Priority: 50

这将使来自此存储库的所有包的优先级低于已安装的包(具有100个)。

有关更多信息,请访问man apt_preferences或检查Ubuntu Community Wiki

次佳解决方案

您可以使用-t选项指定版本。作为示例,我已将以下存储库添加到/etc/apt/sources.list以安装Iceweasel最新版本:

deb http://mozilla.debian.net/ squeeze-backports iceweasel-release

如您所知,官方Debian存储库中有相同的包iceweasel。如果我想从这个特定版本安装Iceweasel,我运行:

apt-get install -t squeeze-backports iceweasel

来自apt-get手册页:

-t, --target-release, --default-release
           This option controls the default input to the policy engine, it creates a default pin at priority 990 using the specified
           release string. This overrides the general settings in /etc/apt/preferences. Specifically pinned packages are not affected by
           the value of this option. In short, this option lets you have simple control over which distribution packages will be retrieved
           from. Some common examples might be -t '2.1*', -t unstable or -t sid. Configuration Item: APT::Default-Release; see also the
           apt_preferences(5) manual page.

我认为这是一个更好的解决方案。

更新:正如评论中提到的@SuB,“-t指定发行版而不是存储库名称.Ubuntu中没有存储库名称(不像基于RedHat的Linux,如RHEL,Fedora,CentOS,……)”。

第三种解决方案

简答

您需要使用优先级小于100来固定您不想安装的存储库。这意味着(来自apt_preference手册页)

100 <= P < 500
causes a version to be installed unless there is a version available belonging to some other distribution or the installed version is more recent

要选择用于固定的存储库,您将使用存储库的Release文件中的字段。例如archivelabelreleaseversion等。通过指定这些字段的值,您可以精确地选择存储库并为其指定首选优先级。查看apt_preference页面了解更多详情。


答案很长

在继续之前,我们需要了解一些关于固定的重要事项。那些包括

  1. Release文件的字段及其映射到apt-cache policy输出

  2. apt首选项文件的格式

  3. 使用Release文件字段设置优先级

1. Release文件和apt-cache policy输出的字段

来自Debian Wiki的文章

  • 描述

  • 标签

  • 起源

  • 套房

  • 代码名称

  • 组件

  • 架构

您可以看到apt-cache policy的输出

 500 http://mirrors.ircam.fr/pub/ubuntu/archive xenial/main amd64 Packages
 release v=16.04,o=Ubuntu,a=xenial,n=xenial,l=Ubuntu,c=main,b=amd64

这些行中的值来自Release文件。

  • 说明设置存储库的说明。这在apt-cache policy输出中未显示

  • 标记它是存储库的标签。许多存储库都有空标签。它显示在l =< label>中在输出中。

  • Origin告诉了存储库的来源。官方Ubuntu存储库的值为Ubuntu。在输出中显示为o=

  • 版本是分发版本。 Xenial是16.04。在输出中显示为v=

  • 套房与档案相同。来自debian wiki的是Debian的分布名称,该目录中的软件包属于(或设计用于),即稳定,测试或不稳定。对于Ubuntu,这些是release-updatesrelease-security等。例如,xenial-updatesxenial-security 。它在输出中显示为a=xeniala=xenial-security。 PPA仅使用发布名称,这就是为什么它在Pinning中没有多大帮助。

  • 组件讲述许可事项。它是Ubuntu中的mainmultiverserestricteduniverse。在输出中它显示为c=mainc=restricted等。大多数PPA在此字段中使用main,因此它也无助于固定很多。

  • 架构是关于OS架构的。在输出中显示为b=i386b=amd64

  • Codename是发行版的发行名称。对于16.04,它是xenial。对于14.04,它是trusty。显示在apt-cache policy输出中,为n=xenialn=trusty。通常,对于单个分发,所有存储库都是相同的。这就是为什么它没有帮助固定太多。

origin开始的apt-cache policy输出中的另一行告诉存储库的Internet来源。它也可以用于钉扎。但不应与Release文件Origin字段混合使用。那些是不同的。

我们将使用这些值来固定存储库。

那么,我们如何使用pinning1来限制存储库呢?

有几种方法可以控制固定,只有small-subset对Ubuntu有效。详细解释超出了答案的范围。请参考apt_preference man-page。

2. Pin文件格式

Pin或apt首选项文件位于/etc/apt/preferences.d文件夹中。每个钉扎包含三条线。

  • 第一行以Package:开头,后面是comma-seperated包名。允许使用正则表达式和glob

  • 第二行以Pin:开头,用于定位一组包。如果我们想要将xenial的封装高于xenial-updates,我们将使用release a=xenial。如果我们想要固定版本5.0,我们将在这里使用version 5.0。允许使用Glob图案。或者如果我们想要从原产地http://archive.ubuntu.com固定包裹,我们将使用origin "archive.ubuntu.com"。注意,我们不在那里写http://协议。

  • 第三行以Pin-Priority:开头,它的值是一个数字。这表示上述目标项目的优先级。

3.使用Release文件字段设置优先级

这是一个例子

Package: *
Pin: release a=xenial
Pin-Priority: 1001

在此示例中,来自xenial归档的包的优先级高于xenial-updatesxenial-security

固定后,运行apt-cache policy nautilus表明它确实通过xenial-updates存档中的higher-versioned为xenial存档中的较低版本提供了更高的优先级。请注意Candidate:行。

nautilus:
  Installed: 1:3.18.5-0ubuntu1~xenial1
  Candidate: 1:3.18.4.is.3.14.3-0ubuntu4
  Version table:
 *** 1:3.18.5-0ubuntu1~xenial1 100
        100 /var/lib/dpkg/status
     1:3.18.4.is.3.14.3-0ubuntu5 500
        500 http://us.archive.ubuntu.com/ubuntu xenial-updates/main amd64 Packages
     1:3.18.4.is.3.14.3-0ubuntu4 1001
        500 http://us.archive.ubuntu.com/ubuntu xenial/main amd64 Packages

但是,如果我们想优先考虑PPA提供的包,那么这将无效。因为PPA默认使用相同的存档名称xenial。因此,为a=xenial分配优先级也将适用于这些包。例如(启用PPA后),

13:31 $ apt-cache policy nautilus
nautilus:
  Installed: 1:3.18.5-0ubuntu1~xenial1
  Candidate: 1:3.18.5-0ubuntu1~xenial1
  Version table:
 *** 1:3.18.5-0ubuntu1~xenial1 1001
        500 http://ppa.launchpad.net/budgie-remix/ppa/ubuntu xenial/main amd64 Packages
        500 http://ppa.launchpad.net/gnome3-team/gnome3/ubuntu xenial/main amd64 Packages
        100 /var/lib/dpkg/status
     1:3.18.4.is.3.14.3-0ubuntu5 500
        500 http://us.archive.ubuntu.com/ubuntu xenial-updates/main amd64 Packages
     1:3.18.4.is.3.14.3-0ubuntu4 1001
        500 http://us.archive.ubuntu.com/ubuntu xenial/main amd64 Packages

现在候选版本来自PPA。来自官方Ubuntu repo的xenial存档和PPA的两个包具有相同的优先级1001,因为它们在Release文件中对Archive使用相同的值。要成功固定,我们需要在Pin文件中组合更多字段。


一些例子

固定PPA存储库

要从存储库中固定包,我们需要使用从apt-cache policy命令中找到的信息来定位它。我们刚看到a=xenial不会帮助pin-pointing成为存储库。我们需要在首选项文件中使用逗号一起使用多个字段来精确定位存储库。

例如,为了防止来自http://ppa.launchpad.net/oibaf/graphics-drivers/ ppa的所有包,我们可以使用

Package: *
Pin: release n=xenial,o=LP-PPA-oibaf-graphics-drivers
Pin-Priority: 10

这里我们使用PPA的代号值和Origin值。 (虽然这里不需要代号值)。有时存储库可能会错过这些价值在这些情况下,应该使用其他一些技术。 apt-cache policy libgl1-mesa-glx的输出表明它有效。它降低了这个PPA的所有包的优先级。

libgl1-mesa-glx:
  Installed: 12.1~git1608200730.16ef7a~gd~x
  Candidate: 12.1~git1608200730.16ef7a~gd~x
  Version table:
 *** 12.1~git1608200730.16ef7a~gd~x 100
        -10 http://ppa.launchpad.net/oibaf/graphics-drivers/ubuntu xenial/main amd64 Packages
        100 /var/lib/dpkg/status
     11.2.0-1ubuntu2.1 500
        500 http://us.archive.ubuntu.com/ubuntu xenial-updates/main amd64 Packages
     11.2.0-1ubuntu2 500
        500 http://us.archive.ubuntu.com/ubuntu xenial/main amd64 Packages

忽略它是候选人的事实。这个问题,因为它已经安装在我的系统中。检查右侧的优先级

在缺少发布信息时固定存储库

如果我们想要一个缺少发布信息的存储库,比如这个http://download.opensuse.org/repositories/home:/sarimkhan/xUbuntu_14.04,我们必须使用其他方法。由于没有其他存储库使用该源,我们可以安全地使用origin来固定此存储库。

Package: *
Pin: origin download.opensuse.org
Pin-Priority: 10

注1:此来源是Internet来源,而不是在Release文件中指定Vendor的来源。

注2:Pin-Priority编号有特殊含义。有关详细信息,请查看apt_preference手册页。

第四种方案

基于gui的替代方案是打开软件中心并选择编辑>软件来源……

apt,pinning,ubuntu

apt,pinning,ubuntu

您需要做的就是un-tick您不希望更新的存储库。

希望这可以帮助

第五种方案

明显的选择是修改/etc/apt/sources.list并注释掉所有其他存储库,然后运行

apt-get update && apt-get upgrade && apt-get autoclean

然后从sources.list中删除评论。也许不是最好的方法,但至少apt-get手册页没有指定任何方法来做到这一点。

相关说明,例如Ubuntu分发升级过程在升级期间禁用所有第三方存储库(并且不要仅运行某些选项以暂时排除这些存储库)。

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/2865.html,未经允许,请勿转载。