![是否可以仅允许来自 PPA 的特定软件包更新](https://linux22.com/image/1001217/%E6%98%AF%E5%90%A6%E5%8F%AF%E4%BB%A5%E4%BB%85%E5%85%81%E8%AE%B8%E6%9D%A5%E8%87%AA%20PPA%20%E7%9A%84%E7%89%B9%E5%AE%9A%E8%BD%AF%E4%BB%B6%E5%8C%85%E6%9B%B4%E6%96%B0.png)
假设我添加了一个 PPA,其中包含我想要的 X 软件包,但也包含我不想使用或接收更新的 Y 软件包。我怎样才能从同一个 PPA 接收特定软件包的更新,但拒绝从同一个 PPA 接收其他软件包的更新。
一步一步的例子会很好,因为这已经发生在我几个 PPA 中,这些 PPA 中有我想要的特定包,但也添加了一大堆我还不想更新的其他包。
答案1
您可以使用所谓的“固定”
假设您正在从 PPA 安装软件包 foo,那么您几乎肯定也需要从 ppa 安装任何依赖项。
但是如果有其他程序,您可以指定使用固定的存储库。
该页面上有一个固定 ppa 的示例
https://help.ubuntu.com/community/PinningHowto#Pinning_the_ubuntu-mozilla-daily_PPA
来自维基页面:
为了使 apt-get 升级尽可能轻松,请在 PPA 上设置较低的 Pin-Priority,这将阻止安装不需要的软件包版本。一旦设置,ubuntu-mozilla-daily PPA 中的软件包在与其他存储库中的软件包的竞争中将始终处于劣势,即使它们具有更高的版本。
创建文件/etc/apt/preferences.d/ubuntu-mozilla-daily-pin-400
将以下内容添加到文件:
Package: *
Pin: release o=LP-PPA-ubuntu-mozilla-daily
Pin-Priority: 400
使用以下命令(之前和之后)检查 Pin-Priority 是否已更新。
apt-cache policy
apt-cache policy firefox-3.5
答案2
首先,如果你已经错误地从 PPA 升级了软件包,请参阅此答案:https://askubuntu.com/a/142808/103117特别是关于使用 ppa-purge 的部分。因为我已经升级了软件包,而且无论优先级如何,apt-get 都不会降级,所以最简单的方法是先清除所有升级的软件包,然后修复优先级,然后重新添加 PPA 并仅升级您想要的软件包。
要了解优先级/固定系统的完整解释,请参阅man apt_preferences
。
如果某个软件包可从多个来源获得,则每个来源都会被分配一个优先级,您可以使用 查看apt-cache policy <package name>
。例如,我使用名为 nathan-renniewaldock/ppa/ubuntu 的 PPA,但我不想从那里安装 mysql-server-5.5(我的“软件包 Y”)。因此,我可以使用以下命令检查当前情况:
rob@frodo:~$ apt-cache policy mysql-server-5.5
mysql-server-5.5:
Installed: 5.5.27-1~ppa1~precise
Candidate: 5.5.27-1~ppa1~precise
Version table:
*** 5.5.27-1~ppa1~precise 0
500 http://ppa.launchpad.net/nathan-renniewaldock/ppa/ubuntu/ precise/main amd64 Packages
100 /var/lib/dpkg/status
5.5.24-0ubuntu0.12.04.1 0
500 http://gb.archive.ubuntu.com/ubuntu/ precise-updates/main amd64 Packages
500 http://security.ubuntu.com/ubuntu/ precise-security/main amd64 Packages
5.5.22-0ubuntu1 0
500 http://gb.archive.ubuntu.com/ubuntu/ precise/main amd64 Packages
因此,由于所有内容的优先级都是 500,根据手册页,将选择版本号最高的版本。
例如,如果您只想安装 ddclient(“软件包 X”),而不安装任何其他软件包,则需要降低 PPA 中除 ddclient 之外的所有软件包的优先级。创建一个名为 的文件/etc/apt/preferences.d/nathan-preferences
。请注意,该目录中的所有文件都将被读取,并且文件名有一些规则(它必须仅包含字母数字字符、连字符、破折号,并且没有扩展名或以 .pref 结尾)。
首先,我们需要知道如何识别我们的 PPA。该apt-cache policy
命令本身会显示有关所有来源的信息。我知道我的 PPA 名称中有“nathan”,所以我这样做:
$ apt-cache policy | grep nathan
400 http://ppa.launchpad.net/nathan-renniewaldock/ppa/ubuntu/ precise/main i386 Packages
release v=12.04,o=LP-PPA-nathan-renniewaldock,a=precise,n=precise,l=PPA,c=main
有趣的部分是“o=LP-PPA-nathan-renniewaldock”,我们在 /etc/apt/preferences.d/nathan-prefs 文件中使用它,如下所示:
Package: *
Pin: release o=LP-PPA-nathan-renniewaldock
Pin-Priority: 400
Package: ddclient
Pin: release o=LP-PPA-nathan-renniewaldock
Pin-Priority: 500
这会将 PPA 中的所有内容设置为优先级 400,然后将 ddclient 恢复为默认值 500。现在,我可以检查它是否已经起作用:
$ apt-cache policy ddclient
ddclient:
Installed: 3.8.0-11.4ubuntu1
Candidate: 3.8.1-0~ppa1~precise
Package pin: 3.8.1-0~ppa1~precise
Version table:
3.8.1-0~ppa1~precise 500
400 http://ppa.launchpad.net/nathan-renniewaldock/ppa/ubuntu/ precise/main amd64 Packages
*** 3.8.0-11.4ubuntu1 500
500 http://gb.archive.ubuntu.com/ubuntu/ precise/universe amd64 Packages
100 /var/lib/dpkg/status
因此 ddclient 的优先级为 500,与原始 Ubuntu 软件包相同,但它将从 nathan PPA 安装,因为 nathan PPA 的版本更高。现在让我们确保不会安装其他软件包:
$ apt-cache policy mysql-server
mysql-server:
Installed: 5.5.24-0ubuntu0.12.04.1
Candidate: 5.5.24-0ubuntu0.12.04.1
Version table:
5.5.27-1~ppa1~precise 0
400 http://ppa.launchpad.net/nathan-renniewaldock/ppa/ubuntu/ precise/main amd64 Packages
*** 5.5.24-0ubuntu0.12.04.1 0
500 http://gb.archive.ubuntu.com/ubuntu/ precise-updates/main amd64 Packages
500 http://security.ubuntu.com/ubuntu/ precise-security/main amd64 Packages
100 /var/lib/dpkg/status
5.5.22-0ubuntu1 0
500 http://gb.archive.ubuntu.com/ubuntu/ precise/main amd64 Packages
在这种情况下,nathan PPA 中的软件包的优先级为 400,低于 Ubuntu 的优先级,因此即使它的版本较高,也不会升级。我们可以使用以下命令进行检查:
$ sudo apt-get upgrade
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following packages will be upgraded:
ddclient
1 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
Need to get 77.7 kB of archives.
After this operation, 11.3 kB of additional disk space will be used.
Do you want to continue [Y/n]?
因为只需要升级我想要的套餐,所以我很乐意答应。