Как установить обновления только из определенного репозитория?

39

Как я могу ограничить обновления, которые устанавливаются для определенного набора репозиториев? Это вообще возможно?

Тон ван ден Хеувел
источник
Вы хотите иметь возможность указывать репо во время выполнения или это должно быть более статичным? Эти два ответы ниже , предполагают , второй вариант.
Чепанг
В идеале это было бы во время выполнения. Статической опции достаточно, хотя.
Тон ван ден Хеувел
2
Ваш заголовок и фактическая помощь, которую вы запрашиваете, различны.
Сундара

Ответы:

29

Используйте закрепление

Пиннинг - это процесс, который позволяет вам оставаться в стабильной версии 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 .

kynan
источник
3
Обидно, единственный ответ apt_preferences - последний ...
Роберт Симер
как узнать какая версия от какого репо?
Макс. N
2
@MaxN вы обычно находите эту информацию, запустивapt-cache policy package-name
Анвар
Это не приведет к принудительному хранению хранилища во время обновления. потому release n=repoчто не будет никого кэшировать
Анвар
35

Вы можете указать релиз с -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 нет имени репозитория (в отличие от Linux на основе RedHat, такого как RHEL, Fedora, CentOS, ...)».

карикатурист
источник
4
Как вы видите в apt-getруководстве, -tукажите релиз, а не имя репозитория. В Ubuntu нет имени хранилища (в отличие от Linux на основе RedHat, такого как RHEL, Fedora, CentOS, ...)
SuB
1
@SuB Да, ты прав! Я перепутал имя репозитория с выпуском!
карикатурист
-t xenialработает для одного пакета. но все его зависимости все равно будут извлечены из более высоких пакетов
Anwar
10

Краткий ответ

Вам нужно закрепить репозитории, из которых вы не хотите устанавливать, с приоритетом менее 100. Что означает (со apt_preferenceстраницы руководства )

100 <= P <500
вызывает установку версии, если только не доступна версия, принадлежащая другому дистрибутиву, или установлена ​​более поздняя версия

И чтобы выбрать репозиторий для закрепления, вы должны использовать поля из Releaseфайла репозитория . Такие , как archive, label, release, и versionт.д. Задавая значения этих полей, вы можете точно выбрать хранилище и присвоить нужный приоритет к нему. Проверьте страницу apt_preference для более подробной информации.


Длинный ответ

Прежде чем продолжить, мы должны знать некоторые важные вещи о закреплении. Те включает

  1. Поля Releaseфайлов и их отображение на apt-cache policyвывод

  2. Формат подходящих файлов предпочтений

  3. Использование Releaseфайловых полей для установки приоритета

1. Поля Releaseфайла и apt-cache policyвывода

Из статьи вики Debian

  • Описание
  • этикетка
  • происхождения
  • Версия
  • свита
  • Кодовое имя
  • Составные части
  • архитектуры

Вы бы увидели вывод, 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файлов.

  • Описание устанавливает описание для хранилища. Это не показано в apt-cache policyвыводе

  • Метка это метка хранилища. Многие репозитории имеют пустые ярлыки. Это показано в l=<label>выводе.

  • Происхождение это говорит о происхождении хранилища. Официальный репозиторий Ubuntu имеет Ubuntuв качестве значения. Показано как o=на выходе

  • Версия - это версия дистрибутива. Для Ксениала 16.04. Показано как v=на выходе

  • Люкс такой же, как Архив . Из вики Debian это имя дистрибутива 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для этого поля, поэтому оно также не помогает в закреплении.

  • Архитектура - это архитектура ОС. Показано как b=i386или b=amd64в выводе

  • Кодовое имя - это название выпуска дистрибутива. Для 16.04 это так xenial. Для 14.04 это так trusty. Показано в apt-cache policyвыводе как n=xenialили n=trusty. Обычно это одинаково для всех репозиториев для одного дистрибутива. Вот почему это не помогает в закреплении.

