Traducción: Gabriel Rodríguez Alberich
2002-11-30, $Date: 2003/11/09 16:41:05 $
Revision History | ||
---|---|---|
Revision 1.0 | 2003-11-08 | ccl |
first version |
Abstract
Este mini-COMO enseña a crear un paquete de Debian mínimo.
Table of Contents
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.
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.
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.
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.
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.
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.
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.
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
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.
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.
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.
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.
É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.
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.
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) ...
Para no confundirnos, recapitulemos todos los pasos que hemos tomado para crear nuestro paquete binario de Debian.
Ficheros requeridos antes de empezar:
Crear los directorios temporales debian:
Copiar los ficheros en el árbol temporal debian:
Construir y comprobar el paquete binario de Debian:
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.
Gracias a:
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/ |