Допустим, я добавил PPA, в котором есть пакет X, который я хочу, но также есть пакет Y, из которого я не хочу использовать или получать обновления. Как я могу из того же PPA получать обновления для определенного пакета, но запрещать обновления из того же PPA для других пакетов.
Пошаговый пример был бы хорош, так как это случилось со мной в нескольких PPA, которые имеют определенный пакет, который я хочу, но также добавили целый ряд других, которые я пока не хочу обновлять.
Вы можете использовать то, что называется «закреплением»
Предполагая, что вы устанавливаете пакет foo из PPA, вам почти наверняка потребуется установить любые зависимости и из ppa.
Но если есть другие программы, вы можете указать, какой репозиторий использовать с закреплением.
На этой странице есть пример закрепления ppa
https://help.ubuntu.com/community/PinningHowto#Pinning_the_ubuntu-mozilla-daily_PPA
Чтобы сделать обновление apt-get как можно более безболезненным, установите более низкий Pin-Priority в PPA, это остановит установку нежелательных версий пакетов. После установки пакеты из PPA-репозитория ubuntu-mozilla-daily всегда проигрывают в любом соревновании с пакетами из других репозиториев, даже если у них более поздняя версия.
Создайте файл /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
Прежде всего, если вы уже обновили пакеты из PPA по ошибке, смотрите этот ответ: https://askubuntu.com/a/142808/103117 в частности раздел об использовании ppa-purge. Так как я уже обновил пакеты и apt-get не будет понижать класс, независимо от приоритетов, проще всего сначала очистить все обновленные пакеты, затем исправить приоритеты, затем повторно добавить PPA и обновить только те пакеты, которые вам нужны.
Полное объяснение системы приоритетов/пиновки смотрите в man apt_preferences
.
Если пакет доступен из нескольких источников, то каждому из них будет присвоен приоритет, и вы можете увидеть это с помощью apt-cache policy
. Например, я использую 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
самостоятельно отображает информацию обо всех источниках. Я знаю, что в названии моего 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]?
Так как обновляется только тот пакет, который я хочу, я с радостью соглашусь.