Product SiteDocumentation Site

5.4. Manipolazione dei pacchetti con dpkg

dpkg è il comando di base per gestire i pacchetti Debian sul sistema. Se si hanno dei pacchetti .deb, è dpkg che permette l'installazione o l'analisi del loro contenuto. Ma questo programma ha solo una visione parziale dell'universo Debian: conosce cosa è installato sul sistema e ciò che è dato sulla riga di comando, ma non conosce nulla degli altri pacchetti disponibili. Perciò, fallirà se una dipendenza non è soddisfatta. Strumenti come apt-get, al contrario, creano un elenco di dipendenze da installare il più automaticamente possibile.

5.4.1. Installazione dei pacchetti

dpkg è, soprattutto, uno strumento per installare un pacchetto Debian già disponibile (perché non scarica niente). Per fare ciò, si usa la sua opzione -i oppure --install.

Esempio 5.2. Installazione di un pacchetto con dpkg

# dpkg -i man-db_2.5.7-4_i386.deb
(Reading database... 284247 files and directories currently installed.)
Preparing replacement man-db 2.5.7-3 (using .../man-db_2.5.7-4_i386.deb) ...
Unpacking the man-db update...
Configuring man-db (2.5.7-4) ...
Updating database of manual pages ...
Processing triggers for “doc-base”...
Processing 1 modified documentation file(s) 
Recording documents with scrollkeeper ... 

Si possono vedere i differenti passi eseguiti da dpkg; si può sapere, perciò, a quale punto si è verificato un errore. L'installazione può anche essere effettuata in due stadi: prima lo spacchettamento, poi la configurazione. apt-get si avvantaggia di ciò, limitando il numero di chiamate a dpkg (dal momento che ogni chiamata è onerosa a causa del caricamento del database in memoria, specialmente l'elenco dei file già installati).

Esempio 5.3. Spacchettamento e configurazione separati

# dpkg --unpack man-db_2.5.7-4_i386.deb
(Reading database... 284247 files already installed.)
Preparing replacement of man-db 2.5.7-3 (using .../man-db_2.5.7-4_i386.deb) ...
Unpacking the man-db update...
Processing triggers for “doc-base”...
Treatment of a modified documentation file(s) 
Recording documents with scrollkeeper ... 
#  dpkg --configure man-db
Configuring man-db (2.5.7-4) ...
Updating database of manual pages ...

Talvolta dpkg non riuscirà a installare un pacchetto e restituirà un errore; se l'utente ordina di ignorarlo, verrà emesso soltanto un avvertimento; è per questo motivo che esistono le diverse opzioni --force-*. Il comando dpkg --force-help, o la documentazione di questo comando, dà un elenco completo di queste opzioni. L'errore più frequente, che prima o poi si incontrerà, è una collisione tra file. Quando un pacchetto contiene un file che è già installato da un altro pacchetto, dpkg si rifiuterà di installarlo. Il seguente messaggio apparirà:
Unpacking libisc52 (from .../libisc52_1%3a9.6.ESV.R1+dfsg-0+lenny2_amd64.deb) ...
dpkg : error processing /var/cache/apt/archives/libisc52_1%3a9.6.ESV.R1+dfsg-0+lenny2_amd64.deb (--unpack) :
 trying to overwrite "/usr/lib/libisc.so.50", which is also in package libisc50 1:9.6.1.dfsg.P1-3
In questo caso, se si pensa che sostituire questo file non sia un rischio significativo per la stabilità del sistema (e solitamente è così), si può usare l'opzione --force-overwrite, che dice a dpkg di ignorare questo errore e di sovrascrivere il file.
Anche se ci sono molte opzioni --force-*, è probabile che solo --force-overwrite sia usata regolarmente. Queste opzioni esistono solamente per situazioni eccezionali ed è meglio lasciarle stare il più possibile per rispettare le regole imposte dal meccanismo dei pacchetti. Non si dimentichi che queste regole assicurano la coerenza e la stabilità del sistema.

5.4.2. Rimozione di pacchetti

Invocare dpkg con l'opzione -r o --remove seguita dal nome del pacchetto, rimuove tale pacchetto. Questa rimozione, comunque, non è completa: rimangono tutti i file di configurazione e gli script, i file di registro (registri di sistema) e altri dati dell'utente gestiti dal pacchetto. La ragione della loro conservazione è di disabilitare il programma disinstallandolo, preservando allo stesso tempo l'opzione di reinstallarlo velocemente e con la stessa configurazione. Per rimuovere completamente ogni cosa associata al pacchetto, usare l'opzione -P o --purge seguita dal nome del pacchetto.

