Logo DLSI

Tema 4 - Sistemas de paquetes

Curso 2024-2025

Distribución eficiente del software.

  • Una vez tenemos nuestro software listo para ser utilizado…​

  • Debemos hacerlo llegar a los potenciales usuarios…​

  • Cuanto más fácil de instalar les sea…​más probable es que lo empleen.

  • Debemos evitar instalaciones tipo Windows…​donde el s.o. no nos proporciona los mecanismos de gestión apropiados para la instalación de software…​

    • Desconoce componentes ya instalados.

    • No tiene en cuenta dependencias

    • Permite la sobreescritura de archivos ya instalados (DLL Hell)

    • La propia Microsoft ofrece como alternativa a estos instaladores el conocido como Windows Installer, para la instalación, mantenimiento y eliminación de programas en s.o. de la familia Windows.

Algunos formatos de paquetes para distribuir software

Vamos a ver a partir de este punto algunos de los formatos de distribución de software en el mundo del software libre.
  • TAR / TGZ / TBZ / TXZ

  • DEB

  • RPM

Formatos TAR / TGZ / TBZ / TXZ (I)

  • El formato original es TAR.

  • Es un formato de archivos ampliamente usado en entornos UNIX.

  • Los archivos en este formato usan la extensión .tar

  • Es un formato pensado inicialmente para ser usado con cintas magnéticas, de ahí su nombre Tape ARchiver (en inglés: archivador en cinta)

  • Tar sólo reune los diferentes ficheros en un solo archivo, no realiza compresión de datos, por tanto no reduce el tamaño de los archivos que crea.

Formatos TAR / TGZ / TBZ / TXZ (II)

  • La órden de llamada suele tener este formato:

    tar <<opciones>> <<archivoSalida>> <<archivo1>> ... <<archivoN>>
  • Dado que "tar" fue diseñado en sistemas "UNIX", almacena la metainformación de los ficheros en estos s.o.: fecha de última modificación, propietario y permisos al estilo UNIX. Además admite el almacenamiento de enlaces simbólicos y enlaces duros

  • El formato tar está estandarizado por las normas POSIX1 y posteriormente por POSIX2.

  • Veamos algunos ejemplos prácticos de uso…​

Formatos TAR / TGZ / TBZ / TXZ (III)

  • Hemos dicho que tar no comprime…​solo empaqueta.

  • Pero es bastante habitual comprimir después de empaquetar…​

  • …​por eso permite enlazar con diversos compresores de forma automática:

    • gzip …​ usando la opción -z

    • bzip2 …​ usando la opción -j

    • xz …​ usando la opción -J

  • Por tanto,un archivo tar comprimido con:

    • gzip puede usar las extensiones: ".tar.gz" o ".tgz"

    • bzip2 puede usar las extensiones: ".tar.bz" o ".tbz"

    • xz puede usar las extensiones: ".tar.xz" o ".txz"

Formatos TAR / TGZ / TBZ / TXZ (IV)

  • Hagamos una serie de pruebas en modo texto y modo gráfico…​

  • A pesar de lo sencillo de usar que hemos visto que es el formato tar…​

  • Además de ser un estandar POSIX…​

    • …​resulta que tiene una serie de restricciones/carencias para ser usado en la distribución de software de manera eficiente…​

  • Al distribuir software es bastante normal que no baste solo con copiar determinados archivos en lugares concretos…​, por ejemplo:

    • …​que tengamos que ejecutar determinadas acciones para finalizar la instalación correctamente.

    • …​que nos interese saber si hay instalado un determinado software previamente y en alguna versión concreta (comprobación de dependencias)…​

Formatos TAR / TGZ / TBZ / TXZ (V)

  • Es por eso que en la distribución de software, por parte de determinados s.o., se suelen emplear otros formatos tales como DEB y RPM.

  • En estos ficheros, además de la información a instalar, podemos indicar:

    • acciones a llevar a cabo como parte del proceso de instalación/desinstalación.

    • comprobación de dependencias de software previamente instalado

    • software recomendado que complementa al que vamos a instalar y puede ser de ayuda al ususario.

  • En el resto del tema nos centraremos en el formato DEB y veremos como generar RPM desde un DEB de manera semi-automática.

