COMO para la Creación de un Paquete Binario de Debian

Chr. Clemens Lee

Traducción: Gabriel Rodríguez Alberich

2002-11-30, $Date: 2003/11/09 16:41:05 $

Revision History
Revision 1.02003-11-08ccl
first version

Abstract

Este mini-COMO enseña a crear un paquete de Debian mínimo.


Table of Contents

Introducción
Recursos en la web
Comenzando
Estructura del paquete
debian-binary
data.tar.gz
control.tar.gz
Con las manos en la masa
control
dpkg-deb
Revisión
lintian
Una mínima documentación
fakeroot
Más documentación
Resumen
Qué más
Créditos
Enlaces

Introducción

Se pretende que el uso de dicho paquete sea para instalarlo en su propia máquina, no para meterlo dentro de la distribución oficial de Debian. Para seguir el proceso 'oficial', estúdiese la Guía del Nuevo Desarrollador de Debian.

Los paquetes de Debian normales tienen un paquete fuente como es debido, incluyendo un fichero debian/rules que automatiza los pasos implicados en la creación del paquete binario. Aquí sólo enseñaremos a empaquetar un sencillo script de shell o un binario ejecutable en un pequeño paquete binario.

Por cierto, estoy suponiendo que ya sabe utilizar el tar, el man, qué es un fichero .tar.gz y qué es Debian (y cómo utilizar un editor ;-), pero también supongo que nunca ha tocado programas como el ar o el dpkg.

Recursos en la web

La Guía de Referencia de Debian ofrece una excelente perspectiva general, además de información detallada acerca de todo lo relacionado con Debian.

El documento oficial para crear sus propios paquetes de Debian es la Guía del Nuevo Desarrollador de Debian.

Comenzando

De la Guía de Referencia de Debian 2.2.2 2002-11-30:

La estructura interna del formato de paquetes binarios de Debian se describe en la página del manual deb(5). Puesto que el formato interno está sujeto a cambios (entre los lanzamientos principales de Debian), utilice siempre dpkg-deb(8) para manipular archivos .deb.

De la página del manual de dpkg-deb:

dpkg-deb empaqueta, desempaqueta y proporciona información acerca de paquetes de Debian. Los ficheros .deb también pueden manipularse con ar y tar si es necesario. Utilice dpkg para instalar y desinstalar paquetes de su sistema.

Puede encontrar montones de ficheros .deb de ejemplo en el directorio /var/cache/apt/archives/. Haciendo dpkg-deb -I paquete.deb puede obtener una perspectiva general de lo que ofrece este paquete en particular. Con dpkg-deb -c paquete.deb puede listar todos los ficheros que serán instalados.

Puede listar los contenidos de un fichero deb con ar tv algunpaquete.deb. Utilice la opción x para extraer los ficheros.

Estructura del paquete

Examinemos un paquete de ejemplo un poco más de cerca. Por ejemplo, el fichero parted_1.4.24-4_i386.deb contiene estos tres ficheros:

$ ar tv parted_1.4.24-4_i386.deb
rw-r--r-- 0/0      4 Mar 28 13:46 2002 debian-binary
rw-r--r-- 0/0   1386 Mar 28 13:46 2002 control.tar.gz
rw-r--r-- 0/0  39772 Mar 28 13:46 2002 data.tar.gz

Ahora podemos empezar a extraer todos los ficheros, incluyendo el contenido de los ficheros tar.

debian-binary

El contenido de este fichero es "2.0\n". Esto indica la versión del formato del fichero deb. Para la 2.0, el resto de las líneas se ignoran.

data.tar.gz

El fichero data.tar.gz contiene todos los ficheros que se instalarán, con sus rutas de destino:

