Як встановити конкретні пакети Ubuntu з точною версією?


224

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

Наприклад, apache2 у версії 2.2.20-1ubuntu1з усіма залежностями. Навіть якщо на серверах є нова версія цього пакету, його слід встановити.

Рішення має працювати / масштабуватись з декількома (n) "налаштуваннями". Іншій віртуальній машині може знадобитися старіша версія apache2.

Наразі я знаю деякі можливості, які встановлюють точні пакети, але це не так:

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

Мою проблему можна позначати як управління патчем, але я не хочу оновлювати свої пакети до поточної версії. Моя мета - встановити старі пакети.

Відповіді:


227

Ви можете використовувати 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, "версії придатності apache2"
користувач169015

3
@ user169015 "версія існує"! = "Версія упакована для Ubuntu та доступна в apt"
Kyle Strand

Привіт, Кайл, я не отримав ваш коментар, хоча так, пакет також можна встановити за допомогою apt. Я просто дотримуюсь здатності, тому що я цим уже давно користуюся ... :)
user169015

6
@ user169015 Я думаю, що ви пропустили точку в коментарі Кайла. Подивіться відповідь psusi нижче. Мабуть, сховища 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.
kenorb

1
N: Неможливо знайти пакет ^ apache2 після оновлення $ sudo apt-get update, але sudo apt-get install apache2 = 2.2 * працює для мене
Braian Mellor

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
Мені це потрібно для відтворення точних копій старих середовищ для цілей розвитку. Чи можна встановити дзеркало, яке не видаляє старі версії пакетів, щоб отримати доступ до потрібних пакетів чи мені потрібно встановити кілька сховищ, які містять лише різні файли?
ayckoster

19
@psusi: Не зовсім справедлива відповідь, може бути багато причин. У моєму випадку в новій версії може бути помилка, і для повторної перевірки це потрібна стара версія. Просто приклад.
Cookie

2
@nomen, ні, це єдиний дистрибутив, який не використовує прокатну модель випуску. Дуже обережно слідкуйте за тим, щоб, коли критичні помилки та вразливості безпеки були виправлені в стабільному випуску, щоб вони не викликали регресії, але якщо це все-таки трапиться, тоді подайте звіт про помилку з тегом регресії-випуску, і він буде виправлений або прокручений назад.
psusi

5
@nomen, якщо ви хочете скласти свої значення для слів, вам буде важко спілкуватися з іншими. Для всіх інших у світі, це не те, що є прокатним випуском, а прокатний випуск є прямо протилежним, і, таким чином, взаємовиключним із стабільним випуском. І тепер, коли я замислююся над цим, оригінальна версія, що постачається з випуском, насправді зберігається в кишені випуску, а оновлення йдуть до кишені оновлень або безпеки, тому, поки ви не можете повернутися до попереднього оновлення, ви може повернутися до первісно випущеної версії.
psusi

5
@psusi: Ось ще одна для вас. Unison зобов’язаний завжди бути однаковою версією на всіх машинах. Але 13.10 це вже інша версія, ніж у 12.04 LTS. То тепер що? Якщо ви прийшли до подібного питання, отримання відповіді на кшталт того, чому ви хочете це зробити, насправді неймовірно не допомагає і марно витрачає час на всіх.
Cookie

2

Як пояснює psusi, старі версії не зберігаються у сховищі ubuntu, але, мабуть, ви все ще можете їх знайти на панелі запуску. Отже, ви переходите до (заміняйте довіру та amd64 на свою версію та архітектуру ubuntu):

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

і виберіть бажану версію. Потім ви завантажуєте деб як файл і встановлюєте за допомогою:

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

Знову замініть ім’я файлу на ваш файл. Це стає нудним, якщо вам доведеться знизити багато пакетів, але це краще, ніж нічого, якщо ви відчайдушно.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.