是否可以仅允许来自 PPA 的特定软件包更新

是否可以仅允许来自 PPA 的特定软件包更新

假设我添加了一个 PPA,其中包含我想要的 X 软件包,但也包含我不想使用或接收更新的 Y 软件包。我怎样才能从同一个 PPA 接收特定软件包的更新,但拒绝从同一个 PPA 接收其他软件包的更新。

一步一步的例子会很好,因为这已经发生在我几个 PPA 中,这些 PPA 中有我想要的特定包,但也添加了一大堆我还不想更新的其他包。

答案1

您可以使用所谓的“固定”

假设您正在从 PPA 安装软件包 foo,那么您几乎肯定也需要从 ppa 安装任何依赖项。

但是如果有其他程序,您可以指定使用固定的存储库。

Ubuntu wiki 置顶

该页面上有一个固定 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]?

因为只需要升级我想要的套餐,所以我很乐意答应。

相关内容