Como crear paquetes Debian
Servicio de la Universitat de València
@ > pkg

Introducción

El objetivo de este tutorial es la creación de paquetes binarios sencillos y metapaquetes Debian. Como ejemplo se va a crear el paquete binario siuv-util que contendrá algunos comandos útiles: bdf, duk, ll, lt, p y SU.

También se creará el metapaquete siuv-min, útil para agrupar la instalación de un pequeño conjunto de paquetes, en concreto: rsync, ssh, emacs, pci-utils, xbase-clients, hdparm y siuv-util.

Además, se creará un repositorio trivial en ftp.uv.es/uvdebian para depositar los paquetes creados.

Paquetes adicionales necesarios

Aunque se puede crear paquetes Debian utilizando comandos básicos, existen utilidades especiales para desarrolladores Debian que facilitan parte del trabajo y se detallan en la Guía del nuevo desarrollador de Debian.

En este caso, será suficiente con:

  • dpkg-dev que contiene la mayoría de utilidades para generar paquetes y el índice del repositorio
  • lintian que contiene comandos para la comprobación de la coherencia del paquete.

Estructura interna de un paquete Debian

La mejor forma de conocer la estructura interna de los paquetes, es descomponer uno. Ejecutar el comando: ar -x nombre_de_paqueta.deb sobre un paquete cuelquiera siempre se obtienen los 3 ficheros siguientes:

  • debian-binary: fichero texto que contiene la versión del formato de fichero deb y debe contener '2.0\n'
  • data.tar.gz: es un tar comprimido de los ficheros con informacion, scripts, páginas de manual, copyright, log de cambios, etc. junto con la correspondiente estructura de directorios
  • control.tar.gz: es un tar comprimido de los ficheros de control del paquete, los que se encuentran en el directorio DEBIAN que veremos más adelante

Creación de un paquete binario

Para que un paquete sea correcto debe cumplir las normas de Debian recogidas en el documento Debian Policy Manual.

En este ejemplo, el paquete es binario y agrupa algunos comandos que son scripts de shell o de Perl y deberán tener su correspondiente página de manual.

Los pasos para crear un paquete son:

  1. Crear la estructura de directorios
  2. Rellenarla con los ficheros necesarios
    • Comandos
    • Páginas de manual
    • Ficheros de control
    • Ficheros de documentación del paquete
  3. Ejecutar el comando de construcción del paquete

Estructura de directorios

Dentro del directorio de trabajo es necesario crear una determinada estructura de directorios para que las herramientas de empaquetar puedan encontrar y utilizar los ficheros.

A primer nivel se creará un directorio debian y dentro otro directorio DEBIAN para los ficheros de control.
Además, dentro de debian hay que replicar la parte de la estructura de directorios del sistema, donde se deberán instalar los ficheros (scripts, documentación, páginas de manual…):

  ./siuv-util
       |__ debian-binary
       |
       |__ debian
              |__ DEBIAN
              |
              |__ usr
                   |__ bin
                   |
                   |__ share
                         |__doc
                         |    |__ siuv-util
                         |
                         |__ man
                              |__ man1

Ficheros necesarios

Una vez creada la estructura de directorios sólo queda rellenarla con los ficheros necesarios y asegurarse de que tienen los permisos adecuados y que su propietario y grupo son root.

Comandos

En este ejemplo, los comandos se instalarán en /usr/bin, por lo que se deberán copiar en ./debian/usr/bin

Páginas de manual

Como corresponden a comandos, las páginas irán en /usr/share/man/man1 y se copiarán en ./debian/usr/share/man/man1 y deberán estar comprimidas con gzip -9.

En este ejemplo hay que escribir las páginas de manual. Normalmente se escriben con nroff o groff y deben mantener el formato clásico de las páginas de manual de UNIX. Una vez creadas se pueden visualizar para su comprobación con:

  # nroff -man pagina_manual | less

Ficheros de control

