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

Ton*_*vel 39 apt pinning

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

car*_*ist 37

您可以使用-t选项指定版本。例如,我添加了以下存储库/etc/apt/sources.list来安装 Iceweasel 最新版本:

deb http://mozilla.debian.net/ squeeze-backports iceweasel-release
Run Code Online (Sandbox Code Playgroud)

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

apt-get install -t squeeze-backports iceweasel
Run Code Online (Sandbox Code Playgroud)

来自 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.
Run Code Online (Sandbox Code Playgroud)

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

更新:正如评论中提到的@SuB,指定版本而不是存储库名称。Ubuntu 中没有存储库名称(不同于基于 RedHat 的 linux,如 RHEL、Fedora、CentOS 等)”。-t

  • 正如你在 `apt-get` 手册中看到的,`-t` 指定版本而不是存储库名称。Ubuntu 中没有存储库名称(与基于 RedHat 的 linux 不同,例如 RHEL、Fedora、CentOS 等) (4认同)

kyn*_*nan 31

使用固定

固定是一个过程,它允许您在从更新版本获取软件包的同时保持稳定版本的 Ubuntu(或任何其他 debian 系统)。— help.ubuntu.com

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

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

Package: *
Pin: release n=repo
Pin-Priority: 50
Run Code Online (Sandbox Code Playgroud)

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

有关更多信息man apt_preferences或查看Ubuntu 社区 Wiki

  • 遗憾的是,唯一的 apt_preferences 答案是最后一个...... (3认同)
  • @MaxN 您通常会通过运行“apt-cache policy package-name”来找到该信息 (2认同)

Anw*_*war 12

简答

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

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

并且要选择用于固定的存储库,您将使用存储库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
Run Code Online (Sandbox Code Playgroud)

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

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

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

  • Origin这说明了存储库的来源。官方 Ubuntu 存储库具有Ubuntu作为值。如o=输出所示

  • 版本是发行的版本。Xenial 是 16.04。如v=输出所示

  • SuiteArchive相同。来自 debian wiki 它是这个目录中的软件包所属(或设计用于)的 Debian 发行版的名称,即稳定版、测试版或不稳定版。. 为Ubuntu,这些是release-updatesrelease-security等等。例如,xenial-updatesxenial-security。它在输出中显示为a=xenial, a=xenial-security。PPA 仅为此使用发布名称,这就是为什么它在 Pinning 中没有太大帮助的原因。

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

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

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

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

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

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

有几种方法可以控制固定,只有一个小子集对 Ubuntu 有效。详细说明超出了答案的范围。请参阅apt_preference手册页了解此内容。

2.pin文件格式

Pin 或 apt 首选项文件驻留在/etc/apt/preferences.d文件夹中。每个固定包含三行。

  • 第一行以Package:逗号分隔的包名开头。允许使用正则表达式和 glob

  • 第二行以 开头,Pin:用于定位一组包。

    如果我们想从引脚封装xenial高于xenial-updates中,我们将使用release a=xenial

    如果我们想固定 5.0 版,我们将version 5.0在这里使用。允许使用全局模式。

    或者,如果我们想从 origin 固定包http://archive.ubuntu.com,我们将使用origin "archive.ubuntu.com". 请注意,我们不在http://那里编写协议。

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

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

这是一个例子

Package: *
Pin: release a=xenial
Pin-Priority: 1001
Run Code Online (Sandbox Code Playgroud)

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

固定后,运行 anapt-cache policy nautilus表明它确实给予了xenial归档中较低版本的优先级高于归档中较高版本的优先级xenial-updates。注意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
Run Code Online (Sandbox Code Playgroud)

但是,如果我们也想优先考虑 PPA 提供的包,这将行不通。因为xenial默认情况下PPA 使用相同的存档名称。因此,分配优先级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
Run Code Online (Sandbox Code Playgroud)

现在候选版本来自 PPA。来自xenial官方 Ubuntu repo 和 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
Run Code Online (Sandbox Code Playgroud)

这里我们使用代号值以及OriginPPA 的值。(虽然这里实际上不需要代号值)。有时存储库可能会错过这些值。在这些情况下,应该使用其他一些技术。的输出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
Run Code Online (Sandbox Code Playgroud)

忽略它是 Candidate 的事实。这发生了,因为它已经安装在我的系统中。检查右侧的优先级

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

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

Package: *
Pin: origin download.opensuse.org
Pin-Priority: 10
Run Code Online (Sandbox Code Playgroud)

注 1:此来源是 Internet 来源,而不是在发布文件中指定供应商的来源。

注2: Pin-Priority数字有特殊含义。查看apt_preference手册页了解详细信息。


All*_*lan 7

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

选择了 Ubuntu 软件选项卡的软件源

选择了其他软件选项卡的软件源

您需要做的就是取消勾选您不想更新的存储库。

希望这可以帮助


Oll*_*lli 5

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

apt-get update && apt-get upgrade && apt-get autoclean
Run Code Online (Sandbox Code Playgroud)

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

在相关说明中,例如 Ubuntu 发行版升级过程会在升级期间禁用所有 3rd 方存储库(并且不要只是运行一些选项来暂时排除这些存储库)。