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


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

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

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

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

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

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


188
2018-01-01 20:39


происхождения




ответы:


Вы можете использовать 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

190
2018-01-01 20:57



как узнать, какие версии доступны? - Rodrigo Gurgel
@Rodrigo Gurgel, "aptitude version apache2" - user169015
@ user169015 "версия существует!! =" версия упакована для Ubuntu и доступна с apt" - Kyle Strand
Привет, Кайл, я не получил ваш комментарий, хотя Да, пакет можно установить с помощью apt. Я просто придерживаюсь способности, потому что я использую это в течение длительного времени ... :) - user169015
@ user169015 Я думаю, что вам не хватает точки комментария Кайла. Посмотрите на ответ psusi ниже. По-видимому, репозитории Ubuntu APT не продолжают размещать старые версии пакетов! Поэтому, в отличие от менеджеров пакетов времени выполнения (pip, gem, maven и т. Д.), Вы не можете полагаться на репозитории Ubuntu APT, если хотите восстановить старую, хорошо известную конфигурацию. Я был удивлен и разочарован, осознав это сам. Может быть, Arch справится с этим лучше? ( askubuntu.com/questions/728439/... ) - algal


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

sudo apt-cache madison ^apache2

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

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

sudo apt-get install apache2=2.2\*

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

dpkg -l 'apache2*' | grep ^i

51
2018-04-01 12:44



Большое спасибо за указание =2.2\* как способ использовать подстановочный знак для выбора любой доступной подрывной деятельности. То, что я хотел знать, но не знал, как спросить :) - aexl
При перечислении версий с использованием dpkg -l <packageName>, номер версии иногда усекается. Чтобы этого избежать, используйте COLUMNS=100 dpkg -l <packageName> - CJBS
На Якнети первая команда просто дает мне: N: Unable to locate package ^apache2 - Jesse Glick
@JesseGlick Run sudo apt-get update первый. Убедитесь, что у вас настроены правильные источники Apt. - kenorb
N: Не удалось найти пакет ^ apache2 после $ sudo apt-get update, но sudo apt-get install apache2 = 2.2 * работает для меня - Braian Mellor


Я расскажу о более ранних ответах с помощью других удобных команд управления версиями в 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.

10
2017-07-15 17:25





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


8
2018-01-02 00:33



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