Logo DLSI

Tema 4 - Sistemas de paquetes

Curso 2023-2024

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

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.

      • ¿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.