Как установить конкретные пакеты Ubuntu с точной версией?

Я хочу настроить новую виртуальную машину с некоторыми указанными пакетами (имя и версия), которые предоставляются.

Например, apache2 в версии 2.2.20-1ubuntu1 со всеми зависимостями. Даже если на серверах есть новая версия этого пакета, она должна быть установлена.

Решение должно работать / масштабироваться с несколькими (n) "настройками". Другой виртуальной машине может потребоваться более старая версия apache2.

В настоящее время я знаю о некоторых возможностях, которые устанавливают точные пакеты, но не настолько хорошо масштабируются:

  1. Скопируйте все необходимые *.deb к каждой виртуальной машине вручную и введите: dpkg -i> ... - Может сработать, но это очень подвержено ошибкам. (Ручные скрипты и т.д.)
  2. >Создайте и используйте новый репозиторий Ubuntu для каждой установки. - Не работает, потому что мне понадобилось бы n репозиториев.
  3. >Настройте машину один раз и скопируйте виртуальную машину / создайте моментальный снимок. - Не работает, потому что мне нужно было бы хранить n виртуальных машин.

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

Вы можете использовать apt-get чтобы установить определенную версию пакета, пока он находится в архиве, о котором apt знает. Из apt-get manpage:

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

Например, вы могли бы сделать:

sudo apt-get install apache2=2.2.20-1ubuntu1

Обратите внимание, что в этом случае вам, возможно, потребуется самостоятельно устранить некоторые зависимости, но если возникнут какие-либо проблемы, apt-get сообщит вам, что их вызывает. В моей системе 11.10 мне нужно было бы сделать следующее, чтобы заставить это работать:

sudo apt-get install apache2=2.2.20-1ubuntu1 \                     apache2.2-common=2.2.20-1ubuntu1 \                     apache2.2-bin=2.2.20-1ubuntu1 \                     apache2-mpm-worker=2.2.20-1ubuntu1

Доступные версии пакетов можно отобразить следующим образом:

sudo apt list -a apache2

Чтобы проверить, какие версии доступны, вы можете проверить через:

sudo apt-cache madison ^apache2

Если это не сработает, подумайте о запуске sudo apt-get update прежде чем обновлять список пакетов.

Затем скопируйте версию или используйте следующий синтаксис:

sudo apt-get install apache2=2.2.\*

Чтобы проверить, какая версия у вас установлена, запустите:

dpkg -l 'apache2*' | grep ^i

Если информация о версии усечена, попробуйте:

COLUMNS=100 dpkg -l <packageName>

Я расширю более ранние ответы с помощью других удобных команд управления версиями в apt семья. Чтобы узнать, какие версии доступны, запустите apt-cache policy:

# apt-cache policy apache2apache2:  Installed: (none)  Candidate: 2.4.7-1ubuntu4.5  Version table:     2.4.10-1ubuntu1.1~ubuntu14.04.1 0        100 http://us.archive.ubuntu.com/ubuntu/ trusty-backports/main amd64 Packages     2.4.7-1ubuntu4.5 0        500 http://security.ubuntu.com/ubuntu/ trusty-security/main amd64 Packages     2.4.7-1ubuntu4 0        500 http://us.archive.ubuntu.com/ubuntu/ trusty/main amd64 Packages

Затем, как упоминалось в другом месте, установите определенную версию с apt-get:

# apt-get install apache2=2.4.7-1ubuntu4.5...

Теперь вы можете увидеть, какая версия у вас установлена, запустив apt-cache policy снова:

# apt-cache policy apache2apache2:  Installed: 2.4.7-1ubuntu4.5  Candidate: 2.4.7-1ubuntu4.5  Version table:     2.4.10-1ubuntu1.1~ubuntu14.04.1 0        100 http://us.archive.ubuntu.com/ubuntu/ trusty-backports/main amd64 Packages *** 2.4.7-1ubuntu4.5 0        500 http://security.ubuntu.com/ubuntu/ trusty-security/main amd64 Packages        100 /var/lib/dpkg/status     2.4.7-1ubuntu4 0        500 http://us.archive.ubuntu.com/ubuntu/ trusty/main amd64 Packages

Если вы не хотите, чтобы новые версии устанавливались при обновлении, закрепите пакет с помощью apt-mark:

# apt-mark hold apache2apache2 set on hold.

Допустим, новая версия apache2 добавлена в индекс пакета, и ваш компьютер синхронизирован с apt-get update. Вы увидите это при следующем запуске apt-get upgrade:

# apt-get upgradeReading package lists... DoneBuilding dependency tree       Reading state information... DoneCalculating upgrade... DoneThe following packages have been kept back:  apache20 upgraded, 0 newly installed, 0 to remove and 1 not upgraded.

Как объясняет psusi, старые версии не хранятся в репозитории ubuntu, но, по-видимому, вы все еще можете найти их на launchpad. Итак, вы переходите к (замените ubuntu и amd64 на вашу версию и архитектуру ubuntu):

https://launchpad.net/ubuntu/trusty/amd64/apache2

и выберите желаемую версию. Затем вы загружаете deb в виде файла и устанавливаете с помощью:

dpkg -i apache2_2.4.7-1ubuntu4.20_amd64.deb

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

Практически говоря, это невозможно, потому что старые версии не хранятся в архиве, поэтому, если у вас где-то не лежит копия старой версии, вы не сможете ее установить. Вы должны спросить себя, почему вы хотите установить более старую версию в первую очередь. В стабильном выпуске основной причиной выпуска новой версии является исправление уязвимости в системе безопасности, а вы же не хотите запускать уязвимый сервер, не так ли?