Come traccia i pacchetti installati su Ubuntu (Linux)?


38

(Questa domanda è molto simile alla 10458. È stato suggerito che Fedora e Ubuntu / Debian sono abbastanza diversi da giustificare risposte diverse).

Man mano che utilizzo qualsiasi installazione di Ubuntu, installo gradualmente diversi pacchetti oltre l'installazione di base. Se reinstallo o se devo installare una nuova macchina, di solito desidero reinstallare quei pacchetti specifici e voglio farlo velocemente per tornare al lavoro con un minimo di seccatura. Per quanto ho visto tutti i gestori di pacchetti ( apt-get, aptitudee synaptic) può mi quale sono installati i pacchetti dire, e tutti hanno i registri (seppur diversi per ogni strumento, che è una seccatura). Ma nessuno di loro può dirmi quali pacchetti hoinstallato, al contrario delle loro dipendenze o aggiornamenti di sistema. Anche i registri sono complicati dal fatto che non sono del tutto sicuro di cosa dovrei estrarre da essi o come integrarli (nel caso dei vari strumenti della famiglia apt). Ciò significa che ogni volta che reinstallo, o anche solo il backup, non sono sicuro di come ricreare tale elenco.

Non mi aspetto necessariamente nessuno degli strumenti per fare questo per me, ma se non lo sono sto cercando soluzioni alternative. Sarebbero utili anche modelli per cui fare affidamento, buone regole empiriche o una chiara idea di cosa si sta registrando esattamente. Potrebbe non esserci una "migliore risposta" qui, ma quelle buone sarebbero molto utili.


La maggior parte delle risposte di seguito fornisce un'approssimazione di ciò che sto cercando e sono utili in una certa misura. Il prescelto è quello che si avvicina di più a un modo ragionevolmente automatico di reinstallare i miei strumenti su un nuovo sistema, anche con tutti i suoi avvertimenti.


Probabilmente non otterrai una risposta facilmente condivisa per tutte le distro Linux. La gestione dei pacchetti è una parte importante di ciò che distingue le diverse distribuzioni Linux.
Telemaco,

Telemaco: vero. E può avere senso dividere questo in due domande. Ma sembrava una domanda abbastanza specializzata e io uso entrambi i sistemi, quindi non volevo restringere troppo in anticipo. Sembra che la maggior parte delle risposte qui siano per dpkg / apt, quindi una domanda separata per rpm / yum potrebbe avere senso.
Quark,

Passa a NixOS :) (solo la pesca a traina).
Alexey,

Risposte:


31

Su qualsiasi macchina basata su Debian, questo è un modo comune per duplicare un set di pacchetti. Sulla vecchia macchina:

dpkg --get-selections "*" > my_favorite_packages

Copia il file my_favorite_packagessulla nuova macchina (una chiavetta USB è una buona opzione, ma scpfunziona anche bene). Quindi eseguire questa sequenza (con i privilegi di root):

apt-get update
dpkg --set-selections < my_favorite_packages
apt-get -u dselect-upgrade

Questo non ti dà solo i pacchetti che hai installato. Inoltre ottiene le loro dipendenze, ecc. Inoltre, se i repository tra le due macchine sono diversi, tutte le scommesse sono disattivate.

Per quanto riguarda i registri, apt-getmantiene un registro su /var/log/apt/history.log(grazie a Tshepang per averlo aggiornato in un commento); dpkgfa (at /var/log/dpkg.log), ma è notoriamente difficile da analizzare e può essere letto solo con i privilegi di root; aptitudene ha uno a /var/log/aptitudee puoi sfogliarlo con i normali privilegi dell'utente.

Per quanto ne so, hai ragione nel dire che nessuno di questi registri tiene traccia di ciò che hai installato rispetto alle dipendenze installate automaticamente. È possibile ottenere tali informazioni, tuttavia, da una aptitudericerca. Cerca tutti i pacchetti installati che sono stati installati anche automaticamente:

aptitude search '~i ~M'

Se desideri solo quelli installati (non le dipendenze automatiche), annulla ~M:

aptitude search '~i !~M'

Se vuoi che sia formattato in modo da avere solo i nomi dei pacchetti e la parola "installa", aptitudepuoi farlo anche tu . Questo ti dà un elenco pronto per essere alimentato a dpkg --get-selections:

aptitude search '~i !~M' -F "%p install"

