Jak zainstalować określone pakiety Ubuntu z dokładną wersją?

224

Chcę skonfigurować nową maszynę wirtualną z określonymi pakietami (nazwa i wersja), które są dostarczone.

Na przykład apache2 w wersji 2.2.20-1ubuntu1ze wszystkimi zależnościami. Nawet jeśli na serwerach znajduje się nowa wersja tego pakietu, należy go zainstalować.

Rozwiązanie musi działać / skalować z wieloma (n) „konfiguracjami”. Inna maszyna wirtualna może wymagać starszej wersji apache2.

Obecnie znam niektóre możliwości instalowania dokładnych pakietów, ale nie skaluję tak dobrze:

  1. Skopiuj wszystkie wymagane *.debręcznie do każdej maszyny wirtualnej i wprowadź: dpkg -i... -> Może działać, ale jest to bardzo podatne na błędy. (Skrypty ręczne itp.)
  2. Utwórz i używaj nowego repozytorium Ubuntu dla każdej konfiguracji. -> Nie działa, ponieważ potrzebowałbym n repozytoriów.
  3. Skonfiguruj maszynę raz i skopiuj maszynę wirtualną / utwórz migawkę. -> Nie działa, ponieważ musiałbym przechowywać n maszyn wirtualnych.

Mój problem można nazwać zarządzaniem łatkami, ale nie chcę aktualizować pakietów do bieżącej wersji. Moim celem jest instalacja starych pakietów.

ayckoster
źródło

Odpowiedzi:

227

Możesz użyć apt-getdo zainstalowania określonej wersji pakietu, o ile znajduje się on w archiwum, o którym wie apt. Z strony apt-getpodręcznika:

Konkretną wersję pakietu można wybrać do instalacji, postępując zgodnie z nazwą pakietu równą i wersją pakietu do wyboru. Spowoduje to zlokalizowanie i wybranie tej wersji do instalacji. Alternatywnie można wybrać konkretną dystrybucję, podążając za nazwą ukośnika i wersją dystrybucji lub nazwą archiwum (stabilny, zamrożony, niestabilny).

Na przykład możesz wykonać:

sudo apt-get install apache2=2.2.20-1ubuntu1

Zauważ, że w tym przypadku może być konieczne samodzielne rozwiązanie zależności, ale jeśli pojawią się jakiekolwiek problemy, apt-get powie ci, co je powoduje. W moim systemie 11.10 musiałbym wykonać następujące czynności, aby to zadziałało:

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
fader
źródło
46
jak wiedzieć, które wersje są dostępne?
Rodrigo Gurgel
12
@Rodrigo Gurgel, „aptitude wersje apache2”
user169015
3
@ user169015 „Wersja istnieje”! = „Wersja jest spakowana dla Ubuntu i dostępna z apt
Kyle Strand
Cześć Kyle, nie dostałem twojego komentarza, chociaż Tak, pakiet można również zainstalować za pomocą apt. Po prostu trzymam się aptitude, ponieważ używam tego od dłuższego czasu ... :)
user169015
6
@ user169015 Myślę, że nie rozumiesz sedna komentarza Kyle'a. Spójrz na odpowiedź psusi poniżej. Najwyraźniej repozytoria APT Ubuntu nadal nie obsługują starych wersji pakietów! W przeciwieństwie do menedżerów pakietów uruchomieniowych (pip, gem, maven itp.) Nie można polegać na repozytoriach APT Ubuntu, jeśli chce się odtworzyć starą, znaną dobrą konfigurację. Byłem zaskoczony i rozczarowany, gdy zdałem sobie z tego sprawę. Może Arch radzi sobie z tym lepiej? ( Askubuntu.com/questions/728439/... )
glonów
66

Aby sprawdzić, które wersje są dostępne, możesz sprawdzić za pomocą:

sudo apt-cache madison ^apache2

Jeśli nie zadziała, rozważ uruchomienie sudo apt-get updateprzed aktualizacją listy pakietów.

Następnie skopiuj wersję lub użyj następującej składni:

sudo apt-get install apache2=2.2\*

Aby sprawdzić, którą wersję zainstalowałeś, uruchom:

dpkg -l 'apache2*' | grep ^i
kenorb
źródło
5
Bardzo dziękuję za wskazanie =2.2\*opcji jako sposobu użycia symbolu wieloznacznego do wyboru dowolnej dostępnej subversion. Właśnie to chciałem wiedzieć, ale nie wiedziałem, jak zapytać :)
aexl 16.04.15
3
Podczas wyświetlania wersji przy użyciu dpkg -l <packageName>numer wersji jest czasami obcinany. Aby tego uniknąć, użyjCOLUMNS=100 dpkg -l <packageName>
CJBS
W Yakkety pierwsze polecenie daje mi:N: Unable to locate package ^apache2
Jesse Glick
@JesseGlick Uruchom jako sudo apt-get updatepierwszy. Upewnij się, że masz skonfigurowane odpowiednie źródła Apt.
kenorb
1
N: Nie można zlokalizować pakietu ^ apache2 po aktualizacji $ sudo apt-get, ale sudo apt-get install apache2 = 2.2 * działa dla mnie
Braian Mellor
17

Rozbuduję wcześniejsze odpowiedzi innymi przydatnymi poleceniami wersjonowania w aptrodzinie. Aby zobaczyć, które wersje są dostępne, uruchom 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

Następnie, jak wspomniano w innym miejscu, zainstaluj konkretną wersję za pomocą apt-get:

# apt-get install apache2=2.4.7-1ubuntu4.5
...

Teraz możesz zobaczyć, którą wersję zainstalowałeś, uruchamiając apt-cache policyponownie:

# 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

Jeśli nie chcesz, aby nowsze aktualizacje były instalowane na aktualizacjach, przypnij pakiet za pomocą apt-mark:

# apt-mark hold apache2
apache2 set on hold.

Powiedzmy, że nowa wersja apache2 została dodana do indeksu pakietu i twój komputer jest zsynchronizowany apt-get update. Zobaczysz to przy następnym uruchomieniu 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
źródło
6

Praktycznie rzecz biorąc, nie jest to możliwe, ponieważ stare wersje nie są przechowywane w archiwum, więc jeśli nie masz gdzieś kopii starej wersji, nie możesz jej zainstalować. Powinieneś się zastanawiać, dlaczego chcesz zainstalować starszą wersję. W wersji stabilnej głównym powodem wydania nowej wersji jest usunięcie luki w zabezpieczeniach, a nie chcesz, aby serwer był podatny na zagrożenia?

psusi
źródło
25
Potrzebuję tego do odtworzenia dokładnych kopii starych środowisk do celów programistycznych. Czy jest możliwe skonfigurowanie kopii dystrybucyjnej, która nie usuwa starych wersji pakietów w celu uzyskania dostępu do wymaganych pakietów, czy też muszę skonfigurować wiele repozytoriów zawierających tylko pliki różnic?
ayckoster
19
@psusi: Niezupełnie uczciwa odpowiedź, może być wiele przyczyn. W moim przypadku nowsza wersja może rzeczywiście zawierać błąd, i aby to sprawdzić dwukrotnie, potrzebna jest starsza wersja. Tylko przykład.
Cookie
2
@ nomen, nie, jest to pojedyncza dystrybucja, która nie korzysta z modelu wersji release. Szczególną uwagę przywiązuje się do tego, aby krytyczne błędy i luki w zabezpieczeniach zostały usunięte w stabilnej wersji, aby nie powodowały regresji, ale jeśli tak się stanie, zgłoś zgłoszenie błędu oznaczone jako wydanie regresyjne, które zostanie naprawione lub zrolowane plecy.
psusi
5
@ nomen, jeśli chcesz nadać swoje znaczenie słowom, trudno ci będzie komunikować się z innymi. Dla wszystkich na świecie nie jest to ciągłe wydawanie, a wydawanie ciągłe jest dokładnie odwrotne, a zatem wzajemnie wykluczające się ze stabilnym wydawaniem. A teraz, gdy o tym myślę, oryginalna wersja dostarczona z wydaniem jest faktycznie przechowywana w kieszeni -release, a aktualizacje trafiają do kieszeni -updates lub -security, więc chociaż nie możesz wrócić do poprzedniej aktualizacji, może wrócić do pierwotnie wydanej wersji.
psusi
5
@psusi: Oto kolejny dla ciebie. Unison musi być zawsze tą samą wersją na wszystkich komputerach. Jednak w dniu 13.10 jest to inna wersja niż w 12.04 LTS. I co teraz? Kiedy przychodzisz na takie pytanie, otrzymywanie odpowiedzi typu „dlaczego chcesz to zrobić” jest naprawdę nieskuteczne i jest stratą czasu dla wszystkich.
Cookie
2

Jak wyjaśnia psusi, stare wersje nie są przechowywane w repozytorium ubuntu, ale najwyraźniej nadal można je znaleźć na starterze. Idź do (zamień zaufany i amd64 na swoją wersję i architekturę Ubuntu):

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

i wybierz żądaną wersję. Następnie pobierasz deb jako plik i instalujesz za pomocą:

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

Ponownie zamień nazwę pliku na swój plik. To staje się nużące, jeśli musisz obniżyć liczbę pakietów, ale lepiej niż nic, jeśli jesteś zdesperowany.

soger
źródło