使用固定

使用固定

如何将安装的更新限制为来自特定一组存储库的更新?这可能吗?

答案1

您可以使用选项指定版本-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 等)不同)”。

答案2

使用固定

固定是一个允许您保留 Ubuntu(或任何其他 Debian 系统)的稳定版本,同时获取较新版本的软件包的过程。—帮助中心

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

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

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

这将使该存储库中的所有软件包的优先级低于已安装的软件包(有 100 个)。

如需更多信息man apt_preferences或查看Ubuntu 社区维基

答案3

简短答案

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

100 <= P < 500
会导致安装某个版本,除非有属于其他发行版的可用版本,或者安装的版本较新

要选择要固定的存储库,您可以使用存储库Release文件中的字段。例如archive,,,等。通过指定这些字段的值,您可以精确地选择一个存储库并为其分配您的首选优先级labelrelease检查versionapt_preference页面以了解更多详情。


长答案

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

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

  2. apt 首选项文件的格式

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

Release1.文件和apt-cache policy输出字段

Debian 维基文章

  • 描述
  • 标签
  • 起源
  • 版本
  • 套房
  • 代码名称
  • 成分
  • 架构

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>输出中。

  • 起源这说明了存储库的来源。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此字段,因此它对固定也没有多大帮助。

  • 建筑学是关于操作系统架构的。在输出中显示为b=i386b=amd64

  • 代码名称是发行版的发布名称。对于 16.04 来说,它是xenial。对于 14.04 来说,它是。在输出trusty中显示为或。通常,对于单个发行版的所有存储库,它都是相同的。这就是为什么它对固定没有多大帮助的原因。apt-cache policyn=xenialn=trusty

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

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

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

有多种方法可以控制固定,但只有一小部分方法对 Ubuntu 有效。不过,详细解释超出了答案的范围。请参阅apt_preference手册页为了这。

2. Pin 文件格式

Pin 或 apt 首选项文件位于/etc/apt/preferences.d文件夹中。每个 pinning 包含三行。

  • 第一行以 开头Package:,后面是逗号分隔的包名称。允许使用正则表达式和通配符

  • 第二行以 开头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中较高版本的文件。请注意这一行。xenial-updatesCandidate:

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 提供的软件包,那么这种方法就行不通了。因为 PPAxenial默认使用相同的存档名称。因此,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。Ubuntuxenial官方仓库和 PPA 中的软件包具有相同的优先级1001,因为它们Archive在 Release 文件中使用相同的值。要成功固定,我们需要在 Pin 文件中组合更多字段。


一些例子

固定 PPA 存储库

要从存储库固定软件包,我们需要使用从apt-cache policy命令中找到的信息来定位它。我们刚刚看到,这a=xenial无助于定位存储库。我们需要在首选项文件中使用逗号将多个字段组合在一起,以精确定位存储库。

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

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

这里我们使用了 codename 值以及OriginPPA 的值。(虽然实际上这里不需要 codename 值)。有时存储库可能会遗漏这些值。在这些情况下,应该使用其他一些技术。 的输出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:此来源是互联网来源,而不是 Release 文件中指定 Vendor 的来源。

笔记2: Pin-Priority数字具有特殊含义。检查apt_preference手册页了解详情。

答案4

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

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

然后从中删除注释sources.list。这可能不是最好的方法,但至少apt-get手册页没有指定任何方法来实现这一点。

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

相关内容