drwxr-xr-x root/root         0 2002-03-28 13:44:57 ./
drwxr-xr-x root/root         0 2002-03-28 13:44:49 ./sbin/
-rwxr-xr-x root/root     31656 2002-03-28 13:44:49 ./sbin/parted
drwxr-xr-x root/root         0 2002-03-28 13:44:38 ./usr/
drwxr-xr-x root/root         0 2002-03-28 13:44:41 ./usr/share/
drwxr-xr-x root/root         0 2002-03-28 13:44:38 ./usr/share/man/
drwxr-xr-x root/root         0 2002-03-28 13:44:52 ./usr/share/man/man8/
-rw-r--r-- root/root      1608 2002-03-28 13:44:37 ./usr/share/man/man8/parted.8.gz
drwxr-xr-x root/root         0 2002-03-28 13:44:41 ./usr/share/doc/
drwxr-xr-x root/root         0 2002-03-28 13:44:52 ./usr/share/doc/parted/
-rw-r--r-- root/root      1880 2002-03-07 14:20:08 ./usr/share/doc/parted/README.Debian
-rw-r--r-- root/root      1347 2002-02-27 01:40:50 ./usr/share/doc/parted/copyright
-rw-r--r-- root/root      6444 2002-03-28 13:37:33 ./usr/share/doc/parted/changelog.Debian.gz
-rw-r--r-- root/root     15523 2002-03-28 02:36:43 ./usr/share/doc/parted/changelog.gz

Debe ser el útlimo fichero del archivo deb.

control.tar.gz

En nuestro ejemplo, este fichero contiene lo siguiente:

-rw-r--r--    1 root     root         1336 Mar 28  2002 control
-rw-r--r--    1 root     root          388 Mar 28  2002 md5sums
-rwxr-xr-x    1 root     root          253 Mar 28  2002 postinst
-rwxr-xr-x    1 root     root          194 Mar 28  2002 prerm

md5sums contiene la suma md5 para cada fichero de data.tar.gz. En nuestro ejemplo, el contenido es tal que así:

1d15dcfb6bb23751f76a2b7b844d3c57  sbin/parted
4eb9cc2e192f1b997cf13ff0b921af74  usr/share/man/man8/parted.8.gz
2f356768104a09092e26a6abb012c95e  usr/share/doc/parted/README.Debian
a6259bd193f8f150c171c88df2158e3e  usr/share/doc/parted/copyright
7f8078127a689d647586420184fc3953  usr/share/doc/parted/changelog.Debian.gz
98f217a3bf8a7407d66fd6ac8c5589b7  usr/share/doc/parted/changelog.gz

No se preocupe, el fichero md5sums, al igual que los ficheros postinst y prerm, no son obligatorios para su primer paquete. Pero, por favor, tome nota de su existencia, pues todo paquete oficial de Debian los tiene por buenas razones.

prerm y postinst parecen ocuparse de eliminar los ficheros de documentación antiguos y de añadir un enlace desde doc a share/doc.

$ cat postinst
#!/bin/sh
set -e
# Automatically added by dh_installdocs
if [ "$1" = "configure" ]; then
  if [ -d /usr/doc -a ! -e /usr/doc/parted -a -d /usr/share/doc/parted ]; then
    ln -sf ../share/doc/parted /usr/doc/parted
  fi
fi
# End automatically added section

$ cat prerm
#!/bin/sh
set -e
# Automatically added by dh_installdocs
if [ \( "$1" = "upgrade" -o "$1" = "remove" \) -a -L /usr/doc/parted ]; then
  rm -f /usr/doc/parted
fi
# End automatically added section

Y, finalmente, el fichero más interesante:

