Come installare specifici pacchetti Ubuntu, con la versione esatta?


225

Voglio installare una nuova macchina virtuale con alcuni pacchetti specificati (nome e versione), che vengono forniti.

Ad esempio apache2 nella versione 2.2.20-1ubuntu1con tutte le dipendenze. Anche se esiste una nuova versione di questo pacchetto sui server, questa dovrebbe essere installata.

La soluzione deve funzionare / ridimensionare con più (n) "configurazioni". Un'altra macchina virtuale potrebbe aver bisogno di una versione precedente di apache2.

Conosco attualmente alcune possibilità che installano i pacchetti esatti, ma non scalano così bene:

  1. Copia tutto *.debmanualmente su ogni macchina virtuale e inserisci: dpkg -i... -> Potrebbe funzionare, ma è molto soggetto a errori. (Script manuali ecc.)
  2. Crea e usa un nuovo repository Ubuntu per ogni installazione. -> Non funziona perché avrei bisogno di n repository.
  3. Configurare la macchina una volta e copiare la VM / creare un'istantanea. -> Non funziona perché avrei bisogno di memorizzare n VM.

Il mio problema potrebbe essere etichettato come gestione delle patch, ma non voglio aggiornare i miei pacchetti alla versione corrente. Il mio obiettivo è installare vecchi pacchetti.

Risposte:


228

Puoi usare apt-getper installare una versione specifica del pacchetto purché sia ​​in un archivio che apt conosce. Dalla apt-getmanpage:

Una versione specifica di un pacchetto può essere selezionata per l'installazione seguendo il nome del pacchetto con un uguale e la versione del pacchetto da selezionare. Ciò farà sì che quella versione venga individuata e selezionata per l'installazione. In alternativa, è possibile selezionare una distribuzione specifica seguendo il nome del pacchetto con una barra e la versione della distribuzione o il nome dell'archivio (stabile, congelato, instabile).

Ad esempio, potresti fare:

sudo apt-get install apache2=2.2.20-1ubuntu1

Si noti che in questo caso potrebbe essere necessario eseguire autonomamente una risoluzione delle dipendenze, ma se ci sono problemi apt-get ti dirà cosa li sta causando. Sul mio sistema 11.10 avrei bisogno di fare quanto segue per farlo funzionare:

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
come sapere quali versioni sono disponibili?
Rodrigo Gurgel,

12
@Rodrigo Gurgel, "aptitude versioni apache2"
user169015

3
@utente169015 "versione esiste"! = "la versione è pacchettizzata per Ubuntu e disponibile con apt"
Kyle Strand

Ciao Kyle, non ho ricevuto il tuo commento, anche se Sì, il pacchetto può essere installato anche tramite apt. Mi attengo solo con attitudine perché lo uso da molto tempo ... :)
user169015

6
@ user169015 Penso che ti stia perdendo il punto del commento di Kyle. Dai un'occhiata alla risposta di psusi di seguito. Apparentemente i repository APT di Ubuntu non continuano a ospitare vecchie versioni di pacchetti! Quindi, diversamente dai gestori di pacchetti runtime (pip, gem, maven, ecc.), Non si può fare affidamento sui repository APT di Ubuntu se si desidera ricostituire una vecchia configurazione nota. Sono stato sorpreso e deluso di rendermene conto da solo. Forse Arch lo gestisce meglio? ( Askubuntu.com/questions/728439/... )
delle alghe

66

Per verificare quali versioni sono disponibili, è possibile verificare tramite:

sudo apt-cache madison ^apache2

Se non funziona, considera di eseguire sudo apt-get updateprima di aggiornare l'elenco dei pacchetti.

Quindi copiare la versione o utilizzare la sintassi seguente:

sudo apt-get install apache2=2.2\*

Per verificare quale versione hai installato, esegui:

dpkg -l 'apache2*' | grep ^i

5
Grazie mille per aver indicato l' =2.2\*opzione come modo di utilizzare un carattere jolly per selezionare qualsiasi sovversione disponibile. Questo è quello che volevo sapere ma non sapevo come chiedere :)
aexl

