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

Sometimes, 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
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.
Encara que hi ha disponibles moltes opcions --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.

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

Abans d'acabar aquesta secció, estudiarem les opcions de 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.

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-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
# 

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-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
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”.