Instalación reversible

Cuando necesitamos instalar una aplicación en nuestro ordenador solemos hacer una búsqueda en los repositorios oficiales de la distribución GNU/Linux que estemos usando, a través de nuestra habitual herramienta de gestión de paquetes (apt-get, aptitude, synaptic o cualquier otra), e instalamos los paquetes necesarios con dicha herramienta. Y si no la encontramos, tampoco resulta difícil buscarla en un repositorio externo (no oficial) que sea compatible con la versión de nuestra distribución.

El problema

gestor paquetes

Gestor de paquetes de GNU/Linux

Pero, a veces, puede ocurrir que tampoco exista ningún repositorio que contenga la aplicación que estamos buscando. O que no disponga de una versión concreta de esa aplicación, controlador o lo que sea. No es muy habitual, pero puede darse el caso. Entonces sólo nos queda una alternativa: buscar su código fuente, compilarlo e instalarlo.

En los sitios web que alojan proyectos de software libre (como Sourceforge, Github, GitLab y similares) existen páginas de información y seguimiento para cada uno de los proyectos, las cuales suelen ofrecer, junto al enlace de descarga del archivo contenedor del código fuente, una serie de instrucciones detalladas para la compilación e instalación del software correspondiente a través de la interfaz de línea de comandos. Todas esas instrucciones sugieren la instalación del código compilado a través del comando:

$ make install

De esta forma se instala en nuestro sistema la aplicación que deseamos tener, con lo cual se da por finalizado el proceso y se procede a borrar todos los ficheros que han sido generados durante el mismo (con $ make clean). Pero, ¿qué ocurre si algún día queremos desinstalar esa aplicación?. Habitualmente, los desarrolladores de software contemplan la posibilidad de desinstalar aplicaciones con solo ejecutar:

$ make uninstall

Pero si no fuera así, ¿cómo podemos eliminar del sistema una aplicación que no ha sido instalada a través de paquetes?. En tales casos no es posible usar el comando dpkg, ni las herramientas de gestión de paquetes mencionadas anteriormente. Entonces, ¿qué hacemos?.

La solución

Para evitar que se produzcan este tipo de situaciones, disponemos en GNU/Linux de una utilidad denominada checkinstall que permite generar un paquete binario estándar (en formatos deb, rpm o txz) a partir de los ficheros compilados desde un código fuente; paquete que podrá ser manejado fácilmente con cualquier gestor de paquetes. De esa manera, es posible supervisar el procedimiento de instalación que resulta de ejecutar make install, abriéndonos la puerta a dos interesantes posibilidades:

  1. desinstalar fácilmente la aplicación que hemos instalado a través de ese paquete.
  2. volver a instalar dicho paquete sin necesidad de repetir el proceso completo de descarga, compilación etc. Opción útil en caso de reinstalación del sistema.

¿Cómo lo haremos?

Lo primero que tendremos que hacer es instalar esa utilidad:

$ sudo aptitude install checkinstall

Tras descargar el archivo de la aplicación que queremos empaquetar, descomprimirlo y seguir el proceso explicado en las instrucciones de compilación (que también pueden venir detalladas en un fichero llamado README) hasta llegar al paso previo a la instalación, nos encontraremos con que se han generado varios ficheros, que suelen tener la extensión .o, con los cuales vamos a crear el paquete. Para ello ejecutaremos checkinstall (como super-usuario) del siguiente modo:

sudo checkinstall −D −−install=no

Estas son las opciones que utilizo:

  • Con la opción −D indicamos a checkinstall que el paquete debe estar en formato Debian (deb), pero se puede elegir el formato Slackware (txz) mediante la opción −S, o el formato Red Hat (rpm) con −R
  • Por defecto, checkinstall instala automáticamente el paquete creado, salvo que le indiquemos lo contrario, como prefiero hacer yo debido a que, en ciertas ocasiones, para instalar un paquete, normalmente con el comando dpkg, es necesario ejecutarlo con opciones poco comunes, algo que no se podría hacer si dejamos que checkinstall lleve a cabo la instalación . Por tanto, siempre añado la opción larga −−install=no.

Tras lanzar el comando, nos pregunta lo siguiente:

The package documentation directory ./doc-pak does not exist.
Should I create a default set of package docs?  [y]:

