El manipulador de paquetes

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.

Deja un comentario

Este sitio utiliza Akismet para reducir el spam. Conoce cómo se procesan los datos de tus comentarios.