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

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

使用固定

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

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

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

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

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

有关更多信息man apt_preferences或检查Ubuntu社区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
导致安装版本,除非有可用的版本属于某个其他分发或安装的版本更新

要选择用于固定的存储库,您将使用存储库的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=中显示。

  • 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中的mainmultiverserestricted universe 。 在输出中它显示为c=mainc=restricted等。大多数PPA使用main作为该字段,因此它也无助于固定很多。

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

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

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

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

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

有几种方法可以控制固定,只有一个小子集对Ubuntu有效。 但是,细节解释超出了答案的范围。 有关此信息,请参阅apt_preference手册页 。

2. Pin文件格式

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

  • 第一行以Package:开头Package:后面是逗号分隔的包名。 允许使用正则表达式和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:开头Pin-Priority:它的值是一个数字。 这表示上述目标项目的优先级。

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

这是一个例子

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

在此示例中, xenial归档中的包比xenial-updatesxenial-security具有更高的优先级。

固定后,运行apt-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 

但是,如果我们想优先考虑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 xenial存档和PPA的两个包都具有相同的优先级1001 ,因为它们都在Release文件中使用相同的值。 要成功固定,我们需要在Pin文件中组合更多字段。


一些例子

固定PPA存储库

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

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

 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的替代方案是打开软件中心并选择编辑>软件源……

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

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

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

希望这可以帮助

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

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

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

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

另一个GUI选项是在Synaptic包管理器中选择原点。

  1. 搜索要安装的软件包名称
  2. 单击“原点”按钮
  3. 选择要从中安装的存储库
  4. 选择包裹
  5. 应用