A lo cual pulso Intro y dejo que ejecute la acción por defecto, ya que se trata de una elección intrascendente.

Después nos solicita que introduzcamos una descripción de la aplicación:

Termina tu descripcion con una linea vacia o con EOF.
>>

Lo haremos y pulsamos Intro. Cuando hayamos finalizado de escribir pulsaremos Intro en una línea vacía.

Es posible que nos aparezca un mensaje como este:

*** Warning: The package name "nombre_paquete" contains illegal
*** Warning: characters. dpkg might not like that so I changed
*** Warning: them to dashes.

*** Warning: The package version " " is not a
*** Warning: debian policy compliant one. Please specify an alternate one

Se trata de un aviso para recordarnos que el nombre del paquete no puede contener caracteres ilegales (solo puede haber letras, números y guiones), y que el número de versión solo puede contener números, guiones y puntos. Por tanto, nos está sugiriendo que escribamos un número de versión válido (el nombre inválido del paquete será corregido automáticamente por el propio checkinstall).

Tras pulsar Intro nos aparecerá un listado de los metadatos que contendrá el paquete:

Este paquete será creado de acuerdo a estos valores:

0 -  Maintainer: [ root@HP-11-D015ns ]
1 -  Summary: [ Descripción del paquete que va a ser creado ]
2 -  Name:    [ nombre-paquete ]
3 -  Version: [  ]
4 -  Release: [ 1 ]
5 -  License: [ GPL ]
6 -  Group:   [ checkinstall ]
7 -  Architecture: [ amd64 ]
8 -  Source location: [ nombre-paquete ]
9 -  Alternate source location: [  ]
10 - Requires: [  ]
11 - Provides: [ nombre-paquete ]
12 - Conflicts: [  ]
13 - Replaces: [  ]

Introduce un número para cambiar algún dato u oprime ENTER para continuar:

Como hay que modificar el campo Version, pulsamos la tecla 3; se nos pedirá introducir un número válido de versión:

Introduce un número para cambiar algún dato u oprime ENTER para continuar:3
Introduce la nueva versión:
>>1.1-5

Se nos vuelve a presentar los metadatos tras ser modificados, tras lo cual solo queda pulsar de nuevo Intro para que comience el proceso de creación del paquete.

Antes de finalizar nos vuelve a formular otras dos preguntas intrascendentes, a lo cual siempre respondo pulsando Intro y Yes (y), consecutivamente:

¿Quieres que los liste para tí? [n]:
¿Debo excluirlos del paquete (Decir que sí es una buena idea) [n]: y

El proceso de creación finaliza, si no surgen errores, con el siguiente mensaje en el terminal:

**********************************************************************

 Done. The new package has been saved to

 /home/aag/directorio_de_prueba/nombre-paquete_1.1-5_amd64.deb
 You can install it in your system anytime using: 

      dpkg -i nombre-paquete_1.1-5_amd64.deb

**********************************************************************

Después de lo cual veremos que, tal como estaba previsto, ha sido creado el susodicho paquete en formato Debian, el cual podremos instalar y, lo que es más importante, desinstalar cuando queramos y de la manera que más nos guste. Y además, tantas veces como haga falta.

Otras consideraciones

  • Si no queremos que el proceso sea interrumpido por preguntas intrascendentes (e inoportunas), podemos añadir la opción −y (o −−default) al ejecutar checkinstall, y se validarán las respuestas por defecto. Aunque esta opción también impide que podamos modificar los metadatos del paquete.
  • Si no desea incluir en el paquete los ficheros de documentación, añádase la opción −nodoc.
  • Para especificar de antemano un nombre de paquete añadiremos la opción −−pkgname seguido de un nombre con caracteres legales.
  • Para hacer lo mismo respecto al número de versión, usaremos la opción −−pkgversion seguido de un número con formato legal
  • Si queremos que el nuevo paquete sea generado en un directorio concreto, lo especificaremos a continuación de la opción −−pakdir

Esta utilidad dispone de otras opciones de ejecución que no he contemplado en este artículo, pueden examinarse echando un vistazo al manual

$ man checkinstall

algo muy recomendable si piensa generar paquetes rpm o txz.

Anuncios

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s