En este ejemplo, es suficiente con el fichero control, que contiene la información más básica del paquete: nombre, versión, dependencias, descripción, etc. Su sintaxis es muy simple, básicamente es un conjunto de líneas, con el formato campo: valor.

En este ejemplo se han incluido los campos obligatorios para este tipo de paquete. Para obtener las dependencias se ha utilizado dpkg -S.

Toda la información sobre los diferentes campos y sus posibles valores se encuentra en Debian Policy Manual.

En otros paquetes, podría ser necesario crear los scripts: postinst, preinst, prerm, postrm, conffiles... para especificar acciones relacionadas con la instalación, desinstalación o configuración del paquete. También sería conveniente incluir un fichero md5sums.

Ficheros de documentación del paquete

Según las normas de Debian sobre documentación de paquetes, se requiere crear los ficheros copyright, changelog y changelog.Debian.

Además, en algunos casos podría ser necesario o conveniente escribir más ficheros de documentación como: README, TODO, AUTHORS, THANKS, FEATURES, NEWS...

Algunos ficheros de documentación se deben comprimir con gzip -9, es el caso de changelog y changelog.Debian, que además tienen una sintaxis especial que se debe respetar para que el paquete sea correcto.

Después de crear y copiar en su sitio todos los ficheros, quedaría:

   ./siuv-util
      |_ debian-binary
      |_ debian
           |_ DEBIAN
           |    |_ control
           |
           |_ usr
               |_ bin
               |   |_ bdf
               |   |_ duk
               |   |_ ll
               |   |_ lt
               |   |_ p
               |   |_ SU
               |
               |_ share
                   |_ doc
                   |   |_ siuv-util
                   |       |_ changelog.gz 
                   |       |_ changelog.Debian
                   |       |_ copyright 
                   |
                   |_ man
                       |_ man1
                           |_ bdf.1.gz
                           |_ duk.1.gz
                           |_ ll.1.gz
                           |_ lt.1.gz
                           |_ p.1.gz
                           |_ SU.1.gz

y también se puede ver con ls -lR.

Construcción del paquete

Si todo está en su sitio y debidamente comprimido, sólo queda ejecutar:

  # cd siuv-util
  # dpkg-deb -b debian siuv-util_1.0-1_all.deb
  # lintian -i siuv-util_1.0-1_all.deb

Creación de un metapaquete

Un metapaquete es un tipo especial de paquete binario con el que se puede agrupar la instalación de un conjunto de paquetes. Un ejemplo de metapaquete es gnome, que agrupa la instalación del entorno de escritorio GNOME.

Para crear el metapaquete siuv-min basta con ejecutar:

  # equivs-control siuv-min

Esto creará el fichero de control siuv-min que hay que modificar adecuadamente, teniendo en cuenta que los paquetes que se indiquen en las dependencias serán los que se instalen al instalar el metapaquete. Una vez modificado se empaqueta empaqueta ejecutando:

  # equivs-build siuv-min

Esto generará el paquete binario que es especial porque realmente no contiene datos, sólo información de control.

Creación de un repositorio trivial

La estructura del repositorio será:

    ftp.uv.es
      |__ uvdebian
             |___binary
             |     |_  Packages.gz
             |     |_  paquete_binario1
             |     |_  paquete_binario2
             |            ...
             |___source
                   |_  Sources.gz
                   |_  paquete_source1
                   |_  paquete_source2
                          ...

Para utilizarlo habría que añadir a /etc/apt/sources.list:

    deb http://ftp.uv.es/uvdebian binary/ 
    deb-src http://ftp.uv.es/uvdebian source/

Es necesario mantener una copia local del repositorio con los paquetes actualizados para la creación de los índices.

En el directorio del repositorio de trabajo, creamos los índices ejecutando:

  # dpkg-scanpackages binary /dev/null | gzip -9c > binary/Packages.gz
  # dpkg-scansources source /dev/null | gzip -9c > source/Sources.gz

Para terminar, queda actualizar ftp.uv.es/uvdebian/ desde el reposiorio local.

volver