$ cat control
Package: parted
Version: 1.4.24-4
Section: admin
Priority: optional
Architecture: i386
Depends: e2fsprogs (>= 1.27-2), libc6 (>= 2.2.4-4), libncurses5 (>= \
5.2.20020112a-1), libparted1.4 (>= 1.4.13+14pre1), libreadline4 (>= \
4.2a-4), libuuid1
Suggests: parted-doc
Conflicts: fsresize
Replaces: fsresize
Installed-Size: 76
Maintainer: Timshel Knoll <timshel@debian.org>
Description: The GNU Parted disk partition resizing program
 GNU Parted is a program that allows you to create, destroy,
 resize, move and copy hard disk partitions. This is useful
 for creating space for new operating systems, reorganizing
 disk usage, and copying data to new hard disks.
 .
 This package contains the Parted binary and manual page.
 .
 Parted currently supports DOS, Mac, Sun, BSD, GPT and PC98
 disklabels/partition tables, as well as a 'loop' (raw disk)
 type which allows use on RAID/LVM. Filesystems supported are
 ext2, ext3, FAT (FAT16 and FAT32) and linux-swap. Parted can
 also detect HFS (Mac OS), JFS, NTFS, ReiserFS, UFS and XFS
 filesystems, but cannot create/remove/resize/check these
 filesystems yet.
 .
 The nature of this software means that any bugs could cause
 massive data loss. While there are no known bugs at the moment,
 they could exist, so please back up all important files before
 running it, and do so at your own risk.

Puede obtener más información acerca del fichero control vía man 5 deb-control.

Con las manos en la masa

Ahora es el momento de ponernos prácticos. Tengo un script de shell muy sencillo llamado linuxstatus, que quiero instalar como /usr/bin/linuxstatus. Así que primero crearemos un directorio llamado debian al lado del fichero linuxstatus.

$ mkdir -p ./debian/usr/bin
$ cp linuxstatus ./debian/usr/bin

control

Empecemos con el fichero control. El número de versión debe tener un guión con un número de versión adicional del paquete de Debian, por ejemplo, '1.1-1'. Si su programa consiste sólo en scripts de shell portables, utilice all como su arquitectura (Architecture).

Para Depends, necesitará averiguar a qué paquete pertenece un cierto fichero o programa del cual depende su nuevo paquete. Existe una página web en la que puede buscar ficheros de Debian: http://www.debian.org/distrib/packages. Vaya al final de esa página. Una vez que conozca el nombre del paquete, puede obtener más detalles sobre la versión de ese paquete en su sistema con el comando apt-cache showpkg package.

Suggests, Conflicts y Replaces pueden obviarse si no son necesarios.

Así que éste es el resultado de nuestro primer fichero control:

Package: linuxstatus
Version: 1.1-1
Section: base
Priority: optional
Architecture: all
Depends: bash (>= 2.05a-11), textutils (>= 2.0-12), awk, procps (>= \
1:2.0.7-8), sed (>= 3.02-8), grep (>= 2.4.2-3), shellutils (>= 2.0.11-11)
Maintainer: Chr. Clemens Lee <clemens@kclee.com>
Description: Información sobre el sistema Linux
 Este script proporciena una amplia perspectiva de los
 distintos aspectos del sistema

El fichero control se copia dentro del directorio llamado DEBIAN, dentro del otro directorio debian.

$ mkdir -p debian/DEBIAN
$ find ./debian -type d | xargs chmod 755  # esto es necesario en Debian
$ cp control debian/DEBIAN                 # Woody, no me pregunten por qué

Si espera que su paquete tenga una mayor audiencia en el futuro, puede que le ayude leer este artículo: Escribiendo descripciones de paquetes de Debian.

dpkg-deb

Ya casi está hecho. Tan sólo escriba:

$ dpkg-deb --build debian
dpkg-deb: building package `linuxstatus' in `debian.deb'.
$ mv debian.deb linuxstatus_1.1-1_all.deb

Uh, esto ha sido más fácil de lo esperado. Ahora sólo tenemos que instalar este paquete en nuestra máquina y hemos acabado:

root# dpkg -i ./linuxstatus_1.1-1_all.deb

Escriba linuxstatus o ls -l /usr/bin/linuxstatus para ver si ha funcionado. Si ya no le gusta su paquete, sólo tiene que escribir dpkg -r linuxstatus y comprobar que el paquete se ha desinstalado. Sin embargo, si instala una versión nueva, no necesita eliminar primero el antiguo.