(Non ho niente su RedHat o sistemi RedHat-based. Mi dispiace. Non c'è davvero una risposta per Linux di per sé dal momento che la gestione dei pacchetti è una grande parte di ciò che rende differenti distribuzioni differenti .)


Sembra una combinazione dei tuoi consigli e quelli di Ludwig potrebbero fare il trucco: aptitude può generare uno script da alimentare a dpkg in modo che sia automatico, il che è una vittoria seria. E se uno dovesse farlo sulla macchina della vaniglia, la differenza nelle liste è abbastanza vicina a ciò che sto chiedendo per essere praticamente utile.
quark,

3
Si noti che APT ora mantiene un registro in "/var/log/apt/history.log", e viene utilizzato da apt-get, synaptice aptitude(per quanto ho visto). Questo è dall'inizio del 2010.
tshepang,

Le dpkg.logaffermazioni non sembrano essere vere in Ubuntu 14.04 poiché qualsiasi utente posso ottenere facilmente le mie selezioni, non banali, ma non troppo difficili. awk '$3 != "install" { next } ; { gsub(/:.+/, "", $4) ; print $4 }' /var/log/dpkg.log | sort | uniq
Steve Buzonas,

In realtà, mi rendo conto che non è così facile come inizialmente pensavo, il difetto nel precedente script awk non presta attenzione ai pacchetti disinstallati. Ciò che segue awk '$3 !~ /install|remove|purge/ { next } { gsub(/remove|purge/, "uninstall", $3) ; gsub(/:.+/, "", $4) ; a[$4]=$3 } END { for (p in a) { if (a[p] == "install") { print p } } }' /var/log/dpkg.log | sort -u.
Steve Buzonas,

7

Utilizzare dpkg -l '*' > jaunty.originalper ricordare tutti i pacchetti installati su un sistema appena installato.

Dopo aver installato tutti i pacchetti aggiuntivi lo fanno dpkg -l '*' > mysystem.2009017.

I pacchetti aggiuntivi fanno la differenza: diff jaunty.original mysystem.2009017


3
L'idea di base è forte: utilizzare la riga di comando per scaricare l'elenco delle applicazioni attualmente installate, quindi utilizzare la riga di comando per installare quei pacchetti su una nuova macchina. Puoi diventare piuttosto creativo e specifico con l'approccio.
pcapademic,

1
Preferisco dpkg --get-selections
CesarB,

Anche se questo non tiene traccia dei pacchetti che ho aggiunto distinti dalle loro dipendenze, genera sicuramente un elenco utile.
quark,

3

Aptitude è in realtà abbastanza bravo in questo. Aptitude sa quando qualcosa è stato installato a mano o per dipendenza e puoi dirlo per rimuovere cose che non sono più necessarie e che sono state installate solo perché qualcos'altro dipendeva da esso mantenendo sempre il tuo sistema il più piccolo possibile.

Ci sono una manciata di pacchetti che compongono un'installazione Ubuntu, Ubuntu-minimal, Ubuntu-desktop, Ubuntu-Server e così via. Se dici ad Aptitude di contrassegnarli come installati manualmente e rimuovere tutto il resto, allora finisci con la quantità minima possibile di pacchetti.

Spiego come fare tutto ciò in due post sul mio blog: ripulire un Debian GNU / Linux e ripulire un Debian GNU / Linux (o Ubuntu), riprendere . In breve, la risposta che stai cercando è:

aptitude search ~i | grep -v "i A"

L'ultima volta che ho lavorato con questo, se hai usato apt-get, allora non ha funzionato. Ecco perché raccomando sempre attitudine e, per quanto ne so, Debian sta deprecando apt-get a favore di attitudine.

Non so come farlo su Fedora e probabilmente dovresti separarti da una domanda diversa. Fedora e Ubuntu sono sistemi operativi diversi e dovrebbero essere trattati come tali (anche se condividono il loro kernel e altre cose).


2
Penso che puoi ottenere quelle informazioni senza bisogno grep: aptitude search '~i !~M'dovresti fare il trucco.
Telemaco,

1
Inoltre, apt-getnon è deprecato. Debian raccomanda aptitudedi gestire i pacchetti dalla riga di comando, ma è molto lontano dal deprecare apt-get.
Telemaco,

C'è qualcosa di sottile qui. Cercare "A" nella terza colonna sembra contrassegnare i pacchetti che so siano installati come dipendenze. Ma chiaramente non li cattura tutti: la maggior parte dell'elenco non è stata sicuramente installata dalla mia richiesta esplicita.
quark

@Telemachus. Il tuo comando e quello con il modello non fanno esattamente la stessa cosa: i due elenchi hanno contenuti diversi. Non so abbastanza sull'attitudine per dirti perché.
quark,

@Pablo: i collegamenti al tuo registro sembrano interrotti. Se riesci a risolverli, vorrei sicuramente leggerli.
quark,

2

Su debian apt-show-version mostra le versioni dei pacchetti installati.


Notato. Questo non sembra essere installato (per impostazione predefinita) su Ubuntu.
quark

1

Sui sistemi basati su apt, consultare /var/log/apt/term.log. Per me, c'è una linea abbastanza chiara per disegnare dove è finita l'installazione e dove sono iniziate le mie installazioni.


Meno utile per me, perché c'è un mix di installazioni manuali e aggiornamenti di sistema. Inoltre, a seconda della configurazione, term.logs alla fine sarà obsoleto ed eliminato, quindi non tornerà indietro per quanto ne ho bisogno.
quark

Per chiunque provi questo, nota che guadare attraverso il registro di apt sembra essere molto più lavoro di altre opzioni discusse qui. Certamente non è automatico estrarre un elenco di pacchetti dal registro.
quark

1

Da man aptitude-create-state-bundle:

aptitude-create-state-bundle produce un archivio compresso che memorizza i file necessari per replicare lo stato dell'archivio del pacchetto corrente.

Ciò conserverà le stesse informazioni presenti aptitudesui pacchetti installati manualmente.

È pensato per essere usato con aptitude-run-state-bundle:

aptitude-run-state-bundle decomprime il bundle di stato aptitude dato creato da aptitude-create-state-bundle (1) in una directory temporanea, invoca su di esso con il fornito e rimuove successivamente la directory temporanea.


1

Quando lo usi dpkg, non sai se il pacchetto è stato installato manualmente dall'utente o automaticamente (come dipendenza o durante l'installazione iniziale del sistema operativo). Se si desidera conservare tali informazioni, è necessario ottenere un elenco dei soli pacchetti effettivamente installati manualmente.

