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


225

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

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

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

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

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

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

Ответы:


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

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.

6

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


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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.