6 999
contributi
S3v (discussione | contributi) m (corretto "precedente" in template) |
|||
(33 versioni intermedie di 2 utenti non mostrate) | |||
Riga 1: | Riga 1: | ||
{{ | {{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 | 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. | ||
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 | 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 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 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 | ==== 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 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, anche in presenza di dipendenze che impediscono l'eliminazione | * 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> | ||
* 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>. | |||
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 | === 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 | {{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 | 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 | 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 | 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 | 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 | 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 | 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. | ||
=== | === 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. | ||
{{ | {{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 a <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 | * 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> | ||
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. | |||
* 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 | |||
# 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. | |||
== Modifiche ai file installati o ai loro permessi == | |||
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 ==== | |||
<pre># dpkg -- | * Rimuovi una propria personalizzazione da un dato file: | ||
Si noti che | <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> | <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, in base all'immagine scelta in fase di installazione: | * 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> | ||
Riga 219: | Riga 354: | ||
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. | 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 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 | <pre># dpkg --remove-architecture i386 | ||
# apt-get update</pre> | # apt-get update</pre> | ||
Riga 225: | Riga 364: | ||
== 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- | <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 |
contributi