Si siente curiosidad sobre el esquema de numeración de versiones y las convenciones sobre cómo darle un nombre a un paquete Debian, échele un vistazo a esta sección de la Guía de Referencia de Debian.

Revisión

Ahora que ha tenido una primera impresión y ha creado su propio paquete binario, es hora de ponerse un poco serios y mirar la calidad del paquete que hemos producido.

lintian

Afortunadamente para nosotros, el proyecto Debian nos proporciona una herramienta tipo lint para inspeccionar los paquetes de Debian. Esta herramienta se llama lintian. Si aún no la ha instalado en su sistema, ahora es un buen momento (apt-get install lintian).

Ahora utilicemos esta pequeña joya de herramienta sobre nuestro nuevo paquete:

$ lintian linuxstatus_1.1-1_all.deb
E: linuxstatus: binary-without-manpage linuxstatus
E: linuxstatus: no-copyright-file
W: linuxstatus: prerm-does-not-remove-usr-doc-link
W: linuxstatus: postinst-does-not-set-usr-doc-link

Uh, la cosa no parece tan perfecta. Nos falta una página man, un fichero de copyright, y también los scripts prerm y postinst.

Una mínima documentación

Éste no es lugar para hablar mucho sobre cómo escribir y crear páginas man. Hay muchos libros que tiene algún que otro capítulo dedicado a este tema, y también está el Linux MAN-PAGE-HOWTO en línea. Así que hagamos un pequeño salto en el tiempo y supongamos que ya tiene una perfecta página man para su script situada en ./man/man1/linuxstatus.1.

Lo mismo para el fichero copyright. Puede encontrar bastantes ejemplos en el directorio /usr/share/doc con este comando: find /usr/share/doc -name "copyright".

Éste es nuestro ejemplo de fichero copyright:

linuxstatus

Copyright: Chr. Clemens Lee <clemens@kclee.com>

2002-12-07

La página de linuxstatus está en: 
http://www.kclee.com/clemens/unix/index.html#linuxstatus

Todo el código base puede distribuírse bajo los términos de la Licencia
Pública General de GNU (GPL), que aparece inmediatamente abajo.
Alternativamente, todo el código fuente y todo código derivado de él puede
distribuírse bajo la Licencia Pública General Menor de GNU (LGPL), a
elección del distribuidor. El texto completo de la LGPL aparece al final de
este fichero.

Vea /usr/share/common-licenses/(GPL|LGPL)

Para los scripts prerm y postinst copiaremos los ejemplos del paquete parted de arriba en nuestro propio directorio de proyecto. Estos ficheros deberían valernos también.

Ahora creamos el paquete de Debian de nuevo. En el fichero control tenemos que incrementar el número de versión de 1.1-1 a 1.2-1 (ya que hemos escrito una página man nueva, aumentamos el número de lanzamiento interno). También tenemos que copiar los nuevos ficheros a los lugares apropiados:

$ mkdir -p ./debian/usr/share/man/man1
$ mkdir -p ./debian/usr/share/doc/linuxstatus
$ find ./debian -type d | xargs chmod 755
$ cp ./man/man1/linuxstatus.1 ./debian/usr/share/man/man1
$ cp ./copyright ./debian/usr/share/doc/linuxstatus
$ cp ./prerm ./postinst ./debian/DEBIAN
$ gzip --best ./debian/usr/share/man/man1/linuxstatus.1
$
$ dpkg-deb --build debian
dpkg-deb: building package `linuxstatus' in `debian.deb'.
$ mv debian.deb linuxstatus_1.2-1_all.deb

Se necesita gzip porque lintian espera que las páginas man estén comprimidas todo lo posible.

fakeroot

Ahora veamos si nuestro paquete se ha convertido en un mejor ciudadano de Debian:

$ lintian linuxstatus_1.2-1_all.deb
E: linuxstatus: control-file-has-bad-owner prerm clemens/clemens != root/root
E: linuxstatus: control-file-has-bad-owner postinst clemens/clemens != root/root
E: linuxstatus: bad-owner-for-doc-file usr/share/doc/linuxstatus/ clemens/clemens != root/root
E: linuxstatus: bad-owner-for-doc-file usr/share/doc/linuxstatus/copyright clemens/clemens != root/root
E: linuxstatus: debian-changelog-file-missing

Ups, nuevas quejas. Vale, no nos rindamos. En realidad, la mayoría de los errores parecen ser el mismo problema. Nuestros ficheros están empaquetados con el usuario y grupo clemens, pero supongo que la mayoría de la gente preferirá instalarlos como root/root. Pero esto es fácil de arreglar utilizando la herramienta fakeroot. Hagamos el arreglo y volvamos a comprobar (ignorando el asunto del changelog):

$ fakeroot dpkg-deb --build debian
dpkg-deb: building package `linuxstatus' in `debian.deb'.
$ mv debian.deb linuxstatus_1.2-1_all.deb
$ lintian linuxstatus_1.2-1_all.deb
E: linuxstatus: debian-changelog-file-missing

Bien, pero todavía necesitamos añadir otro fichero al paquete.

Más documentación

Déjeme decirle que aparte del fichero changelog en el directorio doc/linuxstatus, también se requiere un fichero changelog.Debian.

Ahí van dos ficheros changelog de ejemplo:

linuxstatus (1.2-1)

  * El paquete pasa el test de lintian.

 -- Chr. Clemens Lee <clemens@kclee.com>  2002-12-13

Y changelog.Debian:

El mantenedor y autor original de linuxstatus
son el mismo. Por tanto, vea también el fichero normal
changelog para los cambios de Debian.

El Manual de la Política de Debian tiene más detalles en relación con el formato del fichero changelog.

Ahora, con suerte, nuestro último paso será:

$ cp ./changelog ./changelog.Debian ./debian/usr/share/doc/linuxstatus
$ gzip --best ./debian/usr/share/doc/linuxstatus/changelog 
$ gzip --best ./debian/usr/share/doc/linuxstatus/changelog.Debian
$ fakeroot dpkg-deb --build ./debian
dpkg-deb: building package `linuxstatus' in `debian.deb'.
$ mv debian.deb linuxstatus_1.2-1_all.deb
$ lintian linuxstatus_1.2-1_all.deb

Ah, ya no nos salen más quejas :-). Ahora, como root, puede instalar este paquete sobre el antiguo, de nuevo con el comando estándar dpkg -i.

root# dpkg -i ./linuxstatus_1.2-1_all.deb
(Reading database ... 97124 files and directories currently installed.)
Preparing to replace linuxstatus 1.1-1 (using linuxstatus_1.2-1_all.deb) ...
Unpacking replacement linuxstatus ...
Setting up linuxstatus (1.2-1) ...

Resumen

Para no confundirnos, recapitulemos todos los pasos que hemos tomado para crear nuestro paquete binario de Debian.

Ficheros requeridos antes de empezar:

  1. uno o más binarios ejecutables o ficheros de script
  2. una página man por cada fichero ejecutable
  3. un fichero control
  4. un fichero copyright
  5. un fichero changelog y otro changelog.Debian

Crear los directorios temporales debian:

  1. crear el directorio debian/usr/bin (o donde planee colocar sus ficheros ejecutables)
  2. crear el directorio debian/usr/share/man/man1 (o la sección a la que pertenezca su página man)
  3. crear el directorio debian/DEBIAN
  4. crear el directorio debian/usr/share/doc/<nombre_del_paquete>
  5. asegurarse de que todos los subdirectorios de debian tienen los permisos de fichero 0755

Copiar los ficheros en el árbol temporal debian:

  1. copiar el fichero ejecutable en el directorio debian/usr/bin (o donde planee colocar sus ficheros ejecutables)
  2. copiar la página man en el directorio debian/usr/share/man/man1
  3. copiar el fichero control en el directorio debian/DEBIAN
  4. copiar los ficheros copyright, changelog, y changelog.Debian en debian/usr/share/doc/<nombre_del_paquete>
  5. comprimir con gzip --best los ficheros copyright, changelog, changelog.Debian y la página man en el árbol temporal debian