Esempio 5.4. Rimozione ed eliminazione completa del pacchetto debian-cd

# dpkg -r debian-cd
(Reading database... 14170 files and directories already installed.)
Removing debian-cd ...
# dpkg -P debian-cd
(Reading database... 13794 files and directories already installed.)
Removing debian-cd ...
Removing debian-cd configuration files...

5.4.3. Altre funzionalità di dpkg

Prima di concludere questa sezione, si noti che alcune opzioni di dpkg possono interrogare il database interno per ottenere informazioni. Mostrando prima le opzioni lunghe e poi le corrispondenti opzioni corte (che evidentemente accettano i soliti argomenti) we cite --listfiles pacchetto (o -L), che elenca i file installati da questo pacchetto; --search file (o -S), che trova il pacchetto da cui proviene il file; --status pacchetto (o -s), che mostra le intestazioni di un pacchetto installato; --list (o -l), che mostra l'elenco dei pacchetti conosciuti dal sistema e il loro stato di installazione; --contents file.deb (o -c), che elenca i file nel pacchetto Debian specificato; --info file.deb (o -I), che mostra le intestazioni del pacchetto Debian.

Esempio 5.5. Varie richieste con dpkg

$ dpkg -L base-passwd
/.
/usr
/usr/sbin
/usr/sbin/update-passwd
/usr/share
/usr/share/man
/usr/share/man/ru
/usr/share/man/ru/man8
/usr/share/man/ru/man8/update-passwd.8.gz
/usr/share/man/pl
/usr/share/man/pl/man8
/usr/share/man/pl/man8/update-passwd.8.gz
/usr/share/man/man8
/usr/share/man/man8/update-passwd.8.gz
/usr/share/man/fr
/usr/share/man/fr/man8
/usr/share/man/fr/man8/update-passwd.8.gz
/usr/share/doc-base
/usr/share/doc-base/users-and-groups
/usr/share/base-passwd
/usr/share/base-passwd/passwd.master
/usr/share/base-passwd/group.master
/usr/share/lintian
/usr/share/lintian/overrides
/usr/share/lintian/overrides/base-passwd
/usr/share/doc
/usr/share/doc/base-passwd
/usr/share/doc/base-passwd/copyright
/usr/share/doc/base-passwd/users-and-groups.html
/usr/share/doc/base-passwd/changelog.gz
/usr/share/doc/base-passwd/users-and-groups.txt.gz
/usr/share/doc/base-passwd/README
$ dpkg -S /bin/date
coreutils: /bin/date
$ dpkg -s coreutils
Package: coreutils
Essential: yes
Status: install ok installed
Priority: required
Section: utils
Installed-Size: 12188
Maintainer: Michael Stone <mstone@debian.org>
Architecture: i386
Version: 8.5-1
Replaces: mktemp, timeout
Pre-Depends: libacl1 (>= 2.2.11-1), libattr1 (>= 2.4.41-1), libc6 (>= 2.6), libselinux1 (>= 1.32)
Conflicts: timeout
Description: GNU core utilities
 This package contains the basic file, shell and text manipulation
 utilities which are expected to exist on every operating system.
 .
 Specifically, this package includes:
 arch base64 basename cat chcon chgrp chmod chown chroot cksum comm cp
 csplit cut date dd df dir dircolors dirname du echo env expand expr
 factor false flock fmt fold groups head hostid id install join link ln
 logname ls md5sum mkdir mkfifo mknod mktemp mv nice nl nohup nproc od
 paste pathchk pinky pr printenv printf ptx pwd readlink rm rmdir runcon
 sha*sum seq shred sleep sort split stat stty sum sync tac tail tee test
 timeout touch tr true truncate tsort tty uname unexpand uniq unlink
 users vdir wc who whoami yes
Homepage: http://gnu.org/software/coreutils
$ dpkg -l 'b*' | head
Desired=Unknown/Install/Remove/Purge/Hold
| Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend
|/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad)
||/ Name                   Version    Description
+++-===================-==========-============================================
un  backupninja         <none>    (no description available)
un  base                <none>    (no description available)
un  base-config         <none>    (no description available)
ii  base-files          4          Debian base system miscellaneous files
ii  base-passwd         3.5.11     Debian base system master password and group
$ dpkg -c /var/cache/apt/archives/iceweasel_2.0.0.18-0etch1_i386.deb

