Domanda Come installare specifici pacchetti Ubuntu, con la versione esatta?


Voglio configurare una nuova macchina virtuale con alcuni pacchetti specificati (nome e versione) forniti.

Ad esempio apache2 nella versione 2.2.20-1ubuntu1 con tutte le dipendenze. Anche se c'è una nuova versione di questo pacchetto sui server, questa dovrebbe essere installata.

La soluzione deve funzionare / scalare con più (n) "setup". Un'altra macchina virtuale potrebbe necessitare di una versione precedente di apache2.

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

  1. Copia tutto richiesto *.deb a ogni macchina virtuale manualmente e inserire: dpkg -i ... -> Potrebbe funzionare, ma è molto incline agli errori. (Script manuali ecc.)
  2. Creare e utilizzare un nuovo repository Ubuntu per ogni configurazione. -> 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.


188
2018-01-01 20:39


origine




risposte:


Puoi usare apt-get installare una versione specifica del pacchetto a lungo come in un archivio di cui apt sa. Dal apt-get pagina di manuale:

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. Questo farà sì che quella versione sia localizzata 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 di archivio (stabile, congelato, instabile).

Ad esempio, potresti fare:

sudo apt-get install apache2=2.2.20-1ubuntu1

Nota che in questo caso potresti aver bisogno di fare una risoluzione delle dipendenze, ma se ci sono dei problemi apt-get ti dirà che cosa li sta causando. Sul mio sistema 11.10 dovrei 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

190
2018-01-01 20:57



come sapere quali versioni sono disponibili? - Rodrigo Gurgel
@Rodrigo Gurgel, "aptitude versions apache2" - user169015
@ user169015 "esiste la versione"! = "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 usando apt. Continuo con aptitude perché lo uso da molto tempo ... :) - user169015
@ user169015 Penso che manchi il punto sul commento di Kyle. Dai un'occhiata alla risposta di psusi qui sotto. Apparentemente i repository APT di Ubuntu non continuano ad ospitare vecchie versioni di pacchetti! Quindi, a differenza dei gestori di pacchetti di runtime (pip, gem, maven, ecc.), Non è possibile fare affidamento sui repository APT di Ubuntu se si desidera ricostituire una configurazione vecchia e nota. Sono rimasto sorpreso e deluso di rendermene conto io stesso. Forse Arch lo gestisce meglio? ( askubuntu.com/questions/728439/... ) - algal


Per verificare quali versioni sono disponibili, puoi verificare tramite:

sudo apt-cache madison ^apache2

Se non funziona, considera di correre sudo apt-get update prima di aggiornare l'elenco dei pacchetti.

Quindi copia la versione o utilizza la seguente sintassi:

sudo apt-get install apache2=2.2\*

Per verificare quale versione hai installato, esegui:

dpkg -l 'apache2*' | grep ^i

51
2018-04-01 12:44



Grazie mille per aver segnalato il =2.2\* opzione come modo per utilizzare un carattere jolly per selezionare qualsiasi sovversione disponibile. Questo è quello che volevo sapere ma non sapevo come chiedere :) - aexl
Quando si elencano le versioni usando dpkg -l <packageName>, il numero di versione viene a volte troncato. Per evitare questo, usa COLUMNS=100 dpkg -l <packageName> - CJBS
Su Yakkety, il primo comando mi dà solo: N: Unable to locate package ^apache2 - Jesse Glick
@JesseGlick Esegui sudo apt-get update primo. Assicurati di aver configurato le fonti Apt corrette. - kenorb
N: Impossibile trovare il pacchetto ^ apache2 dopo $ sudo apt-get update ma sudo apt-get install apache2 = 2.2 * funziona per me - Braian Mellor


Espanderò le risposte precedenti con altri pratici comandi di versionamento in apt famiglia. Per vedere quali versioni sono disponibili, esegui 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 apt-cache policy ancora:

# 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 su aggiornamenti, collegare 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 la tua macchina è sincronizzata con 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.

10
2017-07-15 17:25





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


8
2018-01-02 00:33



Ho bisogno di questo per riprodurre copie esatte di vecchi ambienti per scopi di sviluppo. È possibile impostare un mirror che non cancelli le vecchie versioni del pacchetto per accedere ai pacchetti richiesti o devo configurare più repository che mantengano solo diffs? - ayckoster
@psusi: Non è esattamente una risposta giusta, potrebbero esserci molte ragioni. Nel mio caso la versione più recente potrebbe effettivamente avere un bug, e per ricontrollare che è il caso è necessaria la versione precedente. Solo un esempio - Cookie
@nomen, no, è una singola distro che lo fa non utilizzare un modello a rotazione. Viene prestata molta attenzione per garantire che quando errori critici e vulnerabilità di sicurezza siano corretti nella versione stabile, che non causino regressioni, ma se ciò accade, quindi presentare una segnalazione di errore taggata con rilascio di regressione e verrà risolta o laminata indietro. - psusi
@nomen, se vuoi inventare i tuoi significati per le parole, avrai difficoltà a comunicare con gli altri. Per tutti gli altri al mondo, non è quello che è un rolling release, e il rolling release è l'esatto opposto e, quindi, si escludono a vicenda con release stabile. E ora che ci penso, la versione originale fornita con il rilascio è effettivamente conservata nella casella -release, e gli aggiornamenti vanno al -update o alla pocket di sicurezza, quindi mentre non puoi tornare a un aggiornamento precedente, può tornare alla versione originariamente rilasciata. - psusi
@psusi: Eccone un altro per te. Unison è richiesto di essere sempre la stessa versione su tutte le macchine. Eppure il 13.10 è una versione diversa rispetto a 12.04 LTS. E ora? Quando si arriva a una domanda come questa, ricevere una risposta come quella che si vuole fare è davvero incredibilmente inutile e una perdita di tempo per tutti. - Cookie