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

225

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

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

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

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

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

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

ayckoster
источник

Ответы:

228

Вы можете использовать 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
фейдер
источник
46
как узнать какие версии доступны?
Родриго Гургель
12
@Rodrigo Gurgel, "aptitude
version
3
@ user169015 "версия существует"! = "версия упакована для Ubuntu и доступна вместе с apt"
Кайл Странд,
Привет, Кайл, я не получил твой комментарий, хотя да, пакет также можно установить с помощью apt. Я просто придерживаюсь способности, потому что давно использую это ... :)
user169015
6
@ user169015 Я думаю, что вы упускаете смысл комментария Кайла. Посмотрите на ответ Псуси ниже. Очевидно, что репозитории Ubuntu APT не продолжают размещать старые версии пакетов! Таким образом, в отличие от менеджеров пакетов времени выполнения (pip, gem, maven и т. Д.), Вы не можете полагаться на репозитории Ubuntu APT, если хотите восстановить старую, заведомо исправную конфигурацию. Я был удивлен и разочарован, осознав это сам. Может, Арч справится с этим лучше? ( Askubuntu.com/questions/728439/... )
водорослевые
66

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

sudo apt-cache madison ^apache2

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

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

sudo apt-get install apache2=2.2\*

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

dpkg -l 'apache2*' | grep ^i
kenorb
источник
5
Большое спасибо за указание на =2.2\*опцию как способ использовать подстановочный знак для выбора любой доступной подрывной деятельности. Это то, что я хотел знать, но не знал, как спросить :)
aexl
3
При перечислении версий, использующих номер dpkg -l <packageName>, номер версии иногда усекается. Чтобы избежать этого, используйтеCOLUMNS=100 dpkg -l <packageName>
CJBS
На Yakkety первая команда просто дает мне:N: Unable to locate package ^apache2
Джесси Глик
@JesseGlick Запустить sudo apt-get updateпервым. Убедитесь, что вы правильно настроили источники Apt.
Кенорб
1
N: Невозможно найти пакет ^ apache2 после обновления $ sudo apt-get, но sudo apt-get install apache2 = 2.2 * работает для меня
Брайан Меллор
17

Я расширю более ранние ответы с другими удобными командами управления версиями в 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.
GSF
источник
6

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

psusi
источник
25
Мне нужно это, чтобы воспроизвести точные копии старых сред для целей разработки. Можно ли настроить зеркало, которое не удаляет старые версии пакетов, для доступа к необходимым пакетам или мне нужно настроить несколько репозиториев, которые содержат только diff?
айкостер
19
@psusi: Не совсем честный ответ, может быть много причин. В моем случае более новая версия может действительно иметь ошибку, и для двойной проверки в этом случае необходима более старая версия. Просто пример.
Cookie
2
@ nomen, нет, это единственный дистрибутив, который не использует модель с периодическим выпуском. Особое внимание уделяется обеспечению того, чтобы, когда критические ошибки и уязвимости безопасности были исправлены в стабильном выпуске, чтобы они не вызывали регрессий, но если это произошло, то подайте отчет об ошибке, помеченный как регрессионный выпуск, и он будет исправлен или отменен. назад.
psusi
5
@nomen, если вы хотите придумать собственное значение слов, вам будет трудно общаться с другими. Для всех остальных в мире это не то, что представляет собой скользящий выпуск, и скользящий выпуск является полной противоположностью и, таким образом, является взаимоисключающим со стабильным выпуском. И теперь, когда я думаю об этом, оригинальная версия, поставляемая с выпуском, на самом деле хранится в кармане -release, а обновления идут в карман -ddates или -security, поэтому, пока вы не можете вернуться к предыдущему обновлению, вы можно вернуться к первоначально выпущенной версии.
Псуси
5
@psusi: вот еще один для вас. Unison должен всегда быть одинаковой версией на всех машинах. И все же 13.10 это другая версия, чем в 12.04 LTS. Что теперь? Когда вы сталкиваетесь с таким вопросом, получение ответа, например, почему вы хотите это сделать, действительно невероятно бесполезно и трата времени для всех.
Печенье
2

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

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

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

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

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

soger
источник