drwxr-xr-x root/root         0 2008-11-23 23:18 ./
drwxr-xr-x root/root         0 2008-11-23 23:16 ./etc/
drwxr-xr-x root/root         0 2008-11-23 23:18 ./etc/iceweasel/
drwxr-xr-x root/root         0 2008-11-23 23:18 ./etc/iceweasel/profile/
-rw-r--r-- root/root      7138 2006-08-19 08:04 ./etc/iceweasel/profile/bookmarks.html
-rw-r--r-- root/root       153 2006-09-14 19:13 ./etc/iceweasel/profile/localstore.rdf
-rw-r--r-- root/root      3287 2005-02-01 18:36 ./etc/iceweasel/profile/search.rdf
-rw-r--r-- root/root       287 2004-11-30 22:26 ./etc/iceweasel/profile/mimeTypes.rdf
drwxr-xr-x root/root         0 2008-11-23 23:18 ./etc/iceweasel/profile/chrome/
-rw-r--r-- root/root      1078 2004-11-30 22:26 ./etc/iceweasel/profile/chrome/userChrome-example.css
-rw-r--r-- root/root       663 2004-11-30 22:26 ./etc/iceweasel/profile/chrome/userContent-example.css
-rw-r--r-- root/root       347 2004-07-28 23:20 ./etc/iceweasel/profile/prefs.js
-rw-r--r-- root/root        53 2008-11-23 22:43 ./etc/iceweasel/iceweaselrc
[...]
$ dpkg -I /var/cache/apt/archives/iceweasel_2.0.0.18-0etch1_i386.deb
 new Debian package, version 2.0.
 size 9126828 bytes : control file = 37297 bytes.
     346 bytes,     9 lines      conffiles            
    1255 bytes,    20 lines      control              
  122920 bytes,  1249 lines      md5sums              
    1267 bytes,    37 lines   *  postinst             #!/bin/sh
     293 bytes,     8 lines   *  postrm               #!/bin/sh
    2763 bytes,    70 lines   *  preinst              #!/bin/sh
     274 bytes,    12 lines   *  prerm                #!/bin/sh
 Package: iceweasel
 Version: 2.0.0.18-0etch1
 Section: web
 Priority: optional
 Architecture: i386
 Depends: fontconfig, psmisc, debianutils (>= 1.16), libatk1.0-0 (>= 1.12.2), libc6 (>= 2.3.6-6)...
 Suggests: iceweasel-gnome-support (= 2.0.0.18-0etch1), latex-xft-fonts, xprint, mozplugger, libkrb53
 Conflicts: mozilla-firefox (<< 1.5.dfsg-1), firefox (<< 2.0+dfsg-1)
 Replaces: mozilla-firefox, firefox (<< 2.0+dfsg-1)
 Provides: www-browser
 Installed-Size: 26364
 Maintainer: Eric Dorland <eric@debian.org>
 Description: lightweight web browser based on Mozilla
  Iceweasel is a redesign of the Mozilla browser component, similar to
  Galeon, K-Meleon and Camino, but written using the XUL user interface
  language and designed to be lightweight and cross-platform.
  .
  This browser is based on the Firefox source-code, with minor
  modifications. Historically, this browser was previously known as
  Firebird and Phoenix.

5.4.4. File di registro di dpkg

Una funzionalità introdotta recentemente in dpkg è che mantiene un registro di tutte le proprie azioni in /var/log/dpkg.log. Questo registro è estremamente prolisso, dal momento che contiene dettagli di ciascun stato attraverso cui passano i pacchetti gestiti da dpkg. Oltre a offrire un modo per tenere traccia del comportamento di dpkg, ciò aiuta, soprattutto, a mantenere una cronologia dello sviluppo del sistema: si può trovare il momento esatto in cui ciascun pacchetto è stato installato o aggiornato e queste informazioni possono essere estremamente utili nel comprendere un recente cambiamento di comportamento. Inoltre, siccome tutte le versioni sono registrate, è facile incrociare queste informazioni con il changelog.Debian.gz dei pacchetti in questione o anche con le segnalazioni di bug online.