Product SiteDocumentation Site

5.4. Manipulant els paquets amb dpkg

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.

5.4.1. Instal·lant paquets

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) ...
Podem veure els diferents passos realitzats per 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.

De vegades 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
En aquest cas, si penseu que substituir aquest fitxer no és un risc significatiu per a l'estabilitat del vostre sistema (que sol ser el cas), podeu utilitzar l'opció --force-overwrite, que indica a dpkg que ignori aquest error i sobreescrigui el fitxer.
While there are many available --force-* options, only --force-overwrite is likely to be used regularly. These options only exist for exceptional situations, rarely encountered in Debian Stable. It is better to leave them alone as much as possible in order to respect the rules imposed by the packaging mechanism. Do not forget, these rules ensure the consistency and stability of your system.

5.4.2. Eliminació de paquets

Invocar 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) ...

5.4.3. Consultant la base de dades de dpkg i inspeccionant arxius .deb

Before concluding this section, we will study dpkg options that query the internal database in order to obtain information. Giving first the long options and then corresponding short options (that will evidently take the same possible arguments) we cite
  • --listfiles package (or -L), which lists the files installed by this package;
  • --search file (or -S), which finds the package(s) containing the file;
  • --status package (or -s), which displays the headers of an installed package;
  • --list (or -l), which displays the list of packages known to the system and their installation status;
  • --contents file.deb (or -c), which lists the files in the Debian package specified;
  • --info file.deb (or -I), which displays the headers of this Debian package.

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.

5.4.4. Arxiu de registre de dpkg

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.

5.4.5. Suport multiarquitectura

Tots els paquets Debian tenen un camp 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.
Aquesta restricció garanteix que els usuaris no acabin amb binaris compilats per a una arquitectura incorrecta. Tot seria perfecte si no fos que hi ha (alguns) ordinadors que poden executar binaris de múltiples arquitectures, ja sigui nativament (un sistema “amd64” pot executar binaris “i386”) o a través d'emuladors.

5.4.5.1. Activant la multiarquitectura

El suport de multiarquitectura per part de 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-9-base_9.3.0-22_armhf.deb
dpkg: error processing archive gcc-9-base_9.3.0-22_armhf.deb (--install):
 package architecture (armhf) does not match system (amd64)
Errors were encountered while processing:
 gcc-9-base_9.3.0-22_armhf.deb
# dpkg --add-architecture armhf
# dpkg --add-architecture armel
# dpkg --print-foreign-architectures
armhf
armel
# dpkg -i gcc-9-base_9.3.0-22_armhf.deb
(Reading database ... 456367 files and directories currently installed.)
Preparing to unpack gcc-9-base_9.3.0-22_armhf.deb ...
Unpacking gcc-9-base:armhf (9.3.0-22) ...
Setting up gcc-9-base:armhf (9.3.0-22) ...
# 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

5.4.5.2. Canvis relacionats amb la multiarquitectura

Per fer que la multiarquitectura sigui realment usable i útil, les llibreries s'havien de tornar a empaquetar i moure a un directori específic per a l'arquitectura de manera que es puguin instal·lar múltiples còpies (destinades a diferents arquitectures). Aquests paquets actualitzats contenen el camp de capçalera “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
Val la pena assenyalar que els paquets 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.
El suport multiarquitectura també comporta alguns reptes interessants en la manera en què es gestionen les dependències. La satisfacció d'una dependència requereix o bé un paquet marcat “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”.