如何将安装的更新限制为来自特定一组存储库的更新?这可能吗?
答案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
,,,等。通过指定这些字段的值,您可以精确地选择一个存储库并为其分配您的首选优先级label
。release
检查version
apt_preference页面以了解更多详情。
长答案
在继续之前,我们需要了解有关固定的一些重要事项。这些包括
文件的字段
Release
及其到apt-cache policy
输出的映射apt 首选项文件的格式
使用
Release
文件字段设置优先级
Release
1.文件和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-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
此字段,因此它对固定也没有多大帮助。建筑学是关于操作系统架构的。在输出中显示为
b=i386
或b=amd64
代码名称是发行版的发布名称。对于 16.04 来说,它是
xenial
。对于 14.04 来说,它是。在输出trusty
中显示为或。通常,对于单个发行版的所有存储库,它都是相同的。这就是为什么它对固定没有多大帮助的原因。apt-cache policy
n=xenial
n=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-updates
和xenial-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 提供的软件包,那么这种方法就行不通了。因为 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 值以及Origin
PPA 的值。(虽然实际上这里不需要 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 发行版升级过程在升级期间禁用所有第三方存储库(而不仅仅是运行某些选项来暂时排除这些存储库)。