Construcción de paquetes binarios para Debian.


paquetillosdebianDe la Guía de referencia Debian 2.2.2 2002-11-30: “Los detalles internos de este formato de paquete binario de Debian se describen en el manual deb (5). Puesto que este formato está sujeto a cambios (entre los releases principales de Debian), siempre utilice dpkg-deb (8) para manipular archivos. deb “.
Desde la página de manual de dpkg-deb: “dpkg-deb empaqueta, desempaqueta y proporciona información acerca de archivos de Debian. Los .deb también se pueden manipular con ar y tar si es necesario. Use dpkg para instalar y eliminar paquetes de su sistema.”.
Puede encontrar un montón de .deb de ejemplo en el directorio ‘/ var/cache/apt/archives/’. Con ‘dpkg-deb -I mipaquete.deb’ podría obtener una visión general de lo que ofrece este paquete en particular. ‘dpkg-deb -c mipaquete.deb’ enumera todos los archivos que se van a instalar.

Estructura de paquete

Vamos a examinar un paquete de ejemplo un poco más cerca. Por ejemplo, el archivo ‘parted_1.4.24-4_i386.deb’ contiene estos tres archivos:

$ 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 archivos, incluyendo el contenido de los archivos tar.

debian-binary

El contenido de este archivo es “2,0 \ n”. Esto indica la versión del formato de archivo deb. Para 2.0 todas las demás líneas son ignoradas.

data.tar.gz

El archivo ‘data.tar.gz’ contiene todos los archivos que se instalan 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 último archivo en el deb.

control.tar.gz

En nuestro ejemplo, este archivo tiene el siguiente contenido:

-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 archivo en data.tar.gz. En nuestro ejemplo, el contenido tiene el siguiente aspecto:

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 archivo ‘md5sum’, así como el ‘postinst’ y los archivos de los ‘prerm’ no son obligatorios para el primer paquete. Pero, por favor tome nota de su existencia, ya que cada paquete Debian oficial adecuado los tiene por buenas razones.

‘prerm’ y ‘postinst’ parecen hacerse cargo de la eliminación de los archivos de documentación anterior y agregar un enlace desde doc a share/doc. (Nota: postinst se usa para ejecutar aquellas acciones necesarias tras la instalación).

$ 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 archivo 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 Further information about the control file can be obtained via 'man 5 deb-control'. 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.

Más información sobre el archivo de control puede obtenerse a través de ‘man 5 deb-control “.

Further information about the control file can be obtained via ‘man 5 deb-control’.

Manos a la obra

Ahora es el momento de practicar nosotros mismos. Tengo un sencillo script de shell llamado ‘linuxstatus’ que quiero instalar como ‘/usr/bin/linuxstatus’. Así que primero vamos a crear un directorio llamado ‘debian’ junto al archivo ‘linuxstatus’.

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

control

Vamos a empezar con el fichero de control. El número de versión debe tener un guión con un número de versión del paquete adicional de Debian, por ejemplo, ‘1 0,1-1 ‘. Si su programa consiste, por ejemplo, sólo de scripts de shell portables, utilice “todos” como su ‘Arquitectura’.

Para ‘Depends’ puede que tenga que averiguar a qué paquete pertenecen aquellos archivos o programas en los que su nuevo paquete se basa. Puede utilizar ‘dpkg-S <archivo>’ para averiguar esto, por ejemplo:

$ dkpg -S /bin/cat
coreutils: /bin/cat

Luego, para obtener más información sobre el paquete ‘coreutils’ puede utilizar el comando “apt-cache showpkg coreutils ‘ que le dirá, entre otras cosas, el número de versión actual instalado en el sistema.

Como nota al margen, hay dos maneras más para encontrar la misma información. Hay una página web donde se puede buscar archivos de Debian: http://www.debian.org/distrib/packages. Vaya a la parte inferior de esa página para rellenar el formulario web.

Y por último aunque no menos importante, está una aplicación con agradable interfaz gráfica llamada ‘kpackage’, que ofrece convenientes opciones de navegación de paquetes y también permite la búsqueda de paquetes dado nombres de archivos individuales.

Suggests’, ‘Conflicts’, y ‘Replaces’ pueden ser omitidos si no se necesitan.

Así que aquí está el resultado de nuestro primer archivo ‘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), coreutils (>= 5.0-5)
Maintainer: Chr. Clemens Lee <clemens@kclee.de>
Description: Linux system information
 This script provides a broad overview of different
 system aspects.

El archivo ‘Control’ se copia en un directorio llamado ‘DEBIAN’ dentro el otro directorio ‘debian’.

$ mkdir -p debian/DEBIANdpkg-deb

$ find ./debian -type d | xargs chmod 755   # this is necessary on Debian Woody, don't ask me why
$ cp control debian/DEBIAN

dpkg-deb

Ahora está casi hecho. Sólo tienes que escribir:

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

Uh, eso fue todo más fácil de lo esperado. Ahora sólo tenemos que instalar este paquete en nuestra pc y hemos terminado:

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

Teclee ‘linuxstatus’ o ‘ls -l /usr/bin/linuxstatus’ para ver si funcionó. Si no te gusta más tu paquete,thought. sólo tienes que escribir ‘dpkg -r linuxstatus’ y comprobar una vez más que el paquete es desinstalado. Si instala una versión más nueva no tiene que quitar el viejo primero.

Doble chequeo

Ahora que usted ha conseguido una primera impresión y construir su propio paquete binario, es el momento de ponerse un poco más serio y echar un vistazo a la calidad del paquete que hemos producido.

lintian

Por suerte para nosotros, el proyecto Debian proporciona una herramienta estilo “lint” para el control de los paquetes Debian. Esta herramienta se llama ‘lintian’. Si no la ha instalado aún en su sistema, este es un buen momento (apt-get install lintian).

