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.9.4-2_amd64.deb
(Reading database ... 227466 files and directories currently installed.) Preparing to unpack man-db_2.9.4-2_amd64.deb ... Unpacking man-db (2.9.4-2) over (2.8.5-2) ... Setting up man-db (2.9.4-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.69) ...
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.9.4-2_amd64.deb
(Reading database ... 227466 files and directories currently installed.) Preparing to unpack man-db_2.9.4-2_amd64.deb ... Unpacking man-db (2.9.4-2) over (2.9.4-2) ... Processing triggers for mailcap (3.69) ... #
dpkg --configure man-db
Setting up man-db (2.9.4-2) ... Updating database of manual pages ... man-db.service is a disabled or a static unit not running, not starting it.
dpkg
fallarà a l'instal·lar un paquet i retornarà un error; si l'usuari li demana ignorar-ho, només emetrà un avís; per aquesta raó tenim les diferents opcions ---force-*
. L'ordre dpkg --force-help
, o documentació d'aquesta ordre, donarà una llista completa d'aquestes opcions. L'error més freqüent, que segur que trobareu tard o d'hora, és una col·lisió d'arxius. Quan un paquet conté un fitxer que ja està instal·lat per un altre paquet, dpkg
es negarà a instal·lar-lo. Llavors apareixeran els següents missatges:
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/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: 17478 Maintainer: Michael Stone <mstone@debian.org> Architecture: amd64 Multi-Arch: foreign Source: coreutils (8.32-4) Version: 8.32-4+b1 Pre-Depends: libacl1 (>= 2.2.23), libattr1 (>= 1:2.4.44), libc6 (>= 2.28), libgmp10, 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 backupninja <none> <none> (no description available) un backuppc <none> <none> (no description available) ii baloo-kf5 5.78.0-3 amd64 framework for searching and manag> un balsa <none> <none> (no description available) ii baobab 3.38.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 11.1 amd64 Debian base system miscellaneous > ii base-passwd 3.5.51 amd64 Debian base system master passwor> ii bash 5.1-2+b1 amd64 GNU Bourne Again SHell [..] $
dpkg -c /var/cache/apt/archives/bash_5.1-3+b1_amd64.deb
drwxr-xr-x root/root 0 2021-07-25 20:43 ./ drwxr-xr-x root/root 0 2021-07-25 20:43 ./bin/ -rwxr-xr-x root/root 1234376 2021-07-25 20:43 ./bin/bash drwxr-xr-x root/root 0 2021-07-25 20:43 ./etc/ -rw-r--r-- root/root 1994 2021-07-25 20:43 ./etc/bash.bashrc drwxr-xr-x root/root 0 2021-07-25 20:43 ./etc/skel/ -rw-r--r-- root/root 220 2021-07-25 20:43 ./etc/skel/.bash_logout -rw-r--r-- root/root 3526 2021-07-25 20:43 ./etc/skel/.bashrc -rw-r--r-- root/root 807 2021-07-25 20:43 ./etc/skel/.profile drwxr-xr-x root/root 0 2021-07-25 20:43 ./usr/ drwxr-xr-x root/root 0 2021-07-25 20:43 ./usr/bin/ -rwxr-xr-x root/root 6759 2021-07-25 20:43 ./usr/bin/bashbug -rwxr-xr-x root/root 14648 2021-07-25 20:43 ./usr/bin/clear_console drwxr-xr-x root/root 0 2021-07-25 20:43 ./usr/share/ drwxr-xr-x root/root 0 2021-07-25 20:43 ./usr/share/doc/ [..] $
dpkg -I /var/cache/apt/archives/bash_5.1-3+b1_amd64.deb
new Debian package, version 2.0. size 1416600 bytes: control archive=7256 bytes. 77 bytes, 4 lines conffiles 1030 bytes, 27 lines control 4511 bytes, 64 lines md5sums 603 bytes, 31 lines * postinst #!/bin/bash 500 bytes, 25 lines * postrm #!/bin/sh 14536 bytes, 33 lines * preinst 289 bytes, 22 lines * prerm #!/bin/bash Package: bash Source: bash (5.1-3) Version: 5.1-3+b1 Architecture: amd64 Essential: yes Maintainer: Matthias Klose <doko@debian.org> Installed-Size: 6470 Pre-Depends: libc6 (>= 2.25), libtinfo6 (>= 6) Depends: base-files (>= 2.1.12), debianutils (>= 2.15) 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-8-base_8.3.0-6_armhf.deb
dpkg: error processing archive gcc-8-base_8.3.0-6_armhf.deb (--install): package architecture (armhf) does not match system (amd64) Errors were encountered while processing: gcc-8-base_8.3.0-6_armhf.deb #
dpkg --add-architecture armhf
#
dpkg --add-architecture armel
#
dpkg --print-foreign-architectures
armhf armel #
dpkg -i gcc-8-base_8.3.0-6_armhf.deb
(Reading database ... 14319 files and directories currently installed.) Preparing to unpack gcc-8-base_8.3.0-6_armhf.deb ... Unpacking gcc-8-base:armhf (8.3.0-6) ... Setting up gcc-8-base:armhf (8.3.0-6) ... #
dpkg --remove-architecture armhf
dpkg: error: cannot remove architecture 'armhf' currently in use by the database #
dpkg --remove-architecture armel
#
dpkg --print-foreign-architectures
armhf
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-9-base
dpkg-query: error: --status needs a valid package name but 'gcc-9-base' is not: ambiguous package name 'gcc-9-base' with more than one installed instance Use --help for help about querying packages. $
dpkg -s gcc-9-base:amd64 gcc-9-base:armhf | grep ^Multi
Multi-Arch: same 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-9-base/copyright
gcc-9-base:amd64, gcc-9-base:armhf: /usr/share/doc/gcc-9-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
”.