Dpkg: differenze tra le versioni

Vai alla navigazione Vai alla ricerca
14 664 byte aggiunti ,  23 mag 2019
m
corretto "precedente" in template
(introduzione, riorganizzazione, estensione voci, aggiunti warnings)
m (corretto "precedente" in template)
 
(37 versioni intermedie di 2 utenti non mostrate)
Riga 1: Riga 1:
{{Stub}}{{Versioni_compatibili}}
{{APT
 
|precedente=APT-Cacher NG
|successivo=gdebi
}}
{{Versioni_compatibili}}
== Introduzione ==
== Introduzione ==
Dpkg è il package manager di Debian, che si occupa dell'installazione, della configurazione e della rimozione di tutto il software disponibile nella forma di [[pacchetto|pacchetti deb]]. Ogni pacchetto ha delle dipendenze, in forma di altri pacchetti che devono essere presenti nel sistema, che sono controllati e installati automaticamente da [[APT]], una suite di programmi che si avvale di <code>dpkg</code> come package manager e aggiunge funzionalità per rendere trasparente la gestione delle dipendenze e lo scaricamento dei pacchetti dai [[repository]].
Dpkg è il package manager di Debian, che si occupa dell'installazione, della configurazione e della rimozione di tutto il software disponibile nella forma di [[pacchetto|pacchetti deb]]. Ogni pacchetto ha delle dipendenze, in forma di altri pacchetti che devono essere presenti nel sistema, che sono controllati e installati automaticamente da [[APT]], una suite di programmi che si avvale di <code>dpkg</code> come package manager e aggiunge funzionalità per rendere trasparente la gestione delle dipendenze e lo scaricamento dei pacchetti dai [[repository]].


Normalmente infatti l'utente utilizza soltanto uno dei tanti programmi che fanno parte di APT, come per esempio [[apt-get]], senza ricorrere direttamente a <code>dpkg</code>, riservato agli utenti più esperti e per esigenze specifiche. Questa guida vuole offire soltanto una panoramica generale agli usi più comuni di questo potente strumento, ma non ha alcuna pretesa di esaustività e si rimanda alle pagine di manuale per tutti gli altri dettagli.
Normalmente infatti l'utente utilizza soltanto uno dei tanti programmi che fanno parte di APT, come per esempio [[apt-get]], senza ricorrere direttamente a <code>dpkg</code>, riservato agli utenti più esperti e per esigenze specifiche.
 
Questa guida vuole offire soltanto una panoramica generale agli usi più comuni di questo potente strumento, ma non ha alcuna pretesa di esaustività e si rimanda alle pagine di manuale per tutti gli altri dettagli.