Ahora usamos esta pequeña herramienta en nuestro nuevo archivo de 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

No se ve tan perfecto. Echamos de menos una página de manual, el archivo copyright, y también a los scripts ‘prerm’ y ‘postinst’.

Documentación Mínima

Este no es el lugar para decir mucho sobre la escritura y la creación de páginas de manual, hay muchos libros que tienen uno u otro capítulo relacionado con este tema, y también existe el Linux MAN-PAGE-HOWTO en línea. Así que vamos a hacer un pequeño salto en el tiempo y supongamos que se tiene ahora una página de manual perfecta para el script, en la ubicación ./man/man1/linuxstatus.1.

Lo mismo para un archivo de ‘copyright’. Usted puede encontrar suficientes ejemplos en el directorio /usr/share/doc con este comando: find /usr/share/doc -name “copyright”

Así que aquí está nuestro propio ejemplo de un archivo de ‘copyright’:

linuxstatus

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

2002-12-07

The home page of linuxstatus is at: 
http://www.kclee.de/clemens/unix/index.html#linuxstatus

The entire code base may be distributed under the terms of the GNU General
Public License (GPL), which appears immediately below.  Alternatively, all
of the source code as any code derived from that code may instead be
distributed under the GNU Lesser General Public License (LGPL), at the
choice of the distributor. The complete text of the LGPL appears at the
bottom of this file.

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

Para los scripts ‘prerm’ y ‘postinst’ copiamos uno por uno los ejemplos del paquete ‘parted’ arriba en archivos con el mismo nombre en nuestro propio directorio del proyecto. Estos archivos deben trabajar para nosotros igual de bien.
Ahora vamos a crear el paquete debian nuevamente. En el archivo de “control” en primer lugar aumentar el número de versión 1,1 a 1 a 1,2 a 1 (ya que hemos escrito una nueva página de manual aumentamos nuestro número de versión interna). También tenemos que copiar los nuevos archivos a sus 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

Gzip es necesario porque lintian espera que los archivos de páginas man sean comprimidos lo más pequeño posible.

fakeroot

Ahora vamos a ver si nuestro paquete se ha convertido en un mejor ciudadano 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. Bueno, no vamos a renunciar. En realidad la mayoría de los errores parecen ser el mismo problema. Nuestros archivos están empaquetados para el usuario y el grupo ‘Clemens’, mientras asumimos que la mayoría de la gente preferiría haberlos instalado como ‘root/root’. Pero esto se puede arreglar fácilmente con la función ‘fakeroot’. Así que vamos a solucionar y comprobar esto de manera rápida (mientras ignoramos la cuestión 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 tenemos todavía otro archivo que adicionar al paquete.

Más Documentación

Digamos ya que junto al archivo ‘changelog’ en el directorio ‘doc/linuxstatus’ también se requiere un archivo ‘changelog.Debian’. Ambos deben estar en formato gzip también.

Aquí hay dos archivos ‘changelog’ de ejemplo:

linuxstatus (1.2-1)

  * Made Debian package lintian clean.

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

y ‘changelog.Debian’:

linuxstatus Debian maintainer and upstream author are identical. Ah, we get no more complains :-). As root you can install now this package over the old one, again with the standard 'dpkg -i' command.
Therefore see also normal changelog file for Debian changes.

El archivo Debian Policy tiene más detalles además del formato del archivo changelog.

Ahora, 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, no tuvimos más quejas :-). Como root podemos installar ahora este paquete sobre el viejo, otra vez con con el comando ‘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 evitar confusiones, recapitulemos todos los pasos que hemos tomado para construir nuestro paquete binario Debian.

Archivos de prerequisitos:

  1. uno o más archivos de scripts o binarios
  2. una página de manual para cada archivo ejecutable
  3. un archivo ‘control’
  4. un archivo ‘copyright’
  5. un archivo ‘changelog’ y otro ‘changelog.Debian’

Preparar los directorios ‘debian’ temporales:

  1. crear el directorio debian/usr/bin‘ (o dondequiera que piense cololar sus ejecutables).
  2. creardebian/usr/share/man/man1‘ (o cualquier sección a la que pertenezca tu página de manual).
  3. crearel directorio debian/DEBIAN‘ .
  4. creardebian/usr/share/doc/<package_name>‘.
  5. asegurarse de que todos los subdirectorios de debiantengan permisos 0755.

Copiar archivos en árbol temporal ‘debian’:

  1. copiar los archivos ejecutables en ‘debian/usr/bin’ (o donde usted planea colocar sus archivos ejecutables).
  2. copiar la página de manual en el directorio ‘debian/usr/share/man/man1’.
  3. copiar el archivo ‘control’ en el directorio “debian/DEBIAN ‘.
  4. copiar los archivos ‘copyright’, ‘changelog’, y ‘changelog.Debian’ en ‘debian/usr/share/doc/<nombre_paquete> ‘.
  5. gzip la página de manual , ‘copyright’, ‘changelog’, y ‘changelog.Debian’ con la opción ‘–best’ en el interior del árbol temporal ‘debian’.

Construir y comprobar el paquete binario de Debian:

  1. invocar ‘dpkg-deb –build’ utilizando ‘fakeroot’ en el directorio ‘debian’.
  2. cambiar el nombre de archivo resultante ‘debian.deb’ a su nombre de paquete definitivo, que incluye información de versión y arquitectura.
  3. Comprobar el .deb resultante, para verificar el cumplimiento de la política de Debian utilizando ‘lintian’.

Nota: Esta entrada es un resumen traducido al español del How To creado por Clemens Lee y publicado en http://tldp.org/HOWTO/html_single/Debian-Binary-Package-Building-HOWTO/

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

A %d blogueros les gusta esto: