dpkg
Como ya se ha mencionado, dpkg (Debian Packages) es el programa base para manejar paquetes .deb, y fue creado por el equipo Debian. Si disponemos de un paquete .deb descargado localmente en el disco, dpkg nos permitirá instalarlo o analizar su contenido. Pero este programa solo tiene una visión parcial del universo Debian, sabe lo que está instalado en el sistema, pero no sabe nada más de otros paquetes disponibles y nunca descarga nada. Por lo tanto, fallará si no se satisface una dependencia.
La sintaxis del comando dpkg es la siguiente:
dpkg [ opción... ] acción
Solo podemos especificar una acción y cero o más opciones. La acción indica lo que queremos hacer y las opciones aspectos del comportamiento de dpkg.
Instalación de paquetes
La instalación de un paquete .deb se realiza con la acción -i, por ejemplo, vamos a instalar el paquete que contiene un grupo extra de páginas en español del manual del sistema; este paquete no tiene dependencias, por lo que no debemos instalar previamente nada más:
# dpkg -i manpages-es-extra_0.8a-17_all.deb
Seleccionando el paquete manpages-es-extra previamente no seleccionado.
(Leyendo la base de datos ... 206326 ficheros o directorios instalados actualmente.)
Preparando para desempaquetar manpages-es-extra_0.8a-17_all.deb ...
Desempaquetando manpages-es-extra (0.8a-17) ...
Configurando manpages-es-extra (0.8a-17) ...
La instalación de un paquete conlleva varios pasos, pero pueden ser resumidos en dos etapas, el desempaquetado y la configuración del paquete. Estas dos etapas puede realizarse de forma individual, de hecho, los programas front-end de APT hacen uso de esto cuando instalan varios paquetes, pues consiguen llamar menos veces a dpkg, mejorando así la velocidad de instalación ya que cada llamada a dpkg es costosa pues tiene que leer de la base de datos de paquetes la lista de todos los que que están instalados.
Si queremos ejecutar solo la fase de desempaquetado debemos usar la acción --unpack junto con el fichero .deb:
# dpkg --unpack manpages-es-extra_0.8a-17_all.deb
Seleccionando el paquete manpages-es-extra previamente no seleccionado.
(Leyendo la base de datos ... 206326 ficheros o directorios instalados actualmente.)
Preparando para desempaquetar manpages-es-extra_0.8a-17_all.deb ...
Desempaquetando manpages-es-extra (0.8a-17) ...
Procesando disparadores para man-db (2.7.0.2-5) ...
Por otro lado, la fase de configuración se llevará a cabo de forma individual con la acción --configure y el nombre del paquete (observa que no se pone el fichero .deb):
# dpkg --configure manpages-es-extra
Configurando manpages-es-extra (0.8a-17) ...
Si vamos a instalar varios paquetes .deb, podemos ponerlos en un directorio y con una sola orden instalarlos todos. Para ello hay que usar la opción -R junto con la acción -i. La sintaxis de la orden sería así:
# dpkg -R -i directorio
Si esto mismo lo queremos hacer en dos etapas (desempaquetado y configuración), ha que usar la opción -R junto con --unpack y la opción -a junto con --configure:
# dpkg -R --unpack directorio
# dpkg -a --configure
La etapa de configuración puede repetirse en cualquier momento si usamos el comando dpkg-reconfigure.
# dpkg-reconfigure [ opción... ] paquete...
Hay que recordar que dpkg dará un error en la instalación si la dependencia de un paquete no está instalada. Pero hay otro error muy frecuente, que tarde o temprano aparece, y consiste en una colisión de archivos, es decir, que la instalación de un paquete pretende instalar un archivo que ya otro paquete instaló. Podemos ver esto en el siguiente mensaje:
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 casos como estos, si sabemos que reemplazar el fichero no tiene ningún tipo de riesgo, podemos pedirle a dpkg que ignore el error y sobreescriba. Esto lo debemos hacer con la opción --force-overwrite:
dpkg --force-overwrite -i paquete.deb
dpkg --force-overwrite -R -i directorio
Desinstalación de paquetes
Para desinstalar un paquete podemos elegir dos acciones. En primer lugar, podemos usar la acción -r (--remove), la cual elimina el paquete pero no de forma completa, se mantendrán todos los archivos de configuración y otros ficheros relacionados con la gestión del paquete. Esto tiene la ventaja de que al reinstalar el paquete se mantiene la configuración que tenía cuando se borró.
dpkg -r paquete
Para eliminar completamente todo lo asociado con un paquete, hay que utilizar la opción -P (--purge).
dpkg -P paquete
Consulta de información sobre paquetes y manipulación de estos
Con dpkg también podemos consultar su base de datos interna de paquetes (/var/lib/dpkg/status) para obtener información. Así para listar los paquetes con los que dpkg ha trabajado en el sistema usaremos la opción -l (--list):
$ dpkg -l
Deseado=desconocido(U)/Instalar/eliminaR/Purgar/retener(H)
| Estado=No/Inst/ficheros-Conf/desempaqUetado/medio-conF/medio-inst(H)/espera-disparo(W)/pendienTe-disparo
|/ Err?=(ninguno)/requiere-Reinst (Estado,Err: mayúsc.=malo)
||/ Nombre Versión Arquitectura Descripción
+++-=====================================-=======================================-============-===============================================================================
ii acl 2.2.52-2 amd64 Access control list utilities
ii acpi 1.7-1 amd64 displays information on ACPI devices
ii acpi-support-base 0.142-6 all scripts for handling base ACPI events such as the power button
ii acpid 1:2.0.23-2 amd64 Advanced Configuration and Power Interface event daemon
ii adduser 3.113+nmu3 all add and remove users and groups
.....
.....
El significado de los tres primeros caracteres puede consultarse con man dpkg-query. En el caso de ii significa que el paquete está instalado en el sistema.
Podemos limitar la información de salida a un paquete o a varios para lo cual podemos añadir el nombre de un paquete o un patrón del tipo de expansión de ficheros.
$ dpkg -l 'dpkg*'
Deseado=desconocido(U)/Instalar/eliminaR/Purgar/retener(H)
| Estado=No/Inst/ficheros-Conf/desempaqUetado/medio-conF/medio-inst(H)/espera-disparo(W)/pendienTe-disparo
|/ Err?=(ninguno)/requiere-Reinst (Estado,Err: mayúsc.=malo)
||/ Nombre Versión Arquitectura Descripción
+++-====================================-=======================-=======================-=============================================================================
ii dpkg 1.17.27 amd64 Debian package management system
un dpkg-cross <ninguna> <ninguna> (no hay ninguna descripción disponible)
ii dpkg-dev 1.17.27 all Debian package development tools
No podemos olvidarnos de encerrar el patrón entre comillas dobles o simples, pues en caso contrario será el shell y no dpkg quien lo interprete.
Es posible pedir información de un paquete con la opción -s (--status):
$ dpkg -s manpages-es-extra
Package: manpages-es-extra
Status: install ok installed
Priority: extra
Section: doc
Installed-Size: 1472
Maintainer: Javier Fernandez-Sanguino Pen~a <jfs@debian.org>
Architecture: all
Version: 0.8a-17
Recommends: manpages-es
Suggests: man-browser
Description: Spanish extra manpages
$ dpkg -P manpages-es-extra
(Leyendo la base de datos ... 206605 ficheros o directorios instalados actualmente.)
Desinstalando manpages-es-extra (0.8a-17) ...
Procesando disparadores para man-db (2.7.0.2-5) ...
$ dpkg -s manpages-es-extra
dpkg-query: el paquete `manpages-es-extra' no está instalado y no hay ninguna información disponible.
Utilice dpkg --info (= dpkg-deb --info) para examinar archivos,
y dpkg --contents (= dpkg-deb --contents) para listar su contenido.
Otra opción es -L (--listfiles) que nos muestra todos los ficheros que se han copiado en el sistema tras la instalación de un paquete.
# dpkg -L tree
/.
/usr
/usr/bin
/usr/bin/tree
/usr/share
/usr/share/doc
/usr/share/doc/tree
/usr/share/doc/tree/copyright
/usr/share/doc/tree/TODO
/usr/share/doc/tree/changelog.Debian.gz
/usr/share/doc/tree/changelog.gz
/usr/share/doc/tree/README.gz
/usr/share/man
/usr/share/man/man1
/usr/share/man/man1/tree.1.gz
También es posible consultar a qué paquete pertenece un fichero en concreto, para ello usaremos la opción -S (--search).
$ dpkg -S /bin/ls
coreutils: /bin/ls
Como vemos, el comando ls se ha instalado con el paquete coreutils.
Estas cuatro opciones que hemos visto, pueden utilizarse también con el comando dpkg-query, que es a quien llama en realidad dpkg.
El comando dpkg también tiene opciones para manipular el paquete .deb, que en realidad son opciones del comando dpkg-deb. Así por ejemplo, la opción -c (--contents) muestra la lista de ficheros que contiene e instala un paquete .deb.
# dpkg -c manpages-es-extra_0.8a-17_all.deb
drwxr-xr-x root/root 0 2011-01-31 01:00 ./
drwxr-xr-x root/root 0 2011-01-31 01:00 ./usr/
drwxr-xr-x root/root 0 2011-01-31 01:00 ./usr/share/
drwxr-xr-x root/root 0 2011-01-31 01:00 ./usr/share/man/
drwxr-xr-x root/root 0 2011-01-31 01:00 ./usr/share/man/es/
drwxr-xr-x root/root 0 2011-01-31 01:00 ./usr/share/man/es/man6/
-rw-r--r-- root/root 1684 2011-01-31 01:00 ./usr/share/man/es/man6/banner.6.gz
drwxr-xr-x root/root 0 2011-01-31 01:00 ./usr/share/man/es/man7/
-rw-r--r-- root/root 2327 2011-01-31 01:00 ./usr/share/man/es/man7/regex_debian.7.gz
.....
.....
Con la opción -I (--info) se puede mostrar información de cabecera de un paquete.
# dpkg -I manpages-es-extra_0.8a-17_all.deb
paquete debian nuevo, versión 2.0.
tamaño 661466 bytes: archivo de control= 8231 bytes.
786 bytes, 23 líneas control
19020 bytes, 278 líneas md5sums
419 bytes, 18 líneas * postinst #!/bin/sh
93 bytes, 7 líneas * prerm #!/bin/sh
Package: manpages-es-extra
Version: 0.8a-17
Architecture: all
Maintainer: Javier Fernandez-Sanguino Pen~a <jfs@debian.org>
Installed-Size: 1472
Recommends: manpages-es
Suggests: man-browser
Section: doc
Priority: extra
Homepage: http://ditec.um.es/~piernas/manpages-es/
Description: Spanish extra manpages
Podemos extraer la información de control de un paquete con -e (--control).
# mkdir man
# dpkg -e manpages-es-extra_0.8a-17_all.deb man
# tree man
man
├── control
├── md5sums
├── postinst
└── prerm
0 directories, 4 files
Y también, con la opción -x (--extract) se pueden extraer los ficheros que se copiarán con la instalación del paquete, o bien, extraer y mostrar con -X (--vextract).
# dpkg -X tree_1.7.0-5_amd64.deb tree
./
./usr/
./usr/bin/
./usr/bin/tree
./usr/share/
./usr/share/doc/
./usr/share/doc/tree/
./usr/share/doc/tree/README.gz
./usr/share/doc/tree/TODO
./usr/share/doc/tree/changelog.Debian.gz
./usr/share/doc/tree/changelog.gz
./usr/share/doc/tree/copyright
./usr/share/man/
./usr/share/man/man1/
./usr/share/man/man1/tree.1.gz
# tree tree
tree
└── usr
├── bin
│ └── tree
└── share
├── doc
│ └── tree
│ ├── changelog.Debian.gz
│ ├── changelog.gz
│ ├── copyright
│ ├── README.gz
│ └── TODO
└── man
└── man1
└── tree.1.gz
7 directories, 7 files
El comando dpkg mantiene un registro de todas sus acciones en /var/log/dpkg.log. Este registro es extremadamente detallado, ya que incluye cada una de las etapas por las que pasa un paquete gestionado por dpkg . Además de ofrecer una forma de rastrear el funcionamiento de dpkg, sobre todo ayuda a mantener un historial del desarrollo del sistema: se puede encontrar el momento exacto en el que se instaló o actualizó un paquete, y esa información puede ser extremadamente útil cuando se intenta entender un cambio de comportamiento reciente.
Arquitecturas
Actualmente existen equipos que pueden ejecutar binarios para más de una arquitectura, por ejemplo, desde un equipo con arquitectura de 64 bits amd64, se pueden ejecutar binarios de la arquitectura de 32 bits i386. Por tanto, en algunos equipos es posible instalar paquete de otras arquitecturas además de la nativa. Por defecto, dpkg solo deja instalar paquetes de la arquitectura nativa, que es la que devuelve el siguiente comando:
$ dpkg --print-architecture
amd64
Vemos el error si intentamos instalar un paquete de una arquitectura incompatible:
# wget http://ftp.es.debian.org/debian/pool/main/t/tree/tree_1.7.0-5_powerpc.deb
--2017-07-23 21:23:10-- http://ftp.es.debian.org/debian/pool/main/t/tree/tree_1.7.0-5_powerpc.deb
Resolviendo ftp.es.debian.org (ftp.es.debian.org)... 82.194.78.250
Conectando con ftp.es.debian.org (ftp.es.debian.org)[82.194.78.250]:80... conectado.
Petición HTTP enviada, esperando respuesta... 200 OK
Longitud: 44706 (44K) [application/vnd.debian.binary-package]
Grabando a: “tree_1.7.0-5_powerpc.deb”
tree_1.7.0-5_powerpc.deb 100%[=======================================================================================>] 43,66K --.-KB/s en 0,04s
2017-07-23 21:23:11 (1,19 MB/s) - “tree_1.7.0-5_powerpc.deb” guardado [44706/44706]
# dpkg -i tree_1.7.0-5_powerpc.deb
dpkg: error al procesar el archivo tree_1.7.0-5_powerpc.deb (--install):
la arquitectura del paquete (powerpc) no corresponde con la del sistema (amd64)
Se encontraron errores al procesar:
tree_1.7.0-5_powerpc.deb
Hay muchos casos de uso para multiarquitectura, pero el más popular es la capacidad de instalar binarios de 32 bits (i386) en sistemas de 64 bits (amd64), en particular debido a que varias aplicaciones privativas populares, como Skype, solo proveen versiones de 32 bits.
Para poder instalar de paquetes de otras arquitecturas hay que configurar el comando dpkg explícitamente con la acción --add-architecture. Por ejemplo, para añadir la arquitectura i386 ejecutaríamos:
# dpkg --add-architecture i386
Podemos ver qué arquitecturas foráneas se han configurado:
# dpkg --print-foreign-architectures
i386
Y también, con la acción --remove-architecture, podemos eliminar una arquitectura que tengamos configurada, pero siempre y cuando no haya ningún paquete instalado de dicha arquitectura.
# dpkg --remove-architecture i386
# dpkg --print-foreign-architectura
#
En la información de cabecera de un paquete .deb se indica, a través del campo Architecture, la o las arquitecturas en las que el paquete puede instalarse.
# dpkg -I manpages-es-extra_0.8a-17_all.deb
paquete debian nuevo, versión 2.0.
tamaño 661466 bytes: archivo de control= 8231 bytes.
786 bytes, 23 líneas control
19020 bytes, 278 líneas md5sums
419 bytes, 18 líneas * postinst #!/bin/sh
93 bytes, 7 líneas * prerm #!/bin/sh
Package: manpages-es-extra
Version: 0.8a-17
Architecture: all
Maintainer: Javier Fernandez-Sanguino Pen~a <jfs@debian.org>
Installed-Size: 1472
Recommends: manpages-es
Suggests: man-browser
Section: doc
Priority: extra
Homepage: http://ditec.um.es/~piernas/manpages-es/
Description: Spanish extra manpages
En este caso, el valor all para manpages-es-extra_0.8a-17_all.deb indica que puede instalarse en todas las arquitecturas que soporta Debian.
Licencia: licencia de software libre GPL