Formato DEB (I)

  • La estructura interna de estos ficheros es la de un archivo ar.

  • Internamente contiene tres archivos:

    • "debian-binary": fichero de texto que contiene el número de versión del formato deb. Actualmente es la 2.0.

    • "control.tar.gz": Contiene la meta-información del paquete.

    • "data.tar", "data.tar.gz", "data.tar.bz2" o "data.tar.lzma": Contiene los archivos a instalar.

Formato DEB (II)

Veamos como crear un archivo en formato DEB de forma manual.

Cuando terminemos verás que este archivo se parece más aun TAR que a un DEB ya que la parte de control no estará completa.

  • Estando en el directorio principal de nuestro proyecto, ejecutamos:

    mkdir ./debian
  • Bajo el subdirectorio ./debian reproducimos toda la estructura de directorios de nuestro software cuando esté instalado. En este ejemplo sencillo solo tenemos los subdirectorios "usr" y "usr/bin".

  • Estando en el directorio principal de nuestro proyecto, ejecutamos:

    mkdir -p ./debian/usr/bin
  • Copiamos manualmente los ficheros que componen nuestro software a los directorios que corresponda bajo "./debian":

    cp helloword ./debian/usr/bin

Formato DEB (III)

  • Creamos el directorio "./debian/DEBIAN" y dentro de él, el fichero "./debian/DEBIAN/control".

  • Este fichero tiene este formato:

  Package: helloworld
  Priority: optional
  Section: misc
  Maintainer: dca
  Architecture: amd64
  Version: 1.0
  Depends:
  Description: Increible implementacion de HolaMundo
   Al ser ejecutado, imprime una linea en el terminal con el
   texto: 'Hola Mundo'.
  • Y ahora solo nos queda construir el fichero DEB:

    fakeroot dpkg -b ./debian /ruta/hasta/fichero.deb

Formato DEB (IV)

  • El ejemplo anterior ha sido a nivel ilustrativo…​

  • En la práctica dispondremos, por ejemplo, del código fuente del software en un fichero TGZ y tendremos que compilarlo y seguir los pasos que marque su creador para tener una versión instalable del mismo.

  • Afortunadamente en estos casos, todo ello se gestiona con uno o varios ficheros Makefile, los cuales disponen de un objetivo o target llamado install que copia los archivos necesarios a los directorios correspondientes.

  • Afortunadamente también, los creadores del formato DEB nos proporcionan algunas utilidades para facilitar esta labor.

  • Es el caso de la aplicación dh_make, según indica en su página de manual:

    dh_make - prepare Debian packaging for an original source archive
  • Veamos con un ejemplo el funcionamiento de dh_make

  • En esta entrevista a Gunnar Wolf (desarrollador de Debian) explica en unos 5mn. las bases del proceso de empaquetado en archivos .deb usando debhelper.

Formato DEB (V)

Tomamos como ejemplo la aplicación helloworlddca descargada de helloworlddca-1.0.tar.gz.

Su contenido es un directorio: helloworlddca-1.0 , que contienes los archivos: hw.c y Makefile

    #include <stdio.h>
    int main (int argc, char *argv[]) {
      printf ("Hola Mundo\n");
      return 0;
    }

Formato DEB (VI)

    # Makefile

    DESTDIR=.
    PROG=hw

    all: $(PROG)

    $(PROG): $(PROG).c
      gcc $(PROG).c -o $@

    install: $(PROG)
      mkdir -p $(DESTDIR)/usr/bin
      cp $(PROG) $(DESTDIR)/usr/bin/

    clean:
      rm -f *~ $(PROG) *.o

    .PHONY: clean install all

Formato DEB (VII)

  • Dentro del directorio helloworlddca-1.0 ejecutamos:

    dh_make -s -e mail@provider.com -f ../helloworlddca-1.0.tar.gz

Esto genera el directorio "debian" con este contenido:

    changelog  docs                       init.d.ex        menu.ex      prerm.ex
    compat     helloworlddca.cron.d.ex    manpage.1.ex     postinst.ex  README.Debian
    control    helloworlddca.default.ex   manpage.sgml.ex  postrm.ex    README.source
    copyright  helloworlddca.doc-base.EX  manpage.xml.ex   preinst.ex   rules
    source     watch.ex
  • La extension .ex indica que se trata de ejemplos, si los usamos, la quitamos y modificamos el contenido de estos archivos según corresponda.

  • Destacamos los archivos "changelog", "control", "rules" y los "pre|post inst" y "pre|post rm".

  • Modifiquemos su contenido y pasemos a generar el archivo ".deb". Para ello usamos la orden:

    dpkg-buildpackage -rfakeroot -us -uc

