如何仅从特定存储库安装更新?
如何限制安装到特定存储库集的更新? 这是可能吗?
使用固定
固定是一个允许您在从更新版本获取软件包时保持稳定版本的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
文件中的字段。 例如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=
中显示。 -
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
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-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提供的包,那么这将不起作用。 因为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的替代方案是打开软件中心并选择编辑>软件源……
您需要做的就是取消勾选您不希望更新的存储库。
希望这可以帮助
明显的选择是修改/etc/apt/sources.list
并注释掉所有其他存储库,然后运行
apt-get update && apt-get upgrade && apt-get autoclean
然后从sources.list
删除评论。 也许不是最好的方法,但至少apt-get
手册页没有指定任何方法来做到这一点。
相关说明,例如Ubuntu分发升级过程在升级期间禁用所有第三方存储库(并且不要仅运行某些选项以暂时排除这些存储库)。
另一个GUI选项是在Synaptic包管理器中选择原点。
- 搜索要安装的软件包名称
- 单击“原点”按钮
- 选择要从中安装的存储库
- 选择包裹
- 应用