Apt-mark

Da Guide@Debianizzati.Org.
Vai alla navigazione Vai alla ricerca
APT
Arrow left.png

Gestori di pacchetti

Comandi utili

Configurazione del sistema

Altro

Arrow right.png



Debian-swirl.png Versioni Compatibili

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:

  • apt-get per svolgere le operazioni di installazione, aggiornamento e rimozione dei pacchetti;
  • apt-cache per effettuare operazioni di ricerca su tutti i pacchetti di Debian.

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 ... pacchettoN

Modifica 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 ... pacchettoN

Modifica 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 ... pacchettoN

Previene l'aggiornamento di tutti i pacchetti, marcandoli come hold.

unhold
# apt-mark unhold pacchetto1 pacchetto2 ... pacchettoN

Rimuove 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 showauto

Lista in ordine alfabetico tutti i pacchetti installati automaticamente sul sistema per soddisfare altre dipendenze.

showmanual
$ apt-mark showmanual

Lista in ordine alfabetico tutti i pacchetti installati manualmente sul sistema, compresi quelli in fase di installazione.

showhold
$ apt-mark showhold

Lista 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.

Info.png 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) Swirl-auth20.png Debianized 20%
Estesa da:
Verificata da:

Verificare ed estendere la guida | Cos'è una guida Debianized