Apt-mark
|
![]() Tutte le versioni supportate di Debian |
Introduzione
apt-mark è un comando per visualizzare e modificare lo stato dei pacchetti installati nel sistema, in particolare se sono stati installati in automatico (stato: auto) o manualmente (stato: manual), e se futuri aggiornamenti sono bloccati (stato: hold) oppure no.
Fa parte del pacchetto apt, assieme per esempio a:
Comandi principali
Modifica
Con privilegi di amministrazione i comandi di questa sezione modificano gli stati dei pacchetti scelti.
Lo stato hold ha effetto anche per dpkg, mentre auto e manual soltanto per APT, in quanto è legato al concetto di dipendenze dei pacchetti.
- auto
# apt-mark auto pacchetto1 pacchetto2 ... pacchettoNModifica lo stato della lista dei pacchetti come installati in automatico, e quindi installati solo per soddisfare le dipendenze di altri pacchetti. Si noti che un pacchetto con tale stato può essere rimosso automaticamente con
apt-get autoremove
oppure durante un aggiornamento, in base alle impostazioni del comando utilizzato, se non c'è almeno un pacchetto installato manualmente che dipende da esso.
- manual
# apt-mark manual pacchetto1 pacchetto2 ... pacchettoNModifica lo stato della lista dei pacchetti come installati manualmente, e quindi segnalati al sistema APT come richiesti specificatamente dall'utente. Non saranno quindi rimovibili in automatico durante un aggiornamento o in seguito alla rimozione di altri pacchetti, anche se non essenziali.
- hold
# apt-mark hold pacchetto1 pacchetto2 ... pacchettoNPreviene l'aggiornamento di tutti i pacchetti, marcandoli come hold.
- unhold
# apt-mark unhold pacchetto1 pacchetto2 ... pacchettoNRimuove il blocco sull'aggiornamento dei pacchetti, rimuovendo lo stato hold, se precedentemente impostato.
Visualizza
Questi comandi non richiedono alcun privilegio, e si limitano a listare i pacchetti del sistema secondo i criteri scelti.
- showauto
$ apt-mark showautoLista in ordine alfabetico tutti i pacchetti installati automaticamente sul sistema per soddisfare altre dipendenze.
- showmanual
$ apt-mark showmanualLista in ordine alfabetico tutti i pacchetti installati manualmente sul sistema, compresi quelli in fase di installazione.
- showhold
$ apt-mark showholdLista in ordine alfabetico tutti i pacchetti installati sul sistema per i quali sono impediti futuri aggiornamenti.
Esportare e importare la lista dei pacchetti installati e il loro stato
Questa operazione può essere effettuata solo se si utilizza la stessa release di Debian e la stessa architettura sia sulla macchina da cui si esporta sia su quella in cui si importano i pacchetti. Attenzione va posta inoltre per quelli specifici all'hardware, se le due macchine non sono uguali, e si consiglia in tal caso di effettuare prima una simulazione, prestando attenzione alle operazione che verrebbero svolte, modificando all'occorrenza i file generati.
È efficace anche usata sulla stessa macchina, per riportare tutto il software installato con APT a una precedente configurazione.
L'esportazione si effettua con apt-mark
, mentre si utilizza apt-mark
e anche apt-get per importare la lista.
Nota Non tutti i pacchetti non presenti al momento dell'esportazione della lista dei pacchetti saranno disinstallati, se per esempio raccomandati da quelli installati manualmente, per cui mentre questo metodo garantisce che siano installati almeno tutti quelli iniziali, e che siano rimossi quelli non richiesti e non raccomandati, non garantisce che siano presenti esclusivamente quelli esportati al punto precedente. Per ottenere una copia perfetta l'unico modo è utilizzare apt-mark assieme a dpkg.
Questo metodo è comunque più che sufficiente nella maggior parte delle situazioni, e i pacchetti in più rimasti si possono sempre individuare e rimuovere manualmente in seguito. |
Esportare
Creo due file (lista_pacchetti_manual.txt
e lista_pacchetti_auto.txt
) nella cartella corrente, con le liste dei pacchetti installati manualmente e in automatico:
$ apt-mark showmanual > lista_pacchetti_manual.txt $ apt-mark showauto > lista_pacchetti_auto.txt
Posso visualizzare e modificare le liste, che sono semplici file di testo, e poi salvarli da qualche parte per importarli in seguito.
Importare
Sulla macchina in cui intendo importare la lista dei pacchetti copio il file di testo contenente le due liste di pacchetti create nella sezione precedente, in una directory nota (per esempio in questa sezione si suppone /tmp
).
Con privilegi di amministrazione effettuo un backup degli stati dei pacchetti nella cartella /root
, che non essendo temporanea potrà essere usata successivamente per annullare l'operazione in corso, in caso di problemi:
# apt-mark showmanual > /root/backup_pacchetti_manual.txt
Se voglio rimuovere i pacchetti non presenti nelle liste esportate, marco tutti i pacchetti attualmente installati come installati in automatico:
# apt-mark auto $(cat /root/backup_pacchetti_manual.txt)
Altrimenti, se si è interessati soltanto ad aggiungere eventuali pacchetti mancanti, il comando precedente può essere ignorato.
Installo tutti i pacchetti presenti nelle liste esportate, e li marco come installati manualmente (è sufficiente il singolo comando apt-get install
):
# apt-get install $(cat /tmp/lista_pacchetti_manual.txt /tmp/lista_pacchetti_auto.txt)
Ripristino lo stato di quelli installati automaticamente:
# apt-mark auto $(cat /tmp/lista_pacchetti_auto.txt)
Infine rimuovo tutti quelli non più necessari, ossia non richiesti e non raccomandati dai pacchetti installati manualmente:
# apt-get autoremove
A questo punto, in un sistema con la stessa architettura e la stessa release, saranno presenti soltanto i pacchetti installati manualmente, come contenuti nella lista precedentemente esportata, e le loro dipendenze. E saranno preservati anche i loro stati di installazione (manuale o automatico).
L'unica possibile differenza sarà nella presenza nel sistema di pacchetti raccomandati in più rispetto alla lista di pacchetti installati automaticamente esportata, se si sono cambiate le scelte di default. Per controllare se ci sono pacchetti in più:
$ apt-mark showauto | diff --suppress-common-lines /tmp/lista_pacchetti_auto.txt -
E se si vuole si può procedere alla loro eliminazione, per esempio con apt-get.
Controllare lo stato di un pacchetto
I comandi showauto
, showmanual
e showhold
possono essere usati con degli argomenti, per specificare l'insieme di pacchetti tra cui limitare la selezione degli stati desiderati.
Quindi per esempio:
$ apt-mark showauto nomepacchetto
restituisce nomepacchetto soltanto se è stato installato in automatico, e niente altrimenti (pacchetto non installato oppure installato manualmente).
Mentre per controllare se è installato manualmente, il seguente comando deve restituire nomepacchetto:
$ apt-mark showmanual nomepacchetto
In uno script
Per controllare lo stato di un pacchetto (nomepacchetto) in uno script quindi è sufficiente controllare se viene restituito il nome del pacchetto oppure no:
# inserire il nome del pacchetto nella variabile pacchetto="nomepacchetto" if [ "$(apt-mark showauto "$pacchetto")" = "$pacchetto" ]; then echo "Pacchetto installato automaticamente" elif [ "$(apt-mark showmanual "$pacchetto")" = "$pacchetto" ]; then echo "Pacchetto installato manualmente" else echo "Pacchetto non installato" fi
Purtroppo non esiste un altro modo, se non ricorrendo ad aptitude, dato che per apt-mark
non c'è nemmeno un valore di ritorno da controllare.
Alternativamente si può controllare l'installazione con dpkg-query, contenuto in un pacchetto essenziale del sistema, in modo da usare soltanto una volta apt-mark
per leggere gli stati, che è più lento di dpkg-query
:
# inserire il nome del pacchetto nella variabile pacchetto="nomepacchetto" # stato del pacchetto (eliminando il secondo carattere) stato=$(dpkg-query -f '${db:Status-Abbrev}' -W "$pacchetto" 2> /dev/null) && stato=${stato%?} || stato="" if [ "$stato" != "i" ]; then echo "Pacchetto non installato" elif [ "$(apt-mark showauto "$pacchetto")" = "$pacchetto" ]; then echo "Pacchetto installato automaticamente" else echo "Pacchetto installato manualmente" fi
Manpages
man apt-mark
Guida scritta da: HAL 9000 12:20, 21 apr 2015 (CEST) | Debianized 20% |
Estesa da: | |
Verificata da: | |
Verificare ed estendere la guida | Cos'è una guida Debianized |