Construir y comprobar el paquete binario de Debian:

  1. invocar dpkg-deb --build usando fakeroot dentro del directorio debian
  2. renombrar el fichero debian.deb resultante con el nombre final, incluyendo la información sobre la versión y la arquitectura
  3. compruebe que el paquete .deb resultante cumple la política de Debian utilizando lintian

Qué más

Hay muchos detalles que no hemos cubierto aquí, por ejemplo, cómo distribuír los demonios Unix, los ficheros de configuración y mucho más.

Pero quiero recalcar con más importancia que, para los desarrolladores de Debian, los paquetes son paquetes fuente, no paquetes binarios. Nunca interactúan con los paquetes binarios internos. De hecho, sólo los desarrolladores de dpkg-deb y dpkg necesitan saber lo que son. De hecho, no se recomienda hacerlo así.

Si un desarrollador tuviera que explicarle a alguien cómo crear un paquete de Debian, con seguridad le explicaría cómo hacer un paquete fuente y cómo construirlo.

Por otra parte, no todo desarrollador quiere enviar su software a Debian (todavía), pero, sin embargo, quiere beneficiarse de las ventajas de un sistema de empaquetamiento como el que ofrece dpkg, sin liberar el código fuente del paquete. Personalmente, seguiré liberarando mis proyectos libres como ficheros tar.gz con el código fuente para todas las plataformas, mientras que planeo ofrecer más y más paquetes .deb para la comodidad de los usuarios de Debian que sólo quieran instalar y utilizar mi software.

Si alguien quiere dar el siguiente paso y enviar un paquete de software a Debian, hay que estudiarse primero la Guía del Nuevo Desarrollador de Debian, además del Manual de la Política de Debian. Durante la tarea de crear un paquete fuente de Debian, échele también un vistazo a la lista de correo debian-mentors para ver a desarrolladores de Debian experimentados y novatos interactuando y abordando los mismos problemas que usted puede encontrarse.

Créditos

Gracias a:

  • Colin Watson por contribuír con una frase en el resumen y dar sus impresiones sobre la estructura, enfoque y título de este COMO,
  • Bill Allombert por contribuír con una frase en la sección 'Qué más', y dar sus impresiones reforzando lo que había dicho Colin,
  • Santiago Vila por indicar que md es un alias local y que en el mundo (Unix), el estándar es mkdir,
  • Tabatha Marshall, del proyecto TLDP, por proporcionarme un soporte general,
  • Joey Hess, Carlo Perassi, y Joe Riel por correcciones menores,
  • Claudio Cattazzo por la conversión de mi documento XML privado a un formato DocBook estándar, que también resultó en varias correcciones y mejoras [2003-10-04].

Enlaces

Guía del Nuevo Mantenedor de Debian:  http://www.debian.org/doc/maint-guide/
Debian:  http://www.debian.org/
Este documento:  http://www.kclee.com/clemens/unix/HowToCreateYourOwnDebianPackage.html
Este documento en español:  http://the-geek.org/docs/ComoCrearTuPropioPaqueteDebian.html
La Guía de Referencia de Debian:  http://www.debian.org/doc/manuals/reference/reference.es.html
Paquetes de Debian:  http://www.debian.org/distrib/packages
Cómo escribir descripciones de paquetes de Debian:  http://people.debian.org/~walters/descriptions.html
El COMO de las páginas man de Linux:  http://www.tldp.org/HOWTO/mini/Man-Page.html
El Manual de la Política de Debian:  http://www.debian.org/doc/debian-policy/
debian-mentors:  http://lists.debian.org/debian-mentors/
El Proyecto de Documentación de Linux:  http://www.tldp.org/
Plublicidad: mi pequeña página sobre Unix:  http://www.kclee.com/clemens/unix/