Si sconsiglia caldamente l'uso di questo strumento per l'installazione e la rimozione di pacchetti, salvo sia impossibile effettuare la stessa operazione con [[APT]], in quanto non gestisce le dipendenze e ciò potrebbe compromettere il funzionamento del sistema. Invece può essere impiegato senza rischi per ricerche sul contenuto dei pacchetti installati o in generale per visualizzare informazioni a essi relative, in genere agendo come frontend per le opzioni più comuni di <code>dpkg-query</code> e <code>dpkg-deb</code>, anch'essi contenuti nel pacchetto '''dpkg''', essenziale per il funzionamento di Debian.
Si sconsiglia caldamente però l'uso di questo strumento per l'installazione e la rimozione di pacchetti, salvo sia impossibile effettuare la stessa operazione con [[APT]], in quanto non gestisce le dipendenze e ciò potrebbe compromettere il funzionamento del sistema. Invece può essere impiegato senza rischi per ricerche sul contenuto dei pacchetti installati o per visualizzare informazioni a essi relative, in genere agendo come frontend per le opzioni più comuni di <code>dpkg-query</code> e <code>dpkg-deb</code>, anch'essi contenuti nel pacchetto '''dpkg''', essenziale per il funzionamento di Debian e che mette a disposizione molti altri comandi utili, i più importanti dei quali saranno affrontati brevemente.


== Pacchetti installati ==
== Pacchetti installati ==
In questa sezione sono raccolte tutte le azioni che possono essere svolte sui pacchetti precedentemente installati, in genere tramite [[APT]].
In questa sezione sono raccolte tutte le azioni che possono essere svolte sui pacchetti precedentemente installati.
 
Per ricerche su pacchetti non installati in precedenza è necessario ricorrere ad [[APT]], si veda per esempio [[apt-cache]], mentre per ricerche sul contenuto di pacchetti non installati si rimanda alla [[Apt-file: ricerca all'interno dei pacchetti|Guida su apt-file]].


=== Ricerche ===
=== Ricerche ===
Cerca il pacchetto che ha installato il file, utile per risalire al pacchetto di un eseguibile di cui non si ricorda la provenienza:
* Cerca il pacchetto che ha installato il file, utile per esempio per risalire al pacchetto di un eseguibile di cui non si ricorda la provenienza:
<pre>$ dpkg --search /percorso/file</pre>
<pre>$ dpkg --search /percorso/file</pre>


Riga 18: Riga 25:
<pre>$ dpkg -S /percorso/file</pre>
<pre>$ dpkg -S /percorso/file</pre>


Restituisce la lista dei file installati nel sistema da un dato pacchetto:
* Restituisce la lista dei file installati nel sistema da un dato pacchetto:
<pre>$ dpkg --listfiles nomepacchetto</pre>
<pre>$ dpkg --listfiles nomepacchetto</pre>
(forma abbreviata: <code>-L</code>)
(forma abbreviata: <code>-L</code>)


Cerca tutti i nomi di pacchetti corrispondenti al pattern scelto (con caratteri jolli: *, ?, [...]) tra quelli precedentemente installati, mostrandone lo stato, la versione e l'architettura:
* Cerca tutti i nomi di pacchetti corrispondenti al pattern scelto (con caratteri jolli: *, ?, [...]) tra quelli precedentemente installati, mostrandone lo stato, la versione e l'architettura:
<pre>$ dpkg --list "pattern"</pre>
<pre>$ dpkg --list "pattern"</pre>
(forma abbreviata: <code>-l</code>)
(forma abbreviata: <code>-l</code>)
Riga 29: Riga 36:
<pre>$ dpkg -l "*apt*"</pre>
<pre>$ dpkg -l "*apt*"</pre>


Per usi più avanzati si consulti il manuale di <code>dpkg-query</code>.
==== Ricerche avanzate ====
 
<!-- NOTA: *NON* modificare il nome di questa sezione, perché è usato come link in un'altra guida -->
 
Per ricerche più avanzate, con la possibilità di selezionare i campi desiderati, si deve ricorrere esplicitamente al comando <code>dpkg-query</code>.
 
* Per esempio per ottenere soltanto una stringa con la versione di un pacchetto (''nomepacchetto''), utile in uno script:
<pre>$ dpkg-query --showformat='${Version}\n' --show nomepacchetto</pre>
(forme abbreviate: <code>-f</code> per <code>--showformat</code> e <code>-W</code> per <code>--show</code>)
 
Si noti che <code>${Version}</code> è una variabile interpretata da <code>dpkg-query</code> e non dalla [[bash|shell]], per questo è racchiusa tra apici (apostrofi).
 
* Per cercare le architetture di tutti i pacchetti precedentemente installati, basta il seguente formato e non specificare alcun pacchetto:
<pre>$ dpkg-query --showformat='${Package;-40}${Architecture}' --show</pre>
(dove in <code>${Package;-40}</code> si intendono riservare i primi 40 caratteri a questo campo, e il segno meno indica l'uso dell'orientamento a sinistra, anziché a destra)
 
Mentre per restringerla a quelli correntemente installati, si può usare lo stato abbreviato (<code>${db:Status-Abbrev}</code>) e filtrare con <code>grep</code>:
<pre>$ dpkg-query --showformat='${db:Status-Abbrev}${Package;-40}${Architecture}' --show | grep '^i' </pre>
 
* Un altro esempio, questa volta con le opzioni abbreviate, per restituire la lista di tutti i pacchetti installati, mostrando se sono essenziali:
<pre>$ dpkg-query -f '${db:Status-Abbrev}${Package;-40}Essential: ${Essential}\n' -W</pre>
 
E per trovare solo quelli essenziali, basta filtrare righe e colonne con i comandi <code>grep</code> e <code>cut</code> (dopo aver separato i campi con una tabulazione <code>\t</code>):
<pre>$ dpkg-query -f '${Package}\t${Essential}\n' -W | grep 'yes$' | cut -f 1</pre>
 
{{Box | Pacchetti essenziali | Questo appena presentato è anche l'unico modo per controllare quali pacchetti sono ritenuti essenziali da [[dpkg]] e dal sistema [[APT]], mentre per esempio la ricerca avanzata di [[aptitude]] considera essenziali, e quindi non rimovibili, anche altri pacchetti importanti, come lo stesso '''apt''':
<pre>$ aptitude search "?essential"</pre>}}
 
Per tutte le altre possibili informazioni da estrarre dai pacchetti precedentemente installati nel sistema si rimanda al manuale (<code>man dpkg-query</code>).


=== Verifiche ===
=== Verifiche ===
Restituisce la lista dei pacchetti installati solo parzialmente o presenti in uno stato inconsistente, suggerendo le azioni da compiere per la risoluzione del problema:
* Restituisce la lista dei pacchetti installati solo parzialmente o presenti in uno stato inconsistente, suggerendo le azioni da compiere per la risoluzione del problema:
<pre>$ dpkg --audit</pre>
<pre>$ dpkg --audit</pre>
(forma abbreviata: <code>-C</code>)
(forma abbreviata: <code>-C</code>)


Verifica l'integrità di ciò che è stato installato da uno o più pacchetti (dopo aver controllato la consistenza dei metadati con il comando precedente):
* Verifica l'integrità di ciò che è stato installato da uno o più pacchetti (da eseguire dopo aver controllato la consistenza dei metadati con il comando precedente):
<pre>$ dpkg --verify nomepacchetto</pre>
<pre>$ dpkg --verify nomepacchetto</pre>
(forma abbreviata: <code>-V</code>)
(forma abbreviata: <code>-V</code>)
Riga 49: Riga 84:
{{Warningbox | Per rimuovere software installato tramite [[APT]] o <code>dpkg</code> si consiglia di ricorrere sempre ad APT, per esempio tramite [[apt-get]], perché gestisce anche le dipendenze. Utilizzare direttamente <code>dpkg</code> può invece lasciare il sistema in uno stato incoerente, anche se in genere non è permessa la rimozione di pacchetti da cui altri ancora dipendono, senza forzarla esplicitamente con un'opzione.}}
{{Warningbox | Per rimuovere software installato tramite [[APT]] o <code>dpkg</code> si consiglia di ricorrere sempre ad APT, per esempio tramite [[apt-get]], perché gestisce anche le dipendenze. Utilizzare direttamente <code>dpkg</code> può invece lasciare il sistema in uno stato incoerente, anche se in genere non è permessa la rimozione di pacchetti da cui altri ancora dipendono, senza forzarla esplicitamente con un'opzione.}}


Rimuove un pacchetto, se non esistono altri pacchetti installati che dipendono da esso, ma senza rimuovere le sue dipendenze:
* Rimuove un pacchetto, se non esistono altri pacchetti installati che dipendono da esso, ma senza rimuovere le sue dipendenze:
<pre># dpkg --remove nomepacchetto</pre>
<pre># dpkg --remove nomepacchetto</pre>
(forma abbreviata: <code>-r</code>)
(forma abbreviata: <code>-r</code>)
Riga 56: Riga 91:
<pre># apt-get autoremove</pre>
<pre># apt-get autoremove</pre>


Rimuove il pacchetto e anche i relativi file di configurazione del sistema:
* Rimuove il pacchetto e anche i relativi file di configurazione del sistema:
<pre># dpkg --purge nomepacchetto</pre>
<pre># dpkg --purge nomepacchetto</pre>
(forma abbreviata: <code>-P</code>)
(forma abbreviata: <code>-P</code>)
Riga 65: Riga 100:


==== Rimozione forzata ====
==== Rimozione forzata ====
{{Warningbox | Questa operazione è ancora più rischiosa della precedente, in quanto disattiva i controlli di sicurezza pensati per proteggere il sistema da uno stato incoerente e potenzialmente inusabile, in base all'importanza dei pacchetti coinvolti nella rimozione. Va effettuata soltanto se è strettamente necessario, e prestando estrema attenzione.}}
{{Warningbox | Questa operazione è ancora più rischiosa della precedente, in quanto disattiva i controlli di sicurezza pensati per proteggere il sistema da uno stato incoerente e potenzialmente inusabile, in base all'importanza dei pacchetti coinvolti nella rimozione. Va effettuata soltanto se è strettamente necessario, e prestando estrema attenzione. Si '''sconsiglia fortemente''' l'uso di <code>--force-all</code>, in quanto rende meno chiare le operazioni che saranno effettuate sul sistema, e forzando la rimozione in ogni circostanza possibile può compromettere il funzionamento del sistema.}}


Per forzare la rimozione, anche in presenza di dipendenze che impediscono l'eliminazione del pacchetto, è necessario specificare l'opzione <code>--force-depends</code>. L'uso è caldamente sconsigliato, salvo si sia certi di quello che si sta facendo, si sia utenti esperti dell'uso di [[APT]] e non si riesce a rimuovere il pacchetto in altri modi.
* Per forzare la rimozione di pacchetti non completamente installati, che non si riesce a rimuovere per reinstallarli, si può utilizzare l'opzione <code>--force-remove-reinstreq</code>. Si raccomanda di accertarsi prima che né la riconfigurazione né una nuova installazione funzionano. Per forzare la riconfigurazione di un pacchetto:
<pre># dpkg-reconfigure nomepacchetto</pre>
E se non funziona, per tentarne la reinstallazione completa con [[APT]]:
<pre># apt-get --reinstall install nomepacchetto</pre>
Soltanto in seguito, se anche questo tentativo fallisce, forzarne la rimozione:
<pre># dpkg --remove --force-remove-reinstreq nomepacchetto</pre>
 
* Per forzare la rimozione di un pacchetto, anche in presenza di dipendenze che ne impediscono l'eliminazione, è necessario specificare l'opzione <code>--force-depends</code>. L'uso è caldamente sconsigliato, salvo si sia certi di quello che si sta facendo, si sia utenti esperti dell'uso di [[APT]] e non si riesce a rimuovere il pacchetto in altri modi.


Per esempio per forzare la rimozione, ignorando tutte le dipendenze:
Per esempio per forzare la rimozione, ignorando tutte le dipendenze:
Riga 76: Riga 118:
<pre># dpkg --remove --ignore-depends=dipendenza1,dipendenza2,... nomepacchetto</pre>
<pre># dpkg --remove --ignore-depends=dipendenza1,dipendenza2,... nomepacchetto</pre>


In luogo di <code>--remove</code> si può utilizzare <code>--purge</code> se si vogliono eliminare anche i relativi file di configurazione del sistema. E in entrambi i casi è necessario poi ricorrere ad [[APT]] per le dipendenze automatiche non più necessarie, come già visto per la rimozione normale.
* I due metodi precedenti possono essere abbinati, se necessario. E in luogo di <code>--remove</code> si può utilizzare <code>--purge</code> se si vogliono eliminare anche i relativi file di configurazione del sistema. Per altre opzioni si rimanda al manuale di <code>dpkg</code>.


Per altre opzioni si rimanda al manuale di <code>dpkg</code>.
Come già visto per la rimozione normale, si può ricorrere ad [[APT]] per le dipendenze automatiche non più necessarie (e di nuovo si può aggiungere <code>--purge</code>):
<pre># apt-get autoremove</pre>


== Stato dei pacchetti ==
== Stato dei pacchetti ==
Dpkg può essere utilizzato per controllare i pacchetti installati e il loro stato (''install'', ''deinstall'', ''hold'', ''purge''), e anche per cambiarlo.
Dpkg può essere utilizzato per controllare i pacchetti installati e il loro stato (''install'', ''deinstall'', ''hold'', ''purge''), e anche per cambiarlo.


Si noti che lo stato ''auto'' o ''manual'' (se il pacchetto era installato automaticamente o manualmente) non è registrato, in quanto <code>dpkg</code> non si occupa delle dipendenze e non può conoscere se un pacchetto è stato installato solo per soddisfarle.
Si noti che lo stato ''auto'' o ''manual'' (se il pacchetto era installato automaticamente o manualmente) non è registrato, in quanto <code>dpkg</code> non si occupa delle dipendenze e non può conoscere se un pacchetto è stato installato solo per soddisfarle. Per quello sarebbe necessario ricorrere agli strumenti di [[APT]], come [[apt-mark]].


=== Lista i pacchetti del sistema ===
=== Lista dei pacchetti del sistema ===
Restituisce la lista tutti i pacchetti precedentementi installati, accompagnati dal loro stato:
Restituisce la lista tutti i pacchetti precedentementi installati, accompagnati dal loro stato:
<pre>$ dpkg --get-selections</pre>
<pre>$ dpkg --get-selections</pre>


=== Esporta e importa la lista dei pacchetti ===
=== Esporta e importa la lista dei pacchetti ===
{{Warningbox | Quest'operazione è pericolosa e in caso di errori può causare il blocco e il malfunzionamento del sistema, rendendo necessaria anche una nuova installazione da zero. Non va eseguita se non si è utenti abbastanza esperti, e si consiglia l'uso di un ambiente minimale come una console virtuale.}}
{{Warningbox | Quest'operazione è pericolosa e in caso di errori può causare il blocco e il malfunzionamento del sistema, rendendo necessaria anche una nuova installazione da zero. Non va eseguita se non si è utenti abbastanza esperti, e si consiglia l'uso di un ambiente minimale come il login su un terminale virtuale (<code>tty1</code>, <code>tty2</code>, ...).}}


Si noti che questo meccanismo non funziona tra diverse versioni di Debian e nemmeno tra diverse architetture, o in presenza di diversi driver. È da utilizzare soltanto per ripristinare una configurazione precedente sullo stesso PC o al limite tra due PC quasi identici. Ed è raccomandabile che si tratti di una Debian stable senza altri repository, per via dei cambiamenti che potrebbero avvenire ai pacchetti delle altre [[release]].
Si noti che questo meccanismo non funziona tra diverse versioni di Debian e nemmeno tra diverse architetture, o in presenza di diversi driver. È da utilizzare soltanto per ripristinare una configurazione precedente sullo stesso PC o al limite tra due PC quasi identici. Ed è raccomandabile che si tratti di una Debian stable senza altri repository, per via dei cambiamenti che potrebbero avvenire ai pacchetti delle altre [[release]].


==== Esporta ====
==== Esporta ====
Per esportare la lista dei pacchetti installati è sufficiente una redirezione su un file (in questo caso <code>lista_pacchetti.txt</code>):
Per esportare la lista dei pacchetti installati è sufficiente una ridirezione su un file (in questo caso <code>lista_pacchetti.txt</code>):
<pre>$ dpkg --get-selections > lista_pacchetti.txt</pre>
<pre>$ dpkg --get-selections > lista_pacchetti.txt</pre>
E per salvare anche lo stato è necessario ricorrere ad APT e creare un nuovo file con tale informazione, per esempio tramite [[apt-mark]] e una redirezione:
E per salvare anche lo stato è necessario ricorrere ad APT e creare un nuovo file con tale informazione, per esempio tramite [[apt-mark]] e una ridirezione:
<pre>$ apt-mark showauto > lista_auto.txt</pre>
<pre>$ apt-mark showauto > lista_auto.txt
$ apt-mark showmanual > lista_manual.txt</pre>
Salviamo anche i metadati, per poter importare pacchetti che non fossero noti sulla macchina di destinazione, con [[apt-cache]] e sempre con una ridirezione:
<pre>$ apt-cache dumpavail > available.txt</pre>


Si devono salvare i due file .txt e conservarli, per quando si intende importare.
Si devono salvare i quattro file .txt e conservarli, per quando si intende importare la lista di pacchetti e il loro stato.


==== Importa ====
==== Importa ====
Se si vuole importare tale stato in seguito, per replicare la configurazione precedentemente esportata sono sufficienti due comandi, nella stessa cartella dove si sono salvati i due file .txt nella fase di esportazione:
Se si vuole importare tale stato in seguito, per replicare la configurazione precedentemente esportata sono sufficienti due comandi, nella stessa cartella dove si sono salvati i quattro file .txt nella fase di esportazione:
<pre># dpkg --clear-selections
<pre># dpkg --merge-avail available.txt
# dpkg --clear-selections
# dpkg --set-selections < lista_pacchetti.txt</pre>
# dpkg --set-selections < lista_pacchetti.txt</pre>
Dove il primo comando imposta lo stato ''deinstall'' a tutti i pacchetti non essenziali installati nel sistema, per far sì che i pacchetti installati ma non presenti nella lista vengano rimossi, e il secondo importa la lista dei pacchetti da installare.
Dove il primo comando importa tutti i metadati dei pacchetti precedentemente esportati, in caso non fossero noti; il secondo comando imposta lo stato ''deinstall'' a tutti i pacchetti non essenziali installati nel sistema, per far sì che i pacchetti installati ma non presenti nella lista vengano rimossi; e il terzo comando importa la lista dei pacchetti da installare.


Per rendere effettive le modifiche, iniziando l'installazione e la rimozione dei pacchetti, è necessario ricorrere ad [[APT]]:
Per rendere effettive le modifiche, iniziando l'installazione e la rimozione dei pacchetti, è necessario ricorrere ad [[APT]]:
<pre># apt-get dselect-upgrade</pre>
<pre># apt-get dselect-upgrade</pre>


E infine per riassegnare gli stati ''auto'' ai pacchetti che erano stati installati in automatico:
E infine per riassegnare gli stati ''auto'' e ''manual'' ai pacchetti installati, e rimuovere quelli non necessari, si utilizzano [[apt-mark]] e [[apt-get]]:
<pre># apt-mark auto $(cat lista_auto.txt)</pre>
<pre># apt-mark auto $(cat lista_auto.txt)
# apt-mark manual $(cat lista_manual.txt)
# apt-get autoremove</pre>


A questo punto, se tutto è andato a buon fine, sul PC sono installati tutti e soli i pacchetti presenti al momento dell'esportazione, con gli stessi stati.
A questo punto, se tutto è andato a buon fine, sul PC sono installati tutti e soli i pacchetti presenti al momento dell'esportazione, con gli stessi stati.


=== Cambiare lo stato dei pacchetti ===
=== Cambia lo stato dei pacchetti ===
È sufficiente creare manualmente la lista dei pacchetti di cui modificare lo stato, con quello nuovo da assegnare, per esempio bloccando futuri aggiornamenti con ''hold'', e poi importarla.
È sufficiente creare manualmente la lista dei pacchetti di cui modificare lo stato, con quello nuovo da assegnare, per esempio bloccando futuri aggiornamenti con ''hold'', e poi importarla.


{{Warningbox | Si consiglia di utilizzare [[apt-mark]] per svolgere quest'operazione, perché molto più pratico e affidabile, riducendo la possibilità di errori.
{{Suggerimento | Si consiglia di utilizzare [[apt-mark]] per svolgere quest'operazione, perché molto più pratico e affidabile, riducendo la possibilità di errori.


Per esempio:
Per esempio:
<pre># apt-mark hold nomepacchetto1 ...</pre>}}
<pre># apt-mark hold nomepacchetto1 ...</pre>}}


Blocca il futuro aggiornamento di un pacchetto:
* Blocca il futuro aggiornamento di un pacchetto:
<pre># echo nomepacchetto hold | dpkg --set-selections</pre>
<pre># echo nomepacchetto hold | dpkg --set-selections</pre>


Rimuove il blocco del pacchetto:
* Rimuove il blocco del pacchetto:
<pre># echo nomepacchetto install | dpkg --set-selections</pre>
<pre># echo nomepacchetto install | dpkg --set-selections</pre>


Blocca il futuro aggiornamento di più pacchetti:
* Blocca il futuro aggiornamento di più pacchetti:
<pre># printf "%s hold\n" nomepacchetto1 ... nomepacchettoN | dpkg --set-selections</pre>
<pre># printf "%s hold\n" nomepacchetto1 ... nomepacchettoN | dpkg --set-selections</pre>


Rimuove il blocco di più pacchetti:
* Rimuove il blocco di più pacchetti:
<pre># printf "%s install\n" nomepacchetto1 ... nomepacchettoN | dpkg --set-selections</pre>
<pre># printf "%s install\n" nomepacchetto1 ... nomepacchettoN | dpkg --set-selections</pre>


Riga 144: Riga 193:
Per i comandi relativi a un pacchetto deb <code>dpkg</code> agisce come un frontend alle opzioni più comuni di <code>dpkg-deb</code>.
Per i comandi relativi a un pacchetto deb <code>dpkg</code> agisce come un frontend alle opzioni più comuni di <code>dpkg-deb</code>.


Visualizza informazioni sul pacchetto deb:
* Visualizza informazioni sul pacchetto deb:
<pre>$ dpkg --info pacchetto.deb</pre>
<pre>$ dpkg --info pacchetto.deb</pre>
(forma abbreviata: <code>-I</code>)
(forma abbreviata: <code>-I</code>)


Mostra il contenuto del pacchetto deb:
* Mostra il contenuto del pacchetto deb:
<pre>$ dpkg --contents pacchetto.deb</pre>
<pre>$ dpkg --contents pacchetto.deb</pre>
(forma abbreviata: <code>-c</code>)
(forma abbreviata: <code>-c</code>)


Estrae il contenuto del pacchetto deb nella cartella scelta:
* Estrae il contenuto del pacchetto deb nella cartella scelta:
<pre>$ dpkg --vextract pacchetto.deb directory</pre>
<pre>$ dpkg --vextract pacchetto.deb directory</pre>
(forma abbreviata: <code>-X</code>)
(forma abbreviata: <code>-X</code>)
Riga 175: Riga 224:
{{Warningbox | Le istruzioni presentate in questa sezione possono compromettere il funzionamento del sistema, e l'uso è sconsigliato, salvo si sia utenti esperti nell'uso di [[APT]], si presti molta attenzione a quello che si sta facendo, e non ci sia altro modo di risolvere il proprio problema.}}
{{Warningbox | Le istruzioni presentate in questa sezione possono compromettere il funzionamento del sistema, e l'uso è sconsigliato, salvo si sia utenti esperti nell'uso di [[APT]], si presti molta attenzione a quello che si sta facendo, e non ci sia altro modo di risolvere il proprio problema.}}


Se si vuole forzare una versione di un pacchetto che comporta il [[downgrade]], oppure ignorare delle dipendenze, è necessario ricorrere <code>dpkg</code>, specificando le opzioni <code>--force-*</code> relative, che si possono leggere sul manuale di <code>dpkg</code>.
Se si vuole forzare una versione di un pacchetto che comporta il [[downgrade]], oppure ignorare delle dipendenze, è necessario ricorrere a <code>dpkg</code>, specificando le opzioni <code>--force-*</code> relative, che si possono leggere sul manuale di <code>dpkg</code>. Si consideri che gli altri casi di conflitti, rispetto a quelli trattati in seguito, sono ancora più pericolosi da forzare, ed è probabile che portino alla sovrascrittura di file gestiti da altri pacchetti, potenzialmente compromettendo l'integrità del sistema.


Per esempio per forzare il [[downgrade]] di un pacchetto, dopo aver recuperato una versione precedente (NOTA: nessun controllo sulle dipendenze, il sistema potrebbe risultare inusabile, a seconda dell'importanza del pacchetto):
* Per esempio per forzare il [[downgrade]] di un pacchetto, dopo aver recuperato una versione precedente:
<pre># dpkg --install --force-downgrade pacchetto.deb</pre>
<pre># dpkg --install --force-downgrade pacchetto.deb</pre>
Ma si consiglia di ricorrere al [[pinning]], e quindi ad [[APT]], se è possibile.
E al solito in seguito all'installazione con <code>dpkg</code> è necessario avvalersi di [[APT]] per sistemare le dipendenze:
<pre># apt-get --fix-broken install</pre>
Si consiglia però di tentare prima il [[downgrade]] con [[APT]] attraverso il [[pinning]], in quanto con <code>dpkg --force-downgrade</code> non avviene nessun controllo di sicurezza sulle dipendenze e il sistema potrebbe risultare inusabile, a seconda dell'importanza del pacchetto.


Installa un pacchetto, anche se può rendere non funzionante un altro pacchetto:
* Può succedere anche che l'installazione di un pacchetto sia impedita, perché un altro sarebbe reso non funzionante da esso. In tal caso si può forzarne l'installazione con:
<pre># dpkg --install --force-breaks pacchetto.deb</pre>
<pre># dpkg --install --force-breaks pacchetto.deb
Può essere molto pericoloso, se entra in conflitto con uno dei pacchetti essenziali al funzionamento del sistema.
# apt-get --fix-broken install</pre>
Si noti che è molto pericoloso, se mette fuori uso pacchetti essenziali, ed è sempre raccomandabile effettuare prima una scelta tra i pacchetti con [[APT]], ripiegando su <code>dpkg</code> solo come ultima risorsa.


Al solito è necessario avvalersi di [[APT]] per sistemare le dipendenze:
== Modifiche ai file installati o ai loro permessi ==
<pre># apt-get --fix-broken install</pre>
Un [[pacchetto]] contiene i file che verranno installati sul proprio sistema, ed eventuali cambiamenti apportati a questi file potrebbero essere sovrascritti da [[APT]] alla successiva installazione o al successivo aggiornamento. In questa sezione vedremo come apportare cambiamenti permanenti con [[privilegi di amministrazione]], segnalandoli al package manager <code>dpkg</code> in modo che siano ripristinati a ogni aggiornamento e nuova installazione.
 
{{Warningbox | Entrambe le operazioni possono rendere inutilizzabile il sistema, se si sposta o si modifica un file necessario, e compromettere quello delle altre applicazioni. L'uso di questi comandi sono pertanto consigliati ai soli utenti esperti, e sempre prestando molta attenzione.}}
 
=== Diversioni ===
Per modificare un file di sistema, o uno che si trova in una directory di sistema, e impedirne la sovrascrittura al successivo aggiornamento è possibile creare una diversione con il comando <code>dpkg-divert</code>, contenuto nel pacchetto '''dpkg'''.
 
Non possono essere effettuate sulle directory, ma soltanto su file regolari, eseguibili e non. Inoltre bisogna utilizzare percorsi assoluti (ossia che partono dalla radice /) per indicare il percorso del file da deviare e la sua nuova destinazione. Se si modifica soltanto il nome, lasciando il resto del suo percorso invariato, è equivalente a rinominare il file.
 
Per tutte le opzioni si rimanda al manuale (<code>man dpkg-divert</code>).
 
{{Box | Nota | Si ricorda che per i file di configurazione quest'operazione non è necessaria, in quanto non sono sovrascritti di default da [[APT]], senza chiedere conferma all'amministratore durante un aggiornamento, e quelli rigenerati dispongono quasi sempre di metodi specifici per la loro personalizzazione.
 
Inoltre piuttosto che sovrascrivere degli eseguibili di sistema è consigliabile aggiungere nuovi file, con lo stesso nome, in <code>/usr/local/bin</code> (oppure <code>/usr/local/sbin</code>) per nascondere quelli presenti in <code>/bin</code> e <code>/usr/bin</code> (oppure <code>/sbin</code> e <code>/usr/sbin</code>) nella quasi totalità dei casi.}}
 
==== Crea nuova diversione ====
* Rinomina o sposta un file di sistema, non ancora installato o senza applicare le modifiche:
<pre># dpkg-divert --divert /percorsodiversione/nuovonomefile /percorso/nomefile</pre>
Le modifiche saranno effettive al momento dell'installazione del pacchetto o al suo aggiornamento, e ogni file che sarebbe installato in <code>/percorso/nomefile</code> sarà invece scritto in <code>/percorsodiversione/nuovonomefile</code>.
 
* Rinomina o sposta un file di sistema già installato, applicando subito le modifiche:
<pre># dpkg-divert --divert /percorsodiversione/nuovonomefile --rename /percorso/nomefile</pre>
È stato sufficiente aggiungere l'opzione <code>--rename</code>.
 
* Rinomina o sposta un file di sistema, a meno che sia installato da un dato pacchetto:
<pre># dpkg-divert --package nomepacchetto --divert /percorsodiversione/nuovonomefile /percorso/nomefile</pre>
È utile per permettere l'installazione di un proprio pacchetto (''nomepacchetto''), senza tener conto della diversione creata, che però influenzerà tutti gli altri e impedirà la sovrascrittura del proprio file.
 
==== Visualizza diversioni ====
* Visualizza tutte le diversioni:
<pre>$ dpkg-divert --list</pre>
Si noti che anche i pacchetti del sistema fanno uso di questo metodo, quindi è normale non trovare soltanto le proprie modifiche e infatti si consiglia di tenerne traccia anche altrove.
 
* Visualizza le diversioni di un dato file:
<pre>$ dpkg-divert --list /percorso/nomefile</pre>
 
* Visualizza tutte le diversioni di un dato pattern (con caratteri jolli <code>*</code>, <code>?</code>, <code>[</code>...<code>]</code>):
<pre>$ dpkg-divert --list "stringa"</pre>
 
==== Rimuovi diversione ====
* Rimuovi una diversione, senza applicare le modifiche (va indicato il percorso originale, non quello della diversione):
<pre># dpkg-divert --remove /percorso/nomefile</pre>
Alla successiva installazione o aggiornamento la propria diversione sarà ignorata, ma nessun cambiamento sarà apportato al sistema fino ad allora. Questo comando è utile solo per annullare una diversione che non è mai stata applicata.
 
* Rimuovi una diversione, applicando subito le modifiche (va indicato il percorso originale, non quello della diversione):
<pre># dpkg-divert --rename --remove /percorso/nomefile</pre>
 
=== Sovrascrivi permessi ===
Per modificare l'utente proprietario, il suo gruppo o i permessi del file (si legga [[Filesystem:_i_permessi_sui_files|questa guida]] per maggiori informazioni) si può impostare un'azione da eseguire ogni volta che è invocato <code>dpkg</code> per modificare il sistema, e quindi anche dopo ogni esecuzione di uno dei programmi di [[APT]]. Per farlo si ricorre a <code>dpkg-statoverride</code>, sempre distribuito nel pacchetto '''dpkg'''.
 
Le modifiche si possono apportare a qualsiasi file, directory comprese, che devono essere specificati con un percorso assoluto.
 
{{Suggerimento | Conservare in un file le modifiche effettuate, e i valori precedenti, visto che '''non''' saranno ripristinabili in automatico, a meno di ripetere l'installazione di un pacchetto.}}
 
Per tutte le opzioni si rimanda al manuale (<code>man dpkg-statoverride</code>).
 
==== Imposta nuovo utente, gruppo e permessi ====
* Imposta utente e gruppo proprietari del file, e i suoi nuovi permessi, per file non ancora installati oppure senza apportare le modifiche:
<pre># dpkg-statoverride --add nomeutente nomegruppo permessi /percorso/nomefile</pre>
Le modifiche saranno apportate alla successiva installazione o aggiornamento del pacchetto che installerebbe il file specificato sul sistema. I valori ''nomeutente'' e ''nomegruppo'' sono i nomi che saranno usati come proprietari del file (per la forma numerica utilizzare "#UID" e "#GID"), mentre ''permessi'' va espresso in forma ottale (per esempio: "744" per rimuovere scrittura ed esecuzione a tutti gli utenti, meno al proprietario; per maggiori informazioni si legga <code>man chmod</code>, la forma ottale è la stessa).
 
* Imposta utente e gruppo proprietari di un file già installato nel sistema, e i suoi nuovi permessi, rendendo effettive fin da subito le modifiche:
<pre># dpkg-statoverride --update --add nomeutente nomegruppo permessi /percorso/nomefile</pre>
È stato sufficiente aggiungere l'opzione <code>--update</code>.
 
==== Visualizza le personalizzazioni ====
* Visualizza tutti i cambiamenti a utente, gruppo e permessi (a prescindere che siano effettivi per le proprie modifiche):
<pre>$ dpkg-statoverride --list</pre>
Sono restituite anche le personalizzazioni effettuate dal sistema, alcune regolabili con <code>dpkg-reconfigure</code>. Anche per questo si consiglia di segnalare a parte le proprie modifiche.
 
* Visualizza i cambiamenti apportati a un dato file:
<pre>$ dpkg-statoverride --list /percorso/nomefile</pre>
 
* Visualizza tutti i cambiamenti apportati ai file di un dato pattern (caratteri jolly: <code>*</code>, <code>?</code>, <code>[</code>...<code>]</code>):
<pre>$ dpkg-statoverride --list "stringa"</pre>
 
==== Rimuovi personalizzazione ====
* Rimuovi una propria personalizzazione da un dato file:
<pre># dpkg-statoverride --remove /percorso/nomefile</pre>
Si noti che tale modifica '''non''' ripristina utente, gruppo e permessi ai suoi valori originari, ma si limita a rimuovere l'azione memorizzata da <code>dpkg</code>, così che non sia più applicata in successive installazioni e aggiornamenti dei pacchetti contenenti il file scelto. Per renderle effettive è necessario [[Filesystem:_i_permessi_sui_files|intervenire manualmente]], oppure forzare la reinstallazione del pacchetto che conteneva il file.
 
Per ripristinare utente, gruppo e permessi del file, cerco il pacchetto da reinstallare:
<pre>$ dpkg --search /percorso/nomefile</pre>
 
E ne forzo la reinstallazione con [[apt-get]]:
<pre># apt-get --reinstall install nomepacchetto</pre>


== Architetture ==
== Architetture ==
A partire da Debian [[Wheezy]] è stato aggiunto il supporto ad architetture multiple, e <code>dpkg</code> si occupa di gestire quali architetture possono essere scelte per i pacchetti installati con [[APT]], se compatibili con il proprio hardware.
A partire da Debian 7 ([[Wheezy]]) è stato aggiunto il supporto ad architetture multiple, e <code>dpkg</code> si occupa di gestire quali architetture possono essere scelte per i pacchetti installati con [[APT]], se compatibili con il proprio hardware.


=== Visualizza informazioni ===
=== Visualizza informazioni ===
Visualizza l'architettura di default dei pacchetti Debian che saranno installati:
* Visualizza l'architettura di default dei pacchetti Debian che saranno installati, in base all'immagine scelta in fase di installazione:
<pre>$ dpkg --print-architecture</pre>
<pre>$ dpkg --print-architecture</pre>


Visualizza tutte le altre architetture che possono essere selezionate per l'installazione, ossia tutte quelle aggiunte in seguito manualmente:
* Visualizza tutte le altre architetture che possono essere selezionate per l'installazione, ossia tutte quelle aggiunte in seguito manualmente:
<pre>$ dpkg --print-foreign-architectures</pre>
<pre>$ dpkg --print-foreign-architectures</pre>


=== Aggiungi nuova architettura ===
=== Aggiungi nuova architettura ===
Aggiunge una nuova architettura:
Aggiunge una nuova architettura:
<pre># dpkg --add-architecture architecture</pre>
<pre># dpkg --add-architecture architettura</pre>
Per rendere le modifiche effettive per APT è necessario rieffettuare l'aggiornamento della lista di pacchetti disponibili.   
Per rendere le modifiche effettive per APT è necessario rieffettuare l'aggiornamento della lista di pacchetti disponibili.   


=== Rimuovi architettura ===
Un caso comune per esempio è quello di aggiungere il supporto per gli eseguibili a 32 bit (architettura: ''i386'') su PC a 64 bit (architettura: ''amd64''):
Un caso comune per esempio è quello di aggiungere il supporto per gli eseguibili a 32 bit (architettura: ''i386'') su PC a 64 bit (architettura: ''amd64''):
<pre># dpkg --add-architecture i386
<pre># dpkg --add-architecture i386
# apt-get update</pre>
# apt-get update</pre>


Per installare software di questa architettura dai repository è sufficiente aggiungere ''':'''''architettura'' dopo il nome del pacchetto, per tutte le architetture non di default. Per esempio per installare un pacchetto a 32 bit tramite [[APT]]:
<pre># apt-get install nomepacchetto:i386</pre>
=== Rimuovi architettura ===
Rimuove un'architettura precedentemente aggiunta:
Rimuove un'architettura precedentemente aggiunta:
<pre># dpkg --remove-architecture architecture</pre>
<pre># dpkg --remove-architecture architettura</pre>
seguito dall'aggiornamento della lista dei pacchetti, per rendere effettive le modifiche.
seguito dall'aggiornamento della lista dei pacchetti, per rendere effettive le modifiche.
L'operazione è portata a termine con successo soltanto se nessun pacchetto installato sul sistema è compilato per tale architettura. In caso contrario è necessario prima disinstallarne tutti i pacchetti.
Per esempio per cercare tutti i pacchetti installati a 32 bit basta la ricerca avanzata con <code>dpkg-query</code>:
<pre>$ dpkg-query -f '${db:Status-Abbrev}\t${Package}\t${Architecture}' -W | grep '^i.*i386$' | cut -f 2</pre>
(dove il pattern '^i.*i386$' di <code>grep</code> serve per filtrare le righe inizianti con il carattere "i", ossia i pacchetti installati, e terminanti con l'architettura "i386", per via dell'ordine specificato nel formato di <code>dpkg-query</code>; e <code>cut</code> seleziona il secondo campo, corrispondente al solo nome dei pacchetti)
E, una volta rimossi, si può togliere il supporto agli eseguibili a 32 bit:
<pre># dpkg --remove-architecture i386
# apt-get update</pre>


== Manuale ==
== Manuale ==
<code>man dpkg</code><br/>
<code>man dpkg</code><br/>
<code>man dpkg-reconfigure</code><br/>
<code>man dpkg-query</code><br/>
<code>man dpkg-query</code><br/>
<code>man dpkg-deb</code><br/>
<code>man dpkg-deb</code><br/>
<code>man dpkg-reconfigure</code><br/>
<code>man dpkg-divert</code><br/>
<code>man dpkg-statoverride</code><br/>


{{Autori
{{Autori
|Autore=[[Utente:HAL 9000|HAL 9000]]
|Autore= [[Utente:HAL 9000|HAL 9000]] 12:22, 21 apr 2015 (CEST)
|Verificata_da=
|Verificata_da=
|Numero_revisori=0
|Numero_revisori=0
6 999

contributi

Menu di navigazione