问题描述
如何限制安装到特定存储库集的更新?这是可能吗?
最佳解决方案
使用钉扎
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
文件中的字段。例如archive
,label
,release
,version
等。通过指定这些字段的值,您可以精确地选择存储库并为其指定首选优先级。查看apt_preference页面了解更多详情。
答案很长
在继续之前,我们需要了解一些关于固定的重要事项。那些包括
-
Release
文件的字段及其映射到apt-cache policy
输出 -
apt首选项文件的格式
-
使用
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-updates
,release-security
等。例如,xenial-updates
,xenial-security
。它在输出中显示为a=xenial
,a=xenial-security
。 PPA仅使用发布名称,这就是为什么它在Pinning中没有多大帮助。 -
组件讲述许可事项。它是Ubuntu中的
main
,multiverse
,restricted
,universe
。在输出中它显示为c=main
或c=restricted
等。大多数PPA在此字段中使用main
,因此它也无助于固定很多。 -
架构是关于OS架构的。在输出中显示为
b=i386
或b=amd64
-
Codename是发行版的发行名称。对于16.04,它是
xenial
。对于14.04,它是trusty
。显示在apt-cache policy
输出中,为n=xenial
或n=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-updates
和xenial-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的替代方案是打开软件中心并选择编辑>软件来源……
您需要做的就是un-tick您不希望更新的存储库。
希望这可以帮助
第五种方案
明显的选择是修改/etc/apt/sources.list
并注释掉所有其他存储库,然后运行
apt-get update && apt-get upgrade && apt-get autoclean
然后从sources.list
中删除评论。也许不是最好的方法,但至少apt-get
手册页没有指定任何方法来做到这一点。
相关说明,例如Ubuntu分发升级过程在升级期间禁用所有第三方存储库(并且不要仅运行某些选项以暂时排除这些存储库)。