Как установить конкретные пакеты Ubuntu с точной версией?
Я хочу настроить новую виртуальную машину с некоторыми указанными пакетами (имя и версия), которые предоставляются.
Например apache2 в версии 2.2.20-1ubuntu1
со всеми зависимостями. Даже если на серверах установлена новая версия этого пакета, его следует установить.
Решение должно работать / масштабироваться с несколькими (n) "настройками". Для другой виртуальной машины может потребоваться более старая версия apache2.
В настоящее время я знаю о некоторых возможностях, которые устанавливают точные пакеты, но не так хорошо масштабируются:
- Скопируйте все необходимое
*.deb
вручную на каждую виртуальную машину и введите:dpkg -i
... -> Может работать, но это очень подвержено ошибкам. (Ручные сценарии и т. Д.) - Создайте и используйте новый репозиторий Ubuntu для каждой настройки. -> Не работает, потому что мне нужны были бы репозитории.
- Настройте машину один раз и скопируйте ВМ / создайте снимок. -> Не работает, потому что мне нужно хранить виртуальные машины.
Моя проблема может быть помечена как управление исправлениями, но я не хочу обновлять свои пакеты до текущей версии. Моя цель - установить старые пакеты.
6 ответов
Ты можешь использовать apt-get
установить конкретную версию пакета, если она находится в архиве, о котором знает apt. От apt-get
страница руководства:
Конкретную версию пакета можно выбрать для установки, указав после имени пакета равные и версию пакета для выбора. Это приведет к тому, что эта версия будет найдена и выбрана для установки. В качестве альтернативы можно выбрать конкретный дистрибутив, следуя имени пакета с косой чертой и версией дистрибутива или именем архива (стабильный, замороженный, нестабильный).
Например, вы можете сделать:
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-cache madison ^apache2
Если не получится, подумайте о беге sudo apt-get update
прежде чем обновить список пакетов.
Затем скопируйте версию или используйте следующий синтаксис:
sudo apt-get install apache2=2.2\*
Чтобы проверить, какую версию вы установили, запустите:
dpkg -l 'apache2*' | grep ^i
Я расширю предыдущие ответы с помощью других удобных команд управления версиями в apt
семьи. Чтобы увидеть, какие версии доступны, запустите apt-cache policy
:
# apt-cache policy apache2
apache2:
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 apache2
apache2:
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 apache2
apache2 set on hold.
Допустим, в индекс пакета добавлена новая версия apache2, и ваша машина синхронизируется с apt-get update
, Вы увидите это при следующем запуске apt-get upgrade
:
# apt-get upgrade
Reading package lists... Done
Building dependency tree
Reading state information... Done
Calculating upgrade... Done
The following packages have been kept back:
apache2
0 upgraded, 0 newly installed, 0 to remove and 1 not upgraded.
Как объясняет psusi, старые версии не хранятся в репозитории Ubuntu, но, очевидно, вы все равно можете найти их на панели запуска. Итак, вы идете (замените trusty и amd64 на вашу версию и архитектуру Ubuntu):
https://launchpad.net/ubuntu/trusty/amd64/apache2
и выберите версию, которую вы хотите. Затем вы загружаете deb в виде файла и устанавливаете с:
dpkg -i apache2_2.4.7-1ubuntu4.20_amd64.deb
Снова замените имя файла в вашем файле. Это утомительно, если вам приходится понижать рейтинг многих пакетов, но лучше, чем ничего, если вы в отчаянии.
На практике это невозможно, потому что старые версии не хранятся в архиве, поэтому, если у вас нет копии старой версии, вы не сможете ее установить. Вы должны спросить себя, почему вы хотите установить старую версию в первую очередь. В стабильном выпуске основной причиной выпуска новой версии является исправление уязвимости безопасности, а вы не хотите запускать уязвимый сервер?
Также рассмотрите возможность использования подстановочных знаков для младшей версии.
Я только сегодня узнал, что второстепенные версии PPA иногда удаляются и заменяются другими. Например, недавно произошло удаление
Git PPA https://launchpad.net/~git-core/+archive/ubuntu/ppa .1:2.36.0-0ppa1~ubuntu20.04.1
и заменил его на
1:2.36.1-0ppa1~ubuntu20.04.1
. Затем это сломало некоторые настройки Docker, которые у меня были.
К счастью, я обнаружил, что подстановочные знаки работают на
apt install
, поэтому я заменил сломанное:
sudo apt install git=1:2.36.0-0ppa1~ubuntu20.04.1
с:
sudo apt install git='1:2.36.*'
Надеюсь, это позволит моим сценариям работать дольше.