Las opciones -us (unsigned source, no firma el paquete fuente con gpg) y -uc (unsigned changes, no firma los cambios con gpg) son necesarias si no tenemos configurado gpg.

Formato DEB (VIII)

  • Conforme vayamos modificando los archivos que controlan el empaquetado en formato .deb, debemos:

    1. Crear una nueva entrada en debian/changelog, opcionalmente incrementado la versión del empaquetado.

    2. Regenerar el archivo .deb.

  • Para crear una nueva entrada en debian/changelog disponemos de la aplicación "dch".

  • Es importante tener en cuenta que "dh_make" hace uso de los programas que se encuentran en el paquete "debhelper".

  • Una vez tenemos generado un ".deb" lo podemos instalar --como administradores-- mediante la orden dpkg:

    dpkg -i helloworlddca_1.0-1_amd64.deb
  • O pedir información sobre el mismo con:

    dpkg -I helloworlddca_1.0-1_amd64.deb
    Importante

    "dpkg" no tiene en cuenta dependencias con otros paquetes…​para ello necesitas otras aplicaciones como "apt-get" o "aptitude" o "apt".

Formato RPM

  • Se trata de un formato similar al .deb.

  • Se emplea en distribuciones como Red Hat Linux, Fedora Linux, SuSE Linux, etc…​

  • No vamos a ver directamente como crear paquetes en este formato…​pero si que lo vamos a hacer de forma semi-automática con la aplicación alien.

Aplicación alien

  • Se ejecuta como administrador o con la orden sudo.

  • Se le pasa como parametro el nombre del archivo .tgz, .deb o .rpm a convertir de formato…​

  • …​y una opción que le indica el formato destino:

    • -t convierte de ".deb" o ".rpm" a ".tgz"

    • -r convierte de ".deb" o ".tgz" a ".rpm"

    • -d convierte de ".tgz" o ".rpm" a ".deb"

  • En nuestro caso, una vez hemos generado el .deb podemos hacer:

 sudo alien -t ../helloworlddca_1.0-1_amd64.deb
 sudo alien -r ../helloworlddca_1.0-1_amd64.deb
  • alien dispone también de la opción -c, la cual trata de convertir los scripts que se ejecutan cuando el paquete se instala o desinstala.

Trabajo en grupo en clase

  • En grupos de 4 personas…​

    • Descargamos un código fuente en formato tgz.

    • Tratamos de debianizarlo con dh_make y generar el .deb

    • Intentad añadirle scripts de instalación (preins/postins) y desinstalación (prerm/postrm).

    • Intentad añadirle dependencias.

    • Una vez hecho…​convertirlo a rpm y tgz.

  • Echa un vistazo a estos otros sistemas de paquetería:

    1. Flatpak.

    2. Snap.

    3. AppImage.

    4. Nix package manager

      • ¿En qué consisten?

      • ¿Qué ventajas aportan respecto a formatos como DEB, RPM, etc…​?

Práctica individual

  • Realiza lo mismo que en el trabajo en grupo, salvo la conversión a rpm/tgz, pero, p.e. con:

    • una práctica tuya de cualquier asignatura.

    • Alguna aplicación de código abierto que te interese, algunos ejemplos:

      1. kilopp, C++.

      2. kilo, C.

      3. kilo-in-go, Go.

  • Opcional: Trata de hacer uso de alguno de los archivos pre|post que aparecen en la carpeta debian.

  • Debes entregar el archivo DEB generado dentro de un archivo tgz para que el servidor de entregas te permita hacerlo.

Entrega:
  • Comprime todo lo relacionado con tu entrega en un fichero .tgz, el cual es el que tendrás que entregar.

  • La práctica o prácticas se entregará/n en (y sólo en) pracdlsi en las fechas y condiciones allí indicadas.

Aclaraciones

En ningún caso estas transparencias son la bibliografía de la asignatura.