Per questo, puoi usare uno di questi due one-liner. Entrambi producono lo stesso identico output sulla mia macchina e sono più precisi di tutte le soluzioni finora proposte in questa domanda. Sono una combinazione delle due risposte (1) e (2) . Nota che inizialmente ho pubblicato questa risposta qui .

Utilizzando apt-mark:

comm -23 <(apt-mark showmanual | sort -u) <(gzip -dc /var/log/installer/initial-status.gz | sed -n 's/^Package: //p' | sort -u)

Utilizzando aptitude:

comm -23 <(aptitude search '~i !~M' -F '%p' | sed "s/ *$//" | sort -u) <(gzip -dc /var/log/installer/initial-status.gz | sed -n 's/^Package: //p' | sort -u)

Pochissimi pacchetti cadono ancora nelle fessure, anche se sospetto che questi siano effettivamente installati dall'utente, subito dopo l'installazione tramite l'installazione della localizzazione della lingua o, ad esempio, tramite il programma di installazione del codec Totem. Inoltre, anche le versioni di intestazione linux sembrano accumularsi, anche se ho installato solo il metapacchetto non specifico della versione. Esempi:

libreoffice-help-en-gb
openoffice.org-hyphenation
gstreamer0.10-fluendo-mp3
linux-headers-3.13.0-29    

Come funziona

  1. Ottieni l'elenco dei pacchetti installati manualmente. Per attitudine, lo sedspazio aggiuntivo rimuove gli spazi bianchi rimanenti alla fine della linea.
  2. Ottieni l'elenco dei pacchetti installati subito dopo una nuova installazione.
  3. Confronta i file, genera solo le righe nel file 1 che non sono presenti nel file 2.

Anche altre possibilità non funzionano:

  • Utilizzo del ubuntu-14.04-desktop-amd64.manifestfile ( qui per Ubuntu 14.04) anziché /var/log/installer/initial-status.gz. Più pacchetti vengono mostrati come installati manualmente anche se non lo sono.
  • Usando apt-mark showautoinvece di /var/log/installer/initial-status.gz. apt-markper esempio non include il pacchetto xserver-xorg, mentre l'altro file lo fa.

Entrambi elencano più pacchetti rispetto alla soluzione sopra.


0

Sono di parte e la soluzione che presento non è sempre possibile, ma mi sono stancato di questa situazione. Il risultato è che non installo più nulla con gli strumenti di aggiornamento / gestione pacchetti.

Ho preso una strada piuttosto difficile (avevo requisiti rigidi per le versioni). Ho creato un enorme makefile che scarica, compila e installa nella mia home directory ogni pacchetto (programma, libreria, qualunque cosa) di cui abbia bisogno. L'ho sviluppato gradualmente, pezzo per pezzo. Il makefile scarica e compila tutto, anche i compilatori.

Quando passo a un nuovo sistema, o reinstallo, copio solo il makefile (più alcune cose di supporto), eseguo make world e torno il giorno successivo.

Per alcuni programmi che sviluppo (quindi ho il controllo su), utilizzo uno strumento che ho programmato, Gestione pacchetti di castagne . Sorta di cartelle .app simili su MacOSX. Tutto è nel pacchetto, quindi so cosa è installato in qualsiasi momento e so che è autonomo e autosufficiente (tranne per le librerie di sistema)


Potresti semplicemente inserire i comandi di installazione del gestore pacchetti in uno script e avere lo stesso effetto; supponendo che il codice di cui hai bisogno sia impacchettato. Il tuo approccio è molto simile a quello di Gentoo.
nato il

Bello da sapere. Sembra un sacco di lavoro extra oltre a un sistema Ubuntu / Debian predefinito. Riesco a vedere manualmente la manutenzione di alcuni pacchetti, ma mantenerli tutti in questo modo è più lavoro di quello che voglio fare.
quark

Sì, ma con l'ulteriore problema che le cose ubuntu / fink / darwinports non funzionano dappertutto sulla piattaforma (ero una volta su un digital e un IBM sp4). Non pretendo che questo sia un bel modo di procedere. Dico solo che fa il lavoro, anche se in modo brutto e puzzolente, e mantengo il pieno controllo di ciò che accade sul mio sistema.
Stefano Borini,

Certo, potrei decidere uno di questi giorni di dare un'occhiata seria per emergere e rielaborare tutto con esso.
Stefano Borini,

Questo percorso è più comune in questi giorni quando si considerano strumenti come chef e burattino.
Steve Buzonas,
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.