Прежде всего, если вы уже обновили пакеты с PPA по ошибке, посмотрите этот ответ: /ubuntu//a/142808/103117, в частности, раздел об использовании ppa-purge. Поскольку я уже обновил пакеты, и apt-get не понизит версию независимо от приоритетов, проще всего сначала очистить все обновленные пакеты, затем исправить приоритеты, затем повторно добавить PPA и обновить только те пакеты, которые вы хотите.
Для полного объяснения системы приоритета / закрепления см man apt_preferences
.
Если пакет доступен из нескольких источников, каждому из них будет присвоен приоритет, и вы можете увидеть это с помощью apt-cache policy <package name>
. Например, я использую PPA под названием nathan-renniewaldock / ppa / ubuntu, и я не хочу устанавливать 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, в соответствии с man-страницей выбрана та, которая имеет наибольший номер версии.
Например, если вы хотите установить только ddclient («пакет X»), но не какой-либо другой пакет, вы должны уменьшить приоритет для всех пакетов в PPA, кроме ddclient. Создайте файл с именем /etc/apt/preferences.d/nathan-preferences
. Обратите внимание, что все файлы в этом каталоге читаются, и существуют некоторые правила относительно имени файла (оно должно содержать только буквенно-цифровые символы, переносы, тире и не иметь расширения или заканчиваться на .pref).
Для начала нам нужно узнать, как определить наш PPA. apt-cache policy
Команда на своей dispays информацию обо всех источниках. Я знаю, что у моего 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, потому что он является более поздней версией. Теперь давайте удостоверимся, что другие пакеты не будут установлены:
$ 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]?
Поскольку только пакет, который я хочу, должен быть обновлен, я рад сказать, что да.