Другая строка в apt-cache policyвыводе, начинающаяся с, originсообщает интернет-происхождение хранилища. Это также может быть использовано в закреплении. Но не следует смешивать поле с Releaseфайлами Origin. Это разные.

Мы будем использовать эти значения для закрепления хранилища.

Итак, как мы используем закрепление 1, чтобы ограничить хранилище?

Есть несколько способов контролировать закрепление, и только небольшое подмножество эффективно для Ubuntu. Подробное объяснение выходит за рамки ответа. Пожалуйста, обратитесь к apt_preferenceman-странице для этого.

2. Пин формат файла

Файлы предпочтений Pin или apt находятся в /etc/apt/preferences.dпапке. Каждый пиннинг содержит три строки.

  • Первая строка начинается с Package:запятых, разделенных запятыми. Регулярные выражения и глобусы разрешены

  • Вторая строка начинается с Pin:и используется для определения набора пакетов.

    Если мы хотим прикрепить пакеты от xenialвыше чем xenial-updates, мы будем использовать release a=xenial.

    Если мы хотим прикрепить версию 5.0, мы будем использовать version 5.0здесь. Шаровые патенты разрешены.

    Или, если мы хотим прикрепить пакеты от источника http://archive.ubuntu.com, мы будем использовать origin "archive.ubuntu.com". Обратите внимание, мы не пишем http://протокол там.

  • Третья строка начинается с, Pin-Priority:и ее значение является числом. Что означает приоритет целевых элементов выше.

3. Использование Releaseфайловых полей для установки приоритета

Вот пример

Package: *
Pin: release a=xenial
Pin-Priority: 1001

В этом примере пакеты из xenialархивов имеют более высокий приоритет, чем xenial-updatesи xenial-security.

После закрепления, запуск 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, это не сработает. Потому что PPA xenialпо умолчанию используют одно и то же имя архива . Таким образом, присвоение приоритета 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 и PPA имеют одинаковый приоритет 1001, поскольку оба они используют одинаковое значение для Archiveв файле Release. Чтобы успешно закрепить, нам нужно объединить больше полей в файле Pin.


Некоторые примеры

Закрепить репозиторий PPA

Чтобы закрепить пакеты из репозитория, нам нужно настроить таргетинг на него, используя информацию, найденную в 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. Это происхождение является интернет-происхождением, а не тем, которое указывает поставщика в файле выпуска.

Примечание 2: Pin-Priority число имеет особое значение. Проверьте apt_preferenceстраницу руководства для деталей.

Анвар
источник
Закрепление совершенно бесполезно, если в репо вы пытаетесь избежать новой упаковки. То есть большую часть времени.
bviktor
7

Альтернатива на основе графического интерфейса - открыть центр программного обеспечения и выбрать «Правка»> «Источники программного обеспечения».

Программные источники с выбранной вкладкой программного обеспечения Ubuntu

Источники программного обеспечения с выбранной вкладкой другого программного обеспечения

все, что вам нужно сделать, это снять отметки с репозиториев, из которых вы не хотите получать обновления.

Надеюсь это поможет

Аллан
источник
5

Очевидный выбор - изменить /etc/apt/sources.listи закомментировать все остальные репозитории, а затем запустить

apt-get update && apt-get upgrade && apt-get autoclean

А затем удалите комментарии от sources.list. Возможно, не самый лучший способ, но, по крайней мере, на apt-getстраницах руководства не указано, как это сделать.

В примечании, связанном с этим, например, процесс обновления дистрибутива Ubuntu отключает все сторонние репозитории во время обновления (и не просто запускайте какую-либо опцию, чтобы временно исключить их).

Олли
источник
1

Еще один вариант графического интерфейса - просто выбрать источник в менеджере пакетов Synaptic.

  1. Найдите имя пакета, который вы хотите установить
  2. Нажмите кнопку происхождения
  3. Выберите репозиторий, из которого вы хотите установить
  4. Выберите пакеты
  5. Подать заявление
Woot
источник