dpkg
és l'ordre base per gestionar els paquets Debian al sistema. Si teniu paquets .deb
, és dpkg
que en permet la instal·lació o analitzar-ne el contingut. Però aquest programa només té una visió parcial de l'univers de Debian: sap el que està instal·lat al sistema, i el que se li passa a la línia de comandes, però no sap res dels altres paquets disponibles. Com a tal, fallarà si no es compleix una dependència. Eines com apt
i aptitude
, per contra, crearan una llista de dependències per instal·lar-ho tot el més automàticament possible.
dpkg
és, sobretot, l'eina per instal·lar un paquet Debian ja disponible (perquè no descarrega res). Per fer-ho, utilitzem la opció -i
o --install
.
Exemple 5.2. Instal·lació d'un paquet amb dpkg
#
dpkg -i man-db_2.11.2-2_amd64.deb
(Reading database ... 166273 files and directories currently installed.) Preparing to unpack man-db_2.11.2-2_amd64.deb ... Unpacking man-db (2.11.2-2) over (2.11.2-2) ... Setting up man-db (2.11.2-2) ... Updating database of manual pages ... man-db.service is a disabled or a static unit not running, not starting it. Processing triggers for mailcap (3.70+nmu1) ...
dpkg
; sabem, per tant, en quin punt es pot haver produït qualsevol error. La instal·lació també es pot efectuar en dues etapes: primer desempaquetant, i després la configuració. apt
s'aprofita d'això, limitant el nombre de crides a dpkg
(ja que cada crida és costosa a causa de la càrrega de la base de dades a memòria, especialment la llista de fitxers ja instal·lats).
Exemple 5.3. Desempaquetat i configuració per separat
#
dpkg --unpack man-db_2.11.2-2_amd64.deb
(Reading database ... 166273 files and directories currently installed.) Preparing to unpack man-db_2.11.2-2_amd64.deb ... Unpacking man-db (2.11.2-2) over (2.11.2-2) ... Processing triggers for mailcap (3.70+nmu1) ... #
dpkg --configure man-db
Setting up man-db (2.11.2-2) ... Updating database of manual pages ... man-db.service is a disabled or a static unit not running, not starting it.
dpkg
will fail to install a package and return an error; if the user orders it to ignore this, it will only issue a warning; it is for this reason that we have the different --force-*
options. The dpkg --force-help
command, or documentation of this command, will give a complete list of these options. The most frequent error, which you are bound to encounter sooner or later, is a file collision. When a package contains a file that is already installed by another package, dpkg
will refuse to install it. The following messages will then appear:
Unpacking libgdm (from .../libgdm_3.8.3-2_amd64.deb) ...
dpkg: error processing /var/cache/apt/archives/libgdm_3.8.3-2_amd64.deb (--unpack):
trying to overwrite '/usr/bin/gdmflexiserver', which is also in package gdm3 3.4.1-9
--force-overwrite
, que indica a dpkg
que ignori aquest error i sobreescrigui el fitxer.
--force-*
, és probable que només utilitzeu regularment --force-overwrite
. Aquestes opcions només existeixen per a situacions excepcionals, i que rarament us hi trobareu amb Debian Stable. És millor deixar-les estar en la mesura que sigui possible per a respectar les normes imposades pel sistema de paquets. No oblideu que aquestes normes garanteixen la coherència i l'estabilitat del vostre sistema.
dpkg
amb l'opció -r
o --remove
, seguit pel nom d'un paquet, elimina aquest paquet. Aquesta eliminació, però, no és completa: es mantenen tots els arxius de configuració, els scripts de mantenidor, els arxius de registre (registres del sistema) i altres dades d'usuari gestionats pel paquet. D'aquesta manera es pot desactivar fàcilment el programa desinstal·lant-lo, i encara és possible tornar-lo a instal·lar ràpidament amb la mateixa configuració. Per eliminar completament tot el que s'associa amb un paquet, utilitzeu l'opció -P
o --purge
, seguit pel nom del paquet.
Exemple 5.4. Eliminació i purga del paquet debian-cd
#
dpkg -r debian-cd
(Reading database ... 228705 files and directories currently installed.) Removing debian-cd (3.1.35) ... #
dpkg -P debian-cd
(Reading database ... 228049 files and directories currently installed.) Purging configuration files for debian-cd (3.1.35) ...
dpkg
que consulten la base de dades interna per obtenir-ne informació. Donant primer les opcions llargues i després les corresponents opcions curtes (que evidentment tenen els mateixos paràmetres possibles) citarem
--listfiles paquet
(o -L
), que llista els fitxers instal·lats per aquest paquet;
--search fitxer
(o -S
), que cerca els paquets que contenen el fitxer;
--status paquet
(o -s
), que motra les capçaleres d'un paquet instal·lat;
--list
(o -l
), que mostra la llista de paquets coneguts pel sistema i el seu estat d'instal·lació;
--contents fitxer.deb
(o -c
), que llista els fitxers continguts al paquet Debian especificat;
--info fitxer.deb
(o -I
), que mostra les capçaleres del paquet Debian donat.
Exemple 5.5. Diverses consultes amb dpkg
$
dpkg -L base-passwd
/. /usr /usr/sbin /usr/sbin/update-passwd /usr/share /usr/share/base-passwd /usr/share/base-passwd/group.master /usr/share/base-passwd/passwd.master /usr/share/doc /usr/share/doc/base-passwd /usr/share/doc/base-passwd/README /usr/share/doc/base-passwd/changelog.gz /usr/share/doc/base-passwd/copyright /usr/share/doc/base-passwd/users-and-groups.html /usr/share/doc/base-passwd/users-and-groups.txt.gz /usr/share/doc-base /usr/share/doc-base/base-passwd.users-and-groups /usr/share/lintian /usr/share/lintian/overrides /usr/share/lintian/overrides/base-passwd /usr/share/man /usr/share/man/de /usr/share/man/de/man8 /usr/share/man/de/man8/update-passwd.8.gz /usr/share/man/es /usr/share/man/es/man8 /usr/share/man/es/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/man/ja /usr/share/man/ja/man8 /usr/share/man/ja/man8/update-passwd.8.gz /usr/share/man/man8 /usr/share/man/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/ru /usr/share/man/ru/man8 /usr/share/man/ru/man8/update-passwd.8.gz $
dpkg -S /bin/date
coreutils: /bin/date $
dpkg -s coreutils
Package: coreutils Essential: yes Status: install ok installed Priority: required Section: utils Installed-Size: 18062 Maintainer: Michael Stone <mstone@debian.org> Architecture: amd64 Multi-Arch: foreign Version: 9.1-1 Pre-Depends: libacl1 (>= 2.2.23), libattr1 (>= 1:2.4.44), libc6 (>= 2.34), libgmp10 (>= 2:6.2.1+dfsg1), libselinux1 (>= 3.1~) 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 numfmt od paste pathchk pinky pr printenv printf ptx pwd readlink realpath 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*'
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 Architecture Description +++-==========================-==============-============-=================== un backuppc <none> <none> (no description available) un balsa <none> <none> (no description available) ii baobab 43.0-1 amd64 GNOME disk usage analyzer un base <none> <none> (no description available) un base-config <none> <none> (no description available) ii base-files 12.4+deb12u5 amd64 Debian base system miscellaneous files ii base-passwd 3.6.1 amd64 Debian base system master password and group files ii bash 5.2.15-2+b2 amd64 GNU Bourne Again SHell ii bash-completion 1:2.11-6 all programmable completion for the bash shell [..] $
dpkg -c /var/cache/apt/archives/bash_5.2.15-2+b2_amd64.deb
drwxr-xr-x root/root 0 2023-04-23 17:23 ./ drwxr-xr-x root/root 0 2023-04-23 17:23 ./bin/ -rwxr-xr-x root/root 1265648 2023-04-23 17:23 ./bin/bash drwxr-xr-x root/root 0 2023-04-23 17:23 ./etc/ -rw-r--r-- root/root 1994 2023-04-23 17:23 ./etc/bash.bashrc drwxr-xr-x root/root 0 2023-04-23 17:23 ./etc/skel/ -rw-r--r-- root/root 220 2023-04-23 17:23 ./etc/skel/.bash_logout -rw-r--r-- root/root 3526 2023-04-23 17:23 ./etc/skel/.bashrc -rw-r--r-- root/root 807 2023-04-23 17:23 ./etc/skel/.profile drwxr-xr-x root/root 0 2023-04-23 17:23 ./usr/ drwxr-xr-x root/root 0 2023-04-23 17:23 ./usr/bin/ -rwxr-xr-x root/root 6865 2023-04-23 17:23 ./usr/bin/bashbug -rwxr-xr-x root/root 14488 2023-04-23 17:23 ./usr/bin/clear_console drwxr-xr-x root/root 0 2023-04-23 17:23 ./usr/share/ drwxr-xr-x root/root 0 2023-04-23 17:23 ./usr/share/debianutils/ drwxr-xr-x root/root 0 2023-04-23 17:23 ./usr/share/debianutils/shells.d/ -rw-r--r-- root/root 21 2023-04-23 17:23 ./usr/share/debianutils/shells.d/bash drwxr-xr-x root/root 0 2023-04-23 17:23 ./usr/share/doc/ [..] $
dpkg -I /var/cache/apt/archives/bash_5.2.15-2+b2_amd64.deb
new Debian package, version 2.0. size 1490660 bytes: control archive=2972 bytes. 77 bytes, 4 lines conffiles 1039 bytes, 27 lines control 4581 bytes, 65 lines md5sums 486 bytes, 24 lines * postinst #!/bin/bash 209 bytes, 5 lines * postrm #!/bin/sh 289 bytes, 22 lines * prerm #!/bin/bash Package: bash Source: bash (5.2.15-2) Version: 5.2.15-2+b2 Architecture: amd64 Essential: yes Maintainer: Matthias Klose <doko@debian.org> Installed-Size: 7164 Pre-Depends: libc6 (>= 2.36), libtinfo6 (>= 6) Depends: base-files (>= 2.1.12), debianutils (>= 5.6-0.1) Recommends: bash-completion (>= 20060301-0) Suggests: bash-doc Conflicts: bash-completion (<< 20060301-0) Replaces: bash-completion (<< 20060301-0), bash-doc (<= 2.05-1) Section: shells Priority: required Multi-Arch: foreign Homepage: http://tiswww.case.edu/php/chet/bash/bashtop.html Description: GNU Bourne Again SHell Bash is an sh-compatible command language interpreter that executes commands read from the standard input or from a file. Bash also incorporates useful features from the Korn and C shells (ksh and csh). . Bash is ultimately intended to be a conformant implementation of the IEEE POSIX Shell and Tools specification (IEEE Working Group 1003.2). . The Programmable Completion Code, by Ian Macdonald, is now found in the bash-completion package.
dpkg
manté un registre de totes les seves accions a /var/log/dpkg.log
. Aquest registre és extremadament detallat, ja que inclou cadascun dels estadis a través dels quals passen els paquets gestionats per dpkg
. A més d'oferir una manera de seguir el comportament de dpkg, ajuda, sobretot, a mantenir una història del desenvolupament del sistema: es pot trobar el moment exacte en què cada paquet s'ha instal·lat o actualitzat, i aquesta informació pot ser extremadament útil per entendre un canvi recent en el comportament. A més, com totes les versions s'estan desant, és fàcil comprovar la informació amb el changelog. Debian.gz
per als paquets en qüestió, o fins i tot amb informes d'errors a la xarxa.
Architecture
a la seva informació de control. Aquest camp pot contenir o bé “all
” (per a paquets que són independents de l'arquitectura) o bé el nom de l'arquitectura a la qual es dirigeix (com ara "amd64", "armhf", ...). En aquest últim cas, per defecte, dpkg
només acceptarà instal·lar el paquet si la seva arquitectura coincideix amb l'arquitectura de l'amfitrió tal i com es retorna amb dpkg --print-architecture
.
dpkg
permet als usuaris definir “arquitectures foranes” que es poden instal·lar al sistema actual. Això es fa simplement amb dpkg --add-architecture
com en l'exemple següent. Hi ha un corresponent dpkg --remove-architectitecture
per eliminar el suport d'una arquitectura forana, però només es pot utilitzar quan no queden paquets instal·lats d'aquesta arquitectura.
#
dpkg --print-architecture
amd64 #
dpkg --print-foreign-architectures
#
dpkg -i gcc-12-base_12.2.0-14_arm64.deb
dpkg: error: cannot access archive 'gcc-12-base_12.2.0-14_arm64.deb': No such file or directory #
dpkg --add-architecture arm64
#
dpkg --add-architecture arm64
#
dpkg --print-foreign-architectures
arm64 #
dpkg -i gcc-12-base_12.2.0-14_arm64.deb
Selecting previously unselected package gcc-12-base:arm64. (Reading database ... 166273 files and directories currently installed.) Preparing to unpack gcc-12-base_12.2.0-14_arm64.deb ... Unpacking gcc-12-base:arm64 (12.2.0-14) ... Setting up gcc-12-base:arm64 (12.2.0-14) ... #
dpkg --remove-architecture arm64
dpkg: error: cannot remove architecture 'arm64' currently in use by the database [..] #
dpkg --remove-architecture arm64
#
dpkg --print-foreign-architectures
#
Multi-Arch: same
” per indicar al sistema de paquets que les diverses arquitectures del paquet poden ser coinstal·lades de manera segura (i que aquests paquets només poden satisfer les dependències dels paquets de la mateixa arquitectura). Les llibreries més importants han estat convertides des de la introducció de la multiarquitectura a Debian 7 Wheezy, però hi ha moltes biblioteques que probablement mai seran convertides llevat que algú ho sol·liciti específicament (a través d'un informe d'error, per exemple).
$
dpkg -s gcc-12-base
dpkg-query: error: --status needs a valid package name but 'gcc-12-base' is not: ambiguous package name 'gcc-12-base' with more than one installed instance Use --help for help about querying packages. $
dpkg -s gcc-12-base:arm64 | grep ^Multi
Multi-Arch: same $
dpkg -L libgcc-s1:amd64 |grep .so
/lib/x86_64-linux-gnu/libgcc_s.so.1 $
dpkg -S /usr/share/doc/gcc-12-base/copyright
gcc-12-base:amd64, gcc-12-base:arm64: /usr/share/doc/gcc-12-base/copyright
Multi-Arch: same
han de tenir els seus noms qualificats amb la seva arquitectura per ser inequívocament identificables. També tenen la possibilitat de compartir fitxers amb altres instàncies del mateix paquet; dpkg
assegura que tots els paquets tenen fitxers idèntics bit a bit quan es comparteixen. Finalment, però no menys important, totes les instàncies d'un paquet han de tenir la mateixa versió. Per tant, han d'actualitzar-se alhora.
Multi-Arch: foreign
” o un paquet l'arquitectura del qual coincideixi amb la del paquet que declara la dependència (en aquest procés de resolució de dependències s'assumeix que els paquets independents de l'arquitectura són de la mateixa arquitectura que l'amfitrió). Una dependència també es pot rellaxar per permetre qualsevol arquitectura per complir-la, amb la sintaxi paquet:any
, però els paquets foranis només poden satisfer aquesta dependència si estan marcats “Multi-Arch: allowed
”.