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


Answers:


29

使用固定

固定是一个过程,它使您可以从稳定版本的Ubuntu(或任何其他debian系统)上获取最新版本的软件包。— 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


3
遗憾的是,唯一的apt_preferences答案是最后一个……
Robert Siemer 2014年

如何找出哪个版本来自哪个仓库?
Max N

2
@MaxN您通常会通过运行apt-cache policy package-name
Anwar

这不会强制在更新时不考虑存储库。因为release n=repo不会缓存任何人
Anwar

35

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

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

如您所知iceweasel,在官方的Debian仓库中有一个相同的软件包。如果要从此特定版本安装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等不同)”。


4
如您在apt-get手册中所见,请-t指定发行版而不是存储库名称。Ubuntu中没有存储库名称(不同于基于RedHat的Linux,例如RHEL,Fedora,CentOS等)
SuB 2013年

1
@SuB是的,您是对的!我将版本库名称与发布混淆了!
漫画家

-t xenial适用于单个包装。但它的所有依赖关系仍将从更高的包中获取
Anwar

11

简短答案

您需要以低于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文件。

  • Description设置存储库的描述。这没有显示在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中没有多大帮助。

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

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

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

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

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

那么,我们如何使用固定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在此处使用。允许使用球形图案。

    或者,如果我们想固定原始包装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

固定后,运行an 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提供的软件包,则将无法使用。因为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

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


一些例子

固定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

在这里,我们使用代号值以及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

忽略它是候选人的事实。发生这种情况是因为它已经安装在我的系统中。检查右侧的优先级

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

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

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

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

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


7

基于GUI的替代方法是打开软件中心,然后选择“编辑”>“软件源” ...

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

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

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

希望这可以帮助


5

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

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

然后从中删除评论sources.list。可能不是最好的方法,但是至少apt-get手册页没有指定执行此操作的任何方法。

与此相关的是,例如,Ubuntu发行版升级过程会在升级期间禁用所有第三方存储库(并且不要只是运行某些选项以暂时排除那些存储库)。


1

GUI的另一个选择是仅在Synaptic软件包管理器中选择来源。

  1. 搜索您要安装的软件包名称
  2. 点击原点按钮
  3. 选择您要从中安装的存储库
  4. 选择套餐
  5. 应用
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.