apt-mark Удерживание пакета до основной версии (не определенной второстепенной)

apt-mark Удерживание пакета до основной версии (не определенной второстепенной)

Я хочу хранить версии пакетов на своих серверах, чтобы предотвратить нарушение работы нашего кода из-за критических изменений в инфраструктуре (например, изменения с mongodb 2.4 на 2.6).

Я знаю, что могу (например) apt-mark hold package, но тогда я перестаю получать исправления безопасности и мелкие обновления.

Также я хотел бы установить пакеты с указанием основной версии (но не второстепенной)

например, я знаю, что могу:

sudo apt-get install -y rabbitmq-server=3.3.5

Но я хочу просто закрепить установку за основной версией (3.*)

Как этого можно добиться?

решение1

Вы можете прикрепить к подстановочному набору номеров версий. Смотретьman apt_preferencesнапример:

Специфическая форма назначает приоритет ("Pin-Priority") одному или нескольким указанным пакетам с указанной версией или диапазоном версий. Например, следующая запись назначает высокий приоритет всем версиям пакета perl, номер версии которых начинается с "5.10". Несколько пакетов могут быть разделены пробелами.

Package: perl
Pin: version 5.10*
Pin-Priority: 1001

Так, например, в Ubuntu 16.04, где xenial-backportsприоритет по умолчанию равен 100, начальная политика debhelperвыглядит так:

$ apt-cache policy debhelper
debhelper:
  Installed: 9.20160115ubuntu3
  Candidate: 9.20160115ubuntu3
  Version table:
     10.2.2ubuntu1~ubuntu16.04.1 100
        100 http://jp.archive.ubuntu.com/ubuntu xenial-backports/main amd64 Packages
        100 http://jp.archive.ubuntu.com/ubuntu xenial-backports/main i386 Packages
 *** 9.20160115ubuntu3 500
        500 http://jp.archive.ubuntu.com/ubuntu xenial/main amd64 Packages
        500 http://jp.archive.ubuntu.com/ubuntu xenial/main i386 Packages
        100 /var/lib/dpkg/status

Затем я присвоил бэкпортам более высокий приоритет:

$ cat /etc/apt/preferences.d/debhelper
Package: *
Pin: release v=16.04,o=Ubuntu,a=xenial-backports,n=xenial,l=Ubuntu,c=main,b=amd64
Pin-Priority: 600

$ apt-cache policy debhelper
debhelper:
  Installed: 9.20160115ubuntu3
  Candidate: 10.2.2ubuntu1~ubuntu16.04.1
  Version table:
     10.2.2ubuntu1~ubuntu16.04.1 600
        600 http://jp.archive.ubuntu.com/ubuntu xenial-backports/main amd64 Packages
        100 http://jp.archive.ubuntu.com/ubuntu xenial-backports/main i386 Packages
 *** 9.20160115ubuntu3 500
        500 http://jp.archive.ubuntu.com/ubuntu xenial/main amd64 Packages
        500 http://jp.archive.ubuntu.com/ubuntu xenial/main i386 Packages

Снова закрепляем 9.*версии с debhelperеще более высоким приоритетом:

$ cat /etc/apt/preferences.d/debhelper
Package: *
Pin: release v=16.04,o=Ubuntu,a=xenial-backports,n=xenial,l=Ubuntu,c=main,b=amd64
Pin-Priority: 600

Package: debhelper
Pin: version 9.*
Pin-Priority: 800

$ apt-cache policy debhelper
debhelper:
  Installed: 9.20160115ubuntu3
  Candidate: 9.20160115ubuntu3
  Version table:
     10.2.2ubuntu1~ubuntu16.04.1 600
        600 http://jp.archive.ubuntu.com/ubuntu xenial-backports/main amd64 Packages
        100 http://jp.archive.ubuntu.com/ubuntu xenial-backports/main i386 Packages
 *** 9.20160115ubuntu3 800
        500 http://jp.archive.ubuntu.com/ubuntu xenial/main amd64 Packages
        500 http://jp.archive.ubuntu.com/ubuntu xenial/main i386 Packages
        100 /var/lib/dpkg/status

Итак, вам просто нужно создать файл, в /etc/apt/preferences.d/котором есть:

Package: rabbitmq-server
Pin: version 3.*
Pin-Priority: 1001

Ни один репозиторий не имеет приоритета выше 1000 по умолчанию, 1001 достаточно, чтобы заставить apt понизить версию при необходимости:

P >= 1000 приводит к установке версии, даже если это означает понижение версии пакета.

Связанный контент