3
Quando si elencano le versioni utilizzando dpkg -l <packageName>, il numero di versione viene talvolta troncato. Per evitare ciò, utilizzareCOLUMNS=100 dpkg -l <packageName>
CJBS il

Su Yakkety, il primo comando mi dà solo:N: Unable to locate package ^apache2
Jesse Glick il

@JesseGlick Esegui sudo apt-get updateprima. Assicurati di aver configurato le giuste fonti Apt.
Kenorb,

1
N: Impossibile trovare il pacchetto ^ apache2 dopo $ sudo apt-get update ma sudo apt-get install apache2 = 2.2 * funziona per me
Braian Mellor

17

Espanderò le risposte precedenti con altri utili comandi di controllo delle versioni della aptfamiglia. Per vedere quali versioni sono disponibili, eseguire 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

Quindi, come menzionato altrove, installa una versione specifica con apt-get:

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

Ora puoi vedere quale versione hai installato eseguendo di apt-cache policynuovo:

# 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

Se non si desidera installare versioni più recenti sugli aggiornamenti, aggiungere il pacchetto con apt-mark:

# apt-mark hold apache2
apache2 set on hold.

Diciamo che una nuova versione di apache2 viene aggiunta all'indice del pacchetto e il tuo computer è sincronizzato apt-get update. Lo vedrai alla prossima corsa 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

In pratica, questo non è possibile perché le vecchie versioni non sono conservate nell'archivio, quindi a meno che tu non abbia una copia della vecchia versione che giace da qualche parte, non puoi installarla. Dovresti chiederti perché vuoi installare una versione precedente in primo luogo. In una versione stabile, il motivo principale per il rilascio di una nuova versione è correggere una vulnerabilità di sicurezza e non si desidera eseguire un server vulnerabile, vero?


25
Ne ho bisogno per riprodurre copie esatte di vecchi ambienti a scopo di sviluppo. È possibile impostare un mirror che non elimina le versioni precedenti dei pacchetti per accedere ai pacchetti richiesti o devo impostare più repository che contengono solo differenze?
Ayckoster,

19
@psusi: non esattamente una risposta equa, potrebbero esserci molte ragioni. Nel mio caso, la versione più recente potrebbe effettivamente avere un bug e per ricontrollare è necessario la versione precedente. Solo un esempio
Cookie del

2
@nomen, no, è un'unica distro che non utilizza un modello a rilascio progressivo . Si presta molta attenzione a garantire che quando i bug critici e le vulnerabilità di sicurezza vengono corretti nella versione stabile, non causino regressioni, ma in tal caso, archiviare una segnalazione di bug contrassegnata con rilascio di regressione e verrà risolta o aggiornata indietro.
psusi,

5
@nomen, se vuoi inventare i tuoi significati per le parole, avrai difficoltà a comunicare con gli altri. Per tutti gli altri nel mondo, non è questo il rilascio progressivo e il rilascio progressivo è esattamente l'opposto, e quindi si escludono a vicenda con un rilascio stabile. E ora che ci penso, la versione originale fornita con il rilascio è in realtà conservata nella tasca del rilascio, e gli aggiornamenti passano alla tasca dei aggiornamenti o della sicurezza, quindi mentre non puoi tornare a un aggiornamento precedente, tu può tornare alla versione originariamente rilasciata.
psusi,

5
@psusi: eccone un altro per te. È necessario che Unison sia sempre la stessa versione su tutte le macchine. Tuttavia, il 13.10 è una versione diversa rispetto a quella del 12.04 LTS. E ora? Quando si arriva a una domanda come questa, ricevere una risposta come perché si vuole fare questo è davvero incredibilmente inutile e una perdita di tempo per tutti.
Cookie

2

Come spiega psusi, le vecchie versioni non sono conservate nel repository di Ubuntu, ma apparentemente puoi ancora trovarle sul launchpad. Quindi, vai a (sostituisci fidato e amd64 con la tua versione e architettura ubuntu):

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

e seleziona la versione che desideri. Quindi scaricare il deb come file e installarlo con:

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

Ancora una volta, sostituisci il nome del file nel tuo file. Questo diventa noioso se devi effettuare il downgrade di molti pacchetti, ma è meglio di niente se sei disperato.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.