No es muy habitual instalar en GNU/Linux paquetes locales, esto es, que han sido descargados o compilados previamente; y cuando surge la necesidad de hacerlo no suele recurrirse al comando dpkg, lo cual obliga a abrir una ventana de terminal. En tales casos, resulta más cómodo instalarlo mediante la utilidad gdebi a través de nuestro gestor de ficheros preferido; con la ventaja añadida de que gdebi instala automáticamente desde los repositorios todos los paquetes dependientes que sean necesarios y no se hallen instalados en el sistema. Ahora bien, en ciertas ocasiones, el uso de dpkg facilita o hace posible ciertas tareas que, de otra manera, sería complicado o imposible de hacer.
En un artículo anterior mostré un ejemplo de uso de dicho comando: la instalación de un paquete que contiene un controlador alternativo para el chip inalámbrico de Realtek. En aquella ocasión se hacía preciso añadir un parámetro de ejecución (--force-overwrite
) que permitiera sobrescribir los ficheros del módulo del núcleo relativos a dicho dispositivo, lo cual solo podía hacerse a través de dpkg. Pero a veces, en otras circunstancias, no es imprescindible la ejecución de este comando para obtener cierta información o ejecutar una tarea relacionada con paquetes .deb, aunque resulta más útil o práctico ejecutarlo si hacemos uso de modificadores poco habituales.
Posibles escenarios de aplicación
- A veces se da el caso de que hemos instalado o actualizado uno o más paquetes desde los repositorios y, por misteriosas razones, el proceso de instalación no acaba todo lo bien que debería y, lo que es peor, no nos percatamos de ello, produciéndose una inconsistencia en la base de datos del sistema de paquetes. Para verificarlo podemos ejecutar dpkg como administrador, añadiendo la opción
-C
:$ sudo dpkg -C [nombre-paquete]
De esta forma realizará una búsqueda del paquete especificado o, si no se especifica nada, de los paquetes que hayan sido instalados parcialmente o se encuentren desaparecidos y, también, de posibles ficheros o datos de control incorrectos u obsoletos. Como resultado de dicha búsqueda, dpkg sugerirá qué hacer con ellos para solucionar los posibles problemas.
- Si tenemos curiosidad por saber qué ficheros y directorios han sido creados por parte de un paquete que hemos instalado, no tenemos más que añadir la opción
-L
:$ dpkg -L blt /. /usr /usr/share /usr/share/doc /usr/share/doc/blt /usr/share/doc/blt/changelog.Debian.gz /usr/share/doc/blt/changelog.gz /usr/share/doc/blt/copyright /usr/share/doc/blt/README.Debian
En esta ocasión es imprescindible especificar el nombre de un paquete, del cual se nos mostrará un listado con las rutas absolutas de sus ficheros. Pero si tenemos un paquete que nos hemos descargado (o compilado) y queremos saber qué ficheros contiene sin necesidad de instalarlo, podemos saberlo con la opción
-c
:$ dpkg -c ndiff_6.47-3+deb8u2_all.deb drwxr-xr-x root/root 0 2016-05-27 20:27 ./ drwxr-xr-x root/root 0 2016-05-27 20:27 ./usr/ drwxr-xr-x root/root 0 2016-05-27 20:27 ./usr/share/ drwxr-xr-x root/root 0 2016-05-27 20:27 ./usr/share/man/ drwxr-xr-x root/root 0 2016-05-27 20:27 ./usr/share/man/man1/ -rw-r--r-- root/root 3974 2016-05-27 20:27 ./usr/share/man/man1/ndiff.1.gz drwxr-xr-x root/root 0 2016-05-27 20:27 ./usr/share/doc/ drwxr-xr-x root/root 0 2016-05-27 20:27 ./usr/share/doc/ndiff/ -rw-r--r-- root/root 10225 2015-11-19 22:33 ./usr/share/doc/ndiff/copyright -rw-r--r-- root/root 227768 2014-08-22 00:04 ./usr/share/doc/ndiff/changelog.gz -rw-r--r-- root/root 8325 2016-05-27 16:09 ./usr/share/doc/ndiff/changelog.Debian.gz drwxr-xr-x root/root 0 2016-05-27 20:27 ./usr/lib/ drwxr-xr-x root/root 0 2016-05-27 20:27 ./usr/lib/python2.7/ drwxr-xr-x root/root 0 2016-05-27 20:27 ./usr/lib/python2.7/dist-packages/ -rw-r--r-- root/root 54699 2014-08-13 05:35 ./usr/lib/python2.7/dist-packages/ndiff.py drwxr-xr-x root/root 0 2016-05-27 20:27 ./usr/bin/ -rwxr-xr-x root/root 2575 2016-05-27 20:27 ./usr/bin/ndiff
Podemos descargarnos un paquete desde los repositorios mediante el comando aptitude:
$ aptitude download ndiff Des: 1 ftp://ftp.cica.es/debian/ jessie/main ndiff all 6.47-3+deb8u2 [257 kB] Descargados 257 kB en 2s (125 kB/s)
- En caso de no saber si tenemos instalado en nuestro sistema determinados paquetes, podremos consultarlo mediante la opción
-l
y la adición de ciertos comodines y filtros que ayuden a depurar los resultados. En este ejemplo se muestra un listado de los paquetes instalados en el sistema cuyos nombres empiezan con b.$ dpkg -l 'b*' | grep ^ii ii base-files 8+deb8u8 amd64 Debian base system miscellaneous files ii base-passwd 3.5.37 amd64 Debian base system master password and group files ii bash 4.3-11+deb8u1 amd64 GNU Bourne Again SHell ........
Y este ejemplo muestra un listado de paquetes no instalados cuyos nombres empiezan con n y acaban en r.
$ dpkg -l 'n*r' | grep ^un un nfs-kernel-server <ninguna> <ninguna> (no hay ninguna descripción disponible) un nvidia-vdpau-driver <ninguna> <ninguna> (no hay ninguna descripción disponible)
Si se omiten los comodines, entonces nos devuelve un listado de todos los paquetes presentes en el sistema; los no instalados son ignorados.
- En ocasiones nos encontramos con ficheros del sistema que no sabemos de donde han salido ni por qué están ahí. En tal situación viene bien averiguar a qué paquete pertenecen, lo cual haremos mediante la opción
-S
.$ dpkg -S /usr/lib/python2.7/dist-packages/radialnet/core/__init__.py zenmap: /usr/lib/python2.7/dist-packages/radialnet/core/__init__.py
Esta opción es muy útil cuando creemos haber desinstalado por completo un paquete del sistema, pero no estamos muy seguros de que se hayan eliminado todos los ficheros de configuración relacionados con dicho paquete. La desinstalación completa de paquetes mediante dpkg se lleva a cabo de la siguiente manera:
$ sudo dpkg -P nombre-paquete
La opción
-S
también es útil cuando desconocemos a qué paquete pertenece un determinado comando o utilidad; en cuyo caso debemos averiguar, en primer lugar, cual es la ruta del fichero ejecutable de dicho comando:$ which aplay /usr/bin/aplay
para luego obtener el nombre del paquete al que pertenece dicho ejecutable:
$ dpkg -S /usr/bin/aplay alsa-utils: /usr/bin/aplay
- Si queremos conocer todos los datos relativos a un paquete instalado en el sistema, solo es necesario ejecutar dpkg con la opción
-s
:$ dpkg -s e2fsprogs Package: e2fsprogs Essential: yes Status: install ok installed Priority: required Section: admin Installed-Size: 2781 Maintainer: Theodore Y. Ts'o <tytso@mit.edu> Architecture: amd64 Multi-Arch: foreign Source: e2fsprogs (1.42.12-2) Version: 1.42.12-2+b1 Replaces: hurd (<= 20040301-1), libblkid1 (<< 1.38+1.39-WIP-2005.12.10-2), libuuid1 (<< 1.38+1.39-WIP-2005.12.10-2) Pre-Depends: e2fslibs (= 1.42.12-2+b1), libblkid1 (>= 2.17.2), libc6 (>= 2.14), libcomerr2 (>= 1.42~WIP-2011-10-05-1), libss2 (>= 1.34-1), libuuid1 (>= 2.16), util-linux (>= 2.15~rc1-1) Suggests: gpart, parted, e2fsck-static Conflicts: dump (<< 0.4b4-4), initscripts (<< 2.85-4), quota (<< 1.55-8.1), sysvinit (<< 2.85-4) Conffiles: /etc/mke2fs.conf e2cdbf0620e93949af5857eb4739f949 Description: ext2/ext3/ext4 file system utilities The ext2, ext3 and ext4 file systems are successors of the original ext ("extended") file system. They are the main file system types used for hard disks on Debian and other Linux systems. . This package contains programs for creating, checking, and maintaining ext2/3/4-based file systems. It also includes the "badblocks" program, which can be used to scan for bad blocks on a disk or other storage device. Homepage: http://e2fsprogs.sourceforge.net
Y si, por último, queremos obtener información sobre un paquete aún no instalado que nos hemos descargado, aplicaremos la opción
-I
:$ dpkg -I ndiff_6.47-3+deb8u2_all.deb paquete debian nuevo, versión 2.0. tamaño 256722 bytes: archivo de control= 1010 bytes. 533 bytes, 16 líneas control 392 bytes, 6 líneas md5sums 155 bytes, 9 líneas * postinst #!/bin/sh 247 bytes, 14 líneas * prerm #!/bin/sh Package: ndiff Source: nmap Version: 6.47-3+deb8u2 Architecture: all Maintainer: Hilko Bengen <bengen@debian.org> Installed-Size: 349 Depends: python (>= 2.7), python (<< 2.8), python-lxml Recommends: nmap Conflicts: nmap (<< 6.47-3+deb8u2) Breaks: zenmap (<< 6.47-3+deb8u1~) Replaces: zenmap (<< 6.47-3+deb8u1~) Section: net Priority: extra Description: The Network Mapper - result compare utility Ndiff is a tool to aid in the comparison of Nmap scans. It takes two Nmap XML output files and prints the differences between them.
Aunque dpkg dispone de una interfaz de usuario para el terminal, a la cual podemos recurrir mediante la utilidad aptitude, nunca está de más conocer un poco su sintaxis para poder realizar ciertas funciones básicas de un modo rápido y eficaz.