如何将安装的更新限制为来自一组特定存储库的更新?这是可能吗?
如何将安装的更新限制为来自一组特定存储库的更新?这是可能吗?
Answers:
固定是一个过程,它使您可以从稳定版本的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。
apt-cache policy package-name
release n=repo
不会缓存任何人
您可以使用-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等不同)”。
apt-get
手册中所见,请-t
指定发行版而不是存储库名称。Ubuntu中没有存储库名称(不同于基于RedHat的Linux,例如RHEL,Fedora,CentOS等)
-t xenial
适用于单个包装。但它的所有依赖关系仍将从更高的包中获取
您需要以低于100的优先级来固定不想安装的存储库。这意味着(来自apt_preference
手册页)
100 <= P <500
导致要安装的版本,除非有某个可用版本属于其他发行版或已安装的版本较新
要选择固定的存储库,您将使用存储库Release
文件中的字段。如archive
,label
,release
,version
等。通过将这些字段的值,可以精确地选择一个存储库并分配优先的优先权给它。检查apt_preference页面以获取更多详细信息。
在继续之前,我们需要了解有关固定的一些重要知识。这些包括
Release
文件字段及其映射到apt-cache policy
输出
apt首选项文件的格式
使用Release
文件字段设置优先级
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-updates
,release-security
等等。例如xenial-updates
,xenial-security
。它在输出中显示为a=xenial
,a=xenial-security
。PPA为此仅使用发行版名称,这就是为什么它在Pinning中没有多大帮助。
组件讲述许可事项。这是main
,multiverse
,restricted
,universe
在Ubuntu。在输出中显示为c=main
或c=restricted
等。大多数PPA都main
用于此字段,因此也无助于固定。
架构是关于OS架构的。在输出中显示为b=i386
或b=amd64
代号是发行版的发行版名称。对于16.04是xenial
。对于14.04是trusty
。在apt-cache policy
输出中显示为n=xenial
或n=trusty
。通常,对于单个发行版,所有存储库都是相同的。这就是为什么它无助于固定的原因。
apt-cache policy
输出的另一行以origin
告诉存储库的Internet来源。它也可以用于固定。但不应与Release
文件Origin
字段混合。那些是不同的。
我们将使用这些值来固定存储库。
那么,我们如何使用固定1来限制存储库?
有多种控制固定的方法,并且只有一小部分对Ubuntu有效。但是,详细说明超出了答案的范围。请参考apt_preference
手册页。
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:
其值为数字。表示上述目标项目的优先级。
Release
文件字段设置优先级这是一个例子
Package: *
Pin: release a=xenial
Pin-Priority: 1001
在此示例中,来自xenial
存档的软件包的优先级高于xenial-updates
和xenial-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文件中都使用相同的值。要成功固定,我们需要在固定文件中组合更多字段。
要固定存储库中的软件包,我们需要使用从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
在这里,我们使用代号值以及Origin
PPA的值。(尽管这里实际上不需要代号值)。有时存储库可能会丢失这些值。在这些情况下,应使用其他一些技术。的输出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
手册页了解详情。