Este articulo es una traducción del articulo Creació de paquets Debian
El formato del fichero .deb es el siguiente:
<nombre_del_paquete>_<numero_de_version>-<numero_de_revision_debian>.deb
El número de versión está especificado por el desarrollador de la aplicación. Hay un estándar y nos podemos encontrar diferentes tipos de codificaciones como "19990513" o "1.3.8pre1".
El número de revisión de Debian está especificado por el desarrollador Debian (o por quien realmente cree el paquete). Este número se corresponde con el nivel de revisión del paquete Debian. En el caso de que sea un paquete Ubuntu aquí encontraremos la versión de Ubuntu.
Cada paquete Debian es un archivo ar compuesto por:
El fichero control.tar.gz contiene los metadatos del paquete. Dentro de este paquete podemos encontrar ficheros como:
El fichero control contiene los metadatos. Por ejemplo el fichero control del paquete apache2.2-common:
Package: apache2.2-common Version: 2.2.3-3.2build1 Section: web Priority: optional Architecture: i386 Depends: apache2-utils, net-tools, libmagic1, mime-support, lsb-base Conflicts: apache2-common, libapache2-mod-php5 (<= 5.1.6-3), libapache2-mod-php4 (<= 4:4.4.4-2), libapache2-mod-mime-xattr (<= 0.3-2), libapache2-mod-mono (<= 1.1.17-3), libapache2-mod-proxy-html (<= 2.4.3-2), libapache2-mod-scgi (<= 1.11-1), libapache2-mod-speedycgi (<= 2.22-3), libapache2-modxslt (<= 2005072700-1), libapache2-redirtoservername (<= 0.1-1), libapache2-webauth (<= 3.5.3-1), libapache2-webkdc (<= 3.5.3-1) Replaces: apache2-common Installed-Size: 3460 Maintainer: Ubuntu Core Developers <[email protected]> Original-Maintainer: Debian Apache Maintainers <[email protected]> Source: apache2 Description: Next generation, scalable, extendable web server Apache v2 is the next generation of the omnipresent Apache web server. This version - a total rewrite - introduces many new improvements, such as threading, a new API, IPv6 support, request/response filtering, and more. . It is also considerably faster, and can be easily extended to provide services other than http. . This package contains all the standard apache2 modules, including SSL support. However, it does *not* include the server itself; for this you need to install one of the apache2-mpm-* packages; such as worker or prefork.
Que coincide con la información que podeis encontrar con Synaptic si seleccionáis el paquete y con el botón derecho escogeis la opción Propiedades del menú Contextual:
Los contenidos de estos ficheros en el caso de Debian vienen regulados por la Debian policy
El fichero md5sums contiene las sumas de comprobación (checksums) que permiten comprobar que no hay ninguna diferencia entre el paquete que tenemos y el original:
c4d71eca239992365ff6bb0dd2b087e6 usr/bin/krusader a1bea18a70b85afac022cfe6e05d6b64 usr/share/icons/crystalsvg/22x22/apps/krusader_blue.png 29847c1108bc50911de6eb9e231fee69 usr/share/icons/crystalsvg/22x22/apps/krusader_root.png c963d8938d45793ed937abdf1f874685 usr/share/icons/crystalsvg/22x22/apps/krusader_shield.png 1d046e13a24bc4db374fdd599727b233 usr/share/icons/crystalsvg/22x22/apps/krusader_user.png e2b220c05fa7c83b5f53e1843715cced usr/share/icons/crystalsvg/22x22/apps/krusader_red.png
.............
El resto de ficheros son los scripts de mantenimiento (postrm, postinst, etc) que se explican con más detalle en otro apartado.
Recursos:
El comando ar lo proporciona el paquete binutils:
$ dpkg -S /usr/bin/ar binutils: /usr/bin/ar
Podemos consultar los metadatos de un paquete Debian a través del comando:
$ dpkg --info talk_0.17-11ubuntu1_i386.deb paquet de debian nou, versió 2.0. mida 21638 bytes: arxiu de control= 1084 bytes. 611 bytes, 17 línies control 449 bytes, 7 línies md5sums 357 bytes, 14 línies* postinst #!/bin/sh 158 bytes, 8 línies* prerm #!/bin/sh Package: talk Version: 0.17-11ubuntu1 Section: net Priority: optional Architecture: i386 Depends: libc6 (>= 2.5-0ubuntu1), libncurses5 (>= 5.4-5), update-inetd, openbsd-inetd | inet-superserver Suggests: talkd Replaces: netstd Installed-Size: 88 Maintainer: Ubuntu MOTU Developers <[email protected]> Original-Maintainer: Alberto Gonzalez Iniesta <[email protected]> Source: netkit-ntalk Description: Chat with another user Talk is a visual communication program which copies lines from your terminal to that of another user. . In order to talk locally, you will need to install the talkd package.
Los metadados se almacenan en el fichero control de dentro del fichero comprimido control.tar.gz de un fichero binario de debian.
La Debian Policy determina como se han de utilizar los campos del fichero control.
Recursos:
Durante la instalación o desinstalación de un paquete Debian no se instalan o se eliminan simplemente ficheros en el sistema, sino que también se llevan a cabo diferentes acciones para configurar los paquetes. Estas acciones las llevan a cabo los siguientes scripts de mantenimiento:
Todos estos ficheros se encuentran dentro del fichero control.tar.gz de un paquete Debian. Durante el proceso de construcción del paquete, los ficheros se encuentran en la carpeta debian.
La siguiente gráfica muestra cuando se ejecutan estos scripts.
La [(http://www.debian.org/doc/debian-policy/ch-maintainerscripts.html) Debian Policy] determina como se han de utilizar los scripts de mantenimiento. Si consultais el enlace anterior además vereis que hay otros scripts de mantenimiento aparte de los mencionados.
Recursos:
Recursos:
Una instalación por defecto de Debian instala todos los paquets de prioridad Standard o superior.
Recursos:
Si consultais un repositorio de paquetes Debian como por ejemplo el repositorio de Ubuntu:
Obtendreis el siguiente:
Como podeis ver hay diferentes versiones del mismo paquete, y además de los paquetes Debian para diferentes arquitecturas (fitxers .deb) hay otros ficheros:
Si queremos obtener estos ficheros los podemos descargar manualmente o simplemente ejecutando:
$ apt-get source hello Se está leyendo la lista de paquetes... Hecho Se está construuendo el árbol de dependencias Reading state information... Hecho Se necesita descargar 388kB de archivos fuente. Des:1 http://ch.archive.ubuntu.com feisty/main hello 2.2-1build1 (dsc) [524B] Des:2 http://ch.archive.ubuntu.com feisty/main hello 2.2-1build1 (tar) [383kB] Des:3 http://ch.archive.ubuntu.com feisty/main hello 2.2-1build1 (diff) [4841B] 388kB descargados en 1s (372kB/s) gpg: Signature made dl 05 mar 2007 02:22:21 CET using DSA key ID 0F932C9C gpg: No se ha podido comprobar la firma: no se ha encontrado la clave pública dpkg-source: se está extrayendo hello a hello-2.2 dpkg-source: se está desempaquetando hello_2.2.orig.tar.gz dpkg-source: se está aplicando ./hello_2.2-1build1.diff.gz
Nos descarga todos los ficheros y aplica el pegado:
$ ls -l total 404 drwxr-xr-x 10 sergi sergi 4096 2007-06-14 08:30 hello-2.2 -rw-r--r-- 1 sergi sergi 4841 2007-03-05 03:04 hello_2.2-1build1.diff.gz -rw-r--r-- 1 sergi sergi 524 2007-03-05 03:04 hello_2.2-1build1.dsc -rw-r--r-- 1 sergi sergi 382629 2006-12-12 14:03 hello_2.2.orig.tar.gz
En la carpeta hello-2.2 tenemos todo el código fuente del paquete Debian. Si quereis, podeis crear (compilar) vuestro paquete ejecutando:
$ cd hello-2.2 $ fakeroot # dpkg-buildpackage
Recursos:
TODO
Recursos:
Permite comparar fichero debian. Veamos un ejemplo:
$ wget http://ch.archive.ubuntu.com/ubuntu/pool/main/h/hello/hello_2.2-2_i386.deb $ wget http://ch.archive.ubuntu.com/ubuntu/pool/main/h/hello/hello_2.2-2_powerpc.deb
$ debdiff hello_2.2-2_i386.deb hello_2.2-2_powerpc.deb File lists identical (after any substitutions) Can't compare control files; wdiff package not installed
Instalamos wdiff:
$ sudo apt-get install wdiff
$ debdiff hello_2.2-2_i386.deb hello_2.2-2_powerpc.deb File lists identical (after any substitutions) Control files: lines which differ (wdiff format) ------------------------------------------------ Architecture: [-i386-] {+powerpc+} Installed-Size: [-584-] {+588+}
Son ficheros debian idénticos pero para diferentes arquitecturas.
Recursos:
Continuando con el ejemplo hello. Si descargamos los ficheros fuente
$ wget http://ch.archive.ubuntu.com/ubuntu/pool/main/h/hello/hello_2.2-2.dsc $ wget http://ch.archive.ubuntu.com/ubuntu/pool/main/h/hello/hello_2.2-2.diff.gz $ wget http://ch.archive.ubuntu.com/ubuntu/pool/main/h/hello/hello_2.2.orig.tar.gz
Ahora podemos crear la carpeta con el código fuente del paquete debian con:
$ dpkg-source -x hello_2.2-2.dsc
NOTA: Todos estos pasos son equivalentes a ejecutar apt-get source.
Recursos:
TODO
Así, la primera revisión de la versión 1.0 del paquete «dirhola» sería «dirhola_1.0-1» si es la primera vez que la versión 1.0 de este paquete entra en Debian, «dirhola_1.0-2» si es la segunda revisión, etc... En Ubuntu el nombre es el mismo, pero si se da el caso de que Ubuntu también hace cambios este último pasaria a ser «dirhola_1.0-2ubuntu1»; si encontramos algún otro problema entonces saldría el paquete «dirhola_1.0-2ubuntu2», etc.
En el caso de que un paquete esté en Ubuntu pero no en Debian el número de revisión de debian es 0, por ejemplo «diradeu_0.1-0ubuntu1», si es la primera vez que se hace un paquete de la versión 0.1 del programa «diradeu» y ésta solamente se hace en Ubuntu (o se hace independientemente del de Debian, caso que también se puede dar).
Gracias a Siegfried-Angel Gevatter Pujals (RainCT).
Debconf es una utilidad de software que permite llevar a cabo tareas de configuración en sistemas Debian GNU/Linux. Debconf está muy ligado a dpkg.
Muchos paquetes al instalarse iniciando una interfaz con el usuario para pedir los parámetros de configuración que crean adientes:
Debconf se proporciona por el paquete del mismo nombre. Ejecutando
$ dpkg -L debconf | grep bin /usr/sbin /usr/sbin/dpkg-preconfigure /usr/sbin/dpkg-reconfigure /usr/bin /usr/bin/debconf /usr/bin/debconf-apt-progress /usr/bin/debconf-communicate /usr/bin/debconf-copydb /usr/bin/debconf-escape /usr/bin/debconf-set-selections /usr/bin/debconf-show
Podemos ver cuáles son los comandos proporcionados por Debconf. El más importante es dpkg-reconfigure que nos permite reconfigurar paquetes ya instalados en nuestro sistema. Uno de los ejemplos más comunes es ejecutar:
$ sudo dpkg-reconfigure xserver-xorg
Que permite configurar el servidor X tal y como podeis ver en el artículo Configurar_el_paquet_Debian_xserver-xorg.
Hay otros paquetes relacionados con debconf:
La especificación de Debconf en la Debian Policy os puede dar más detalles sobre Debconf.
Recursos:
Las aplicaciones que quieren utilizar debconf han de utilizar un protocolo de comunicación con debconf. Los comandos del protocolo son:
En el manual de debconf-devel encontrareis una explicación de cada comando. Los más importantes (o los que utilizamos en los ejemplos de este artículo):
Cada comando tiene una función equivalente en shell. Estas funciones son proporcionadas por el script de shell /usr/share/debconf/confmodule y sus nombres son:
db_comandodebconf
Donde comandodebconf es un comando de debconf. Ejemplos: db_capb, db_version, db_get. También se pueden comunicar con debconf a través de otros lenguajes como Perl.
Una herramienta muy útil para identificar errores con debconf es activar el modo DEBUG de debconf con:
$ export DEBCONF_DEBUG=developer
Ahora si ejecutamos el script config tendremos más información sobre la ejecución:
$ sudo ./config debconf (developer): frontend started debconf (developer): Trying to find a templates file.. debconf (developer): Trying ./config.templates debconf (developer): Trying ./templates debconf (developer): I guess it is ./templates debconf (developer): frontend running, package name is debconf (developer): starting ./config debconf (developer): <-- VERSION 2.0 debconf (developer): --> 0 2.0
................................
El parámetro debconf/priority define la prioridad más alta de los mensajes a mostrar por debconf. La instalación predeterminada utiliza priority=high. En este caso se mostrarán los mensajes con prioridad high y critical, pero se anularán los mensajes con prioridad medium y low.
Estos parámetros se utilizan con debconf y con la instalación del sistema. Si utilizais el parámetro de arranque priority=medium, se os mostrará el menú de instalación y dispondreis de más control sobre la instalación. Cuando se utiliza el parámetro priority=low se mostrarán todos los mensajes (es equivalente al método de arranque experto). En el caso de priority=critical, el sistema de instalación mostrará únicamente los mensajes críticos y procurará hacer el trabajo correctamente sin mostrar mensajes.
Recursos:
El parámetro DEBIAN_FRONTEND es un parámetro que define el tipo de interfaz de usuario utilizado durante las instalaciones y también con las configuraciones con Debconf. Los posibles parámetros de configuración actuales para la instalación del sistema son:
$ export DEBIAN_FRONTEND=readline
Si ejecutamos el script, las preguntas se harán desde la línea de comandos:
$ sudo debian/config Configuración del paquete «» Please enter the hostname of the database server host. Database server hostname: 8001
NOTA: Realmente debconf utiliza las interfaces definidas en la carpeta /usr/share/perl5/Debconf/FrontEnd:
$ ls Dialog.pm Editor.pm Gnome.pm Kde Kde.pm Noninteractive.pm Passthrough.pm Readline.pm ScreenSize.pm Teletype.pm Text.pm Web.pm
Por ejemplo para probar con Gnome hemos de ejecutar:
$ export DEBIAN_FRONTEND=gnome $ sudo debian/config
Por defecto, debconf utiliza Programació_en_C_2#Dialog dialog. Dialog es un conjunto de herramientas que utilizando ncurses para crear formulario de interfaz con los usuarios por línea de comandos. Las pantallas se muestran de la siguiente forma:
Podeis probar el resto de interfaces:
Dialog.pm Editor.pm Gnome.pm Kde Kde.pm Noninteractive.pm Passthrough.pm Readline.pm ScreenSize.pm Teletype.pm Text.pm Web.pm
estableciendo la variable de entorno en el nombre de fichero pero en minúsculas. Por ejemplo:
$ export DEBIAN_FRONTEND=kde
Recursos:
Se puede utilizar para comunicarse con debconf. Por ejemplo el comando:
$ sudo -i $ echo get echod/port | debconf-communicate 0 8001
Nos devuelve el resultado de ejecutar la pregunta echod/port.
Recursos:
TODO
Si al ejecutar debconf, de golpe las ventanas de configuración dejan de ejecutarse podemos probar los pasos indicados en esta sección para mirar de solucionarlo.
Si configuramos debconf en mode debug:
$ export DEBCONF_DEBUG=developer
Si ahora ejecutamos el script:
$ sudo debian/config debconf (developer): frontend started debconf (developer): Trying to find a templates file.. debconf (developer): Trying debian/config.templates debconf (developer): Trying debian/templates debconf (developer): I guess it is debian/templates debconf (developer): frontend running, package name is debconf (developer): starting debian/config debconf (developer): <-- VERSION 2.0 debconf (developer): --> 0 2.0 debconf (developer): <-- CAPB backup debconf (developer): --> 0 multiselect escape backup debconf (developer): <-- INPUT critical echod/port debconf (developer): --> 30 question skipped ...........
Vemos como las preguntas se saltan. Para solucionar este problema le hemos de indicar a debconf (a través del comando debconf-communicate) que la plantilla no está vista todavia:
$ sudo -i $ echo fset echod/port seen false | debconf-communicate $ echo fset echod/notconfigured seen false | debconf-communicate $ exit
Ojo con el uso de fakeroot porque solamente nos sirve para crear el paquete con dpk-buildpackage!!! Si os dais cuenta que algunos comandos que habeis ejecutado no se han realizado (por ejemplo habeis borrado un paquete del sistema con --purge y los ficheros de configuración todavia están ...) es muy posible que el comando lo hayais ejecutado desde fakeroot.
$ sudo apt-get install binutils gcc libc6-dev make fakeroot
Posiblemente muchos de estos paquetes ya los encontrareis instalados en el sistema dependiendo de su importancia.
Utilidades:
$ sudo apt-get install debmake dpkg-dev devscripts patch
Documentación:
$ sudo apt-get install debian-policy developers-reference
Instalación:
$ apt-get install debhelper dh-make
dh_make es la aplicación que nos ayuda a crear una carpeta debian a partir de la cual debianizar un código fuente
$ dh_make -e [email protected] -f ../foo0.1.tar.gz
debhepler nos proporciona una serie de guiones de shell que no ayudan en la creación de paquetes debian. Podemos obtener la lista de guiones de shell ejecutando:
$ dpkg -L debhelper | grep bin /usr/bin /usr/bin/dh_builddeb /usr/bin/dh_clean /usr/bin/dh_compress /usr/bin/dh_desktop /usr/bin/dh_fixperms /usr/bin/dh_gconf /usr/bin/dh_gencontrol /usr/bin/dh_iconcache /usr/bin/dh_install /usr/bin/dh_installcatalogs /usr/bin/dh_installchangelogs /usr/bin/dh_installcron /usr/bin/dh_installdeb /usr/bin/dh_installdebconf /usr/bin/dh_installdirs /usr/bin/dh_installdocs /usr/bin/dh_installemacsen /usr/bin/dh_installexamples /usr/bin/dh_installinfo /usr/bin/dh_installinit /usr/bin/dh_installlogcheck /usr/bin/dh_installlogrotate /usr/bin/dh_installman /usr/bin/dh_installmanpages /usr/bin/dh_installmenu /usr/bin/dh_installmime /usr/bin/dh_installmodules /usr/bin/dh_installpam /usr/bin/dh_installppp /usr/bin/dh_installudev /usr/bin/dh_installwm /usr/bin/dh_installxfonts /usr/bin/dh_link /usr/bin/dh_listpackages /usr/bin/dh_makeshlibs /usr/bin/dh_md5sums /usr/bin/dh_movefiles /usr/bin/dh_perl /usr/bin/dh_python /usr/bin/dh_scrollkeeper /usr/bin/dh_shlibdeps /usr/bin/dh_strip /usr/bin/dh_suidregister /usr/bin/dh_testdir /usr/bin/dh_testroot /usr/bin/dh_testversion /usr/bin/dh_undocumented /usr/bin/dh_usrlocal
Las siguientes tablas nos muestran los ficheros que utilizan algunos de los guiones debhelper más importantes:
Recursos:
Instalación:
$ apt-get install lintian linda
El paquete devscripts proporciona múltiples utilidades útiles para los desarrolladores.
$ sudo apt-get install devscripts
Las utilidades o comandos que proporciona son:
$ dpkg -L devscripts | grep bin /usr/bin /usr/bin/bts /usr/bin/checkbashisms /usr/bin/cvs-debuild /usr/bin/dd-list /usr/bin/debchange /usr/bin/debcommit /usr/bin/debdiff /usr/bin/debi /usr/bin/debpkg /usr/bin/debuild /usr/bin/dget /usr/bin/dpkg-depcheck /usr/bin/dscverify /usr/bin/grep-excuses /usr/bin/mass-bug /usr/bin/plotchangelog /usr/bin/rc-alert /usr/bin/rmadison /usr/bin/svnpath /usr/bin/annotate-output /usr/bin/archpath /usr/bin/cvs-debi /usr/bin/cvs-debrelease /usr/bin/deb-reversion /usr/bin/debclean /usr/bin/debrelease /usr/bin/debrsign /usr/bin/debsign /usr/bin/dpkg-genbuilddeps /usr/bin/mergechanges /usr/bin/nmudiff /usr/bin/pts-subscribe /usr/bin/tagpending /usr/bin/uscan /usr/bin/uupdate /usr/bin/whodepends /usr/bin/who-uploads /usr/bin/wnpp-alert /usr/bin/requestsync /usr/bin/dch /usr/bin/debc /usr/bin/cvs-debc
El comando debchange (también conocido como dch) nos permite modificar los ficheros changelog de forma cómoda. Si ejecutamos debchange sin parámetros (siempre desde la raiz de nuesro código fuente o lo que es lo mismo que la carpeta debian esté dentro de la carpeta donde nos encontramos) nos abre el fichero debian/changelog con nuestro editor preferido (variable de entorno $EDITOR).
Pero la verdadera utilidad de debchange la encontrareis en el siguiente ejemplo: imaginaros que acabais de solucionar un BUG/error en vuestro código fuente. Podeis ejecutar:
$ debchange S'ha modificat la línia x del fitxer y per solucionar l'error 2325
Si ahora ejecutais debchange obtendreis el siguiente fichero changelog:
echod (0.1-1) unstable; urgency=low *Initial release (Closes: #nnnn) <nnnn is the bug number of your ITP> *S'ha modificat la línia x del fitxer y per solucionar lerror 2325
Como podreis observar algunos caracteres se "pueden escapar". La forma correcta habría sido:
$ debchange S\'ha modificat la línia x del fitxer y per solucionar l\'error 2325
Si estamos creando una nueva versión del paquete podemos cambiar el fichero changelog fácilmente con:
$ debchange -i echod (0.1-1ubuntu2) feisty; urgency=low *Nueva versión -- Sergi Tur Badenas <[email protected]> Wed, 6 Jun 2007 12:58:10 +0200 echod (0.1-1) unstable; urgency=low *Initial release (Closes: #nnnn) <nnnn is the bug number of your ITP> *Sha modificat la línia x del fitxer y per solucionar lerror 2325 -- Sergi Tur Badenas <[email protected]> Wed, 6 Jun 2007 12:53:05 +0200
NOTA: También podemos utilizar debchange utilizant el alias dch:
$ which dch /usr/bin/dch $ ls -la /usr/bin/dch lrwxrwxrwx 1 root root 9 2007-04-21 03:09 /usr/bin/dch -> debchange
En este apartado veremos los pasos a seguir para convertir en un paquete Debian el Servidor de ecos del artículo Programación de demonios Linux. Podeis obtener los ficheros en:
Encontrareis una carpeta echoDimoni. El primer paso es copiar esta carpeta a una nueva que siga los convenios de debian:
$ cd sessio10 $ cp -r echoDimoni echod-0.1
Ahora hay que obtener las herramientas necesarias para crear el paquete Debian:
$ sudo apt-get install dh-make fakeroot build-essential devscripts debhelper
Para crear un paquete Debian, hay que crear una carpeta debian dentro de nuestro código. Esta carpeta tendrá una serie de información necesaria para crear un paquete debian a partir del código fuente. La forma más sencilla de crear esta carpeta es utilizar una herramienta como dh_make del paquete deb-helper:
NOTA: Poned vuestro propio correo en lugar de [email protected]
$ cd echod-0.1 $ dh_make -e [email protected] --createorig
Os preguntará por el tipo de paquete. En este documento solamente trataremos la opción single binary (s):
Type of package: single binary, multiple binary, library, kernel module or cdbs? [s/m/l/k/b]
Y nos mostrarán los datos de control iniciales de nuestro paquete (más adelante los veremos con más detalle y los adaptaremos a nuestras necesidades):
Maintainer name : Sergi Tur Badenas Email-Address : [email protected] Date : Fri, 8 Jun 2007 13:15:56 +0200 Package Name : echod Version : 0.1 License : blank Type of Package : Single Hit <enter> to confirm:
Presionamos enter y ya tenemos creada la carpeta debian.
La opción --createorig nos creará una carpeta llamada echod-0.1.orig:
$ ls -la .. total 32 ............. drwxr-xr-x 5 sergi sergi 4096 2007-06-08 13:18 echod-0.1 drwxr-xr-x 4 sergi sergi 4096 2007-06-08 13:12 echod-0.1.orig drwxr-xr-x 4 sergi sergi 4096 2007-06-08 12:59 echoDimoni ......
Esta carpeta será utilizada más adelante para crear los ficheros fuente de debian.
Una vez tenemos la carpeta debian, ya estamos en condiciones de crear un paquete Debian a través del comando dpkg-buildpackage. Para crear el paquete hay que ser superusuario o todavia mejor, utilizar el comando fakeroot:
$ fakeroot # dpkg-buildpackage ............. ............. dpkg-genchanges dpkg-genchanges: including full source code in upload signfile echod_0.1-1_i386.changes dpkg-buildpackage: full upload (original source is included)
Una vez creado el paquete es MUY IMPORTANTE para evitar errores y otras complicaciones, salir de fakeroot con el comando exit:
# exit $
Si ejecutamos el comando:
$ ls -l .. .............................. drwxr-xr-x 5 sergi sergi 4096 2007-06-08 13:22 echod-0.1 -rw-r--r-- 1 sergi sergi 7474 2007-06-08 13:22 echod_0.1-1.diff.gz -rw-r--r-- 1 sergi sergi 546 2007-06-08 13:23 echod_0.1-1.dsc -rw-r--r-- 1 sergi sergi 980 2007-06-08 13:23 echod_0.1-1_i386.changes -rw-r--r-- 1 sergi sergi 6550 2007-06-08 13:23 echod_0.1-1_i386.deb -rw-r--r-- 1 sergi sergi 18471 2007-06-08 13:22 echod_0.1.orig.tar.gz drwxr-xr-x 4 sergi sergi 4096 2007-06-08 12:59 echoDimoni .....................
Se han creado tanto el paquete debian binario, como los #Estructura_de_los_paquetes_fuente_Debian paquetes debian fuente () y el fichero de cambios (.changes).
Pero no todo es tan simple, realmente si ahora abris el paquete debian con el comando:
$ nautilus ..
Y abris el paquete con la aplicación "Gestor d'arxius":
en KDE teneis una aplicación llamada ARK:
Desde la línea de comandos, el comando equivalente es:
$ file-roller ../echod_0.1-1_i386.deb
Si navegais por los contenidos del paquete vereis que hay mucha información incompleta (descripción del fichero, fichero README, etc...) y que todavia quedan algunos detalles por mejorar. Esto es debido a que dh_make no puede hacer todo el trabajo del programador, pero sí facilitarla proporcionandonos una serie de herramientas y plantillas que precisamente se encuentran en la carpeta debian.
De hecho, si utilizamos alguna de las herramientas de comprobación de paquetes como por ejemplo lintian:
$ lintian ../echod_0.1-1_i386.debW: echod: binary-without-manpage echod E: echod: helper-templates-in-copyright E: echod: description-is-dh_make-template W: echod: wrong-bug-number-in-closes l3:#nnnn E: echod: section-is-dh_make-template
Vemos que el paquete tiene errores y que todavia no cumple completamente con las políticas de Debian.
Hay que decir también que con tal de poder utilizar dpkg-buildpackage el Makefile del código fuente original ha de tener como mínimo las normas clean y install. Vemos los ficheros debian/rules y Makefile para conocer mejor la relación entre los dos. Ejecutamos los comandos:
$ gedit debian/rules & $ gedit Makefile &
Fichero debian/rules:
clean: dh_testdir dh_testroot rm -f build-stamp configure-stamp # Add here commands to clean up after the build process. -$(MAKE) clean dh_clean ................ install: build dh_testdir dh_testroot dh_clean -k dh_installdirs # Add here commands to install the package into debian/echod. $(MAKE) DESTDIR=$(CURDIR)/debian/echod install
Fichero makefile:
OWNER=root GROUP=root PROGRAM=echod INSTALL=/usr/bin/install BINDIR=$(DESTDIR)/usr/sbin INITDDIR=$(DESTDIR)7/etc/init.d ETCDIR=$(DESTDIR)/etc/$(PROGRAM) all: echod echod: echod.c gcc -o echod echod.c clean: rm -f echod install: all install_portfile install_initd $(INSTALL) -c -o $(OWNER) -g $(GROUP) -m 755 $(PROGRAM) $(BINDIR) install_initd: all mkdir -p $(INITDDIR) $(INSTALL) -c -o $(OWNER) -g $(GROUP) -m 755 etc/init.d/$(PROGRAM) $(INITDDIR) install_portfile: all mkdir -p $(ETCDIR) $(INSTALL) -c -o $(OWNER) -g $(GROUP) -m 644 etc/$(PROGRAM)/port $(ETCDIR) uninstall: rm -f $(INITDDIR)/echod rm -f $(BINDIR)/echod
Fijaros que el truco de utilizar la variable $(DESTDIR) nos permite instalar la aplicación allí donde queramos. El fichero debian/rules no es más que un script Makefile (por eso en la primera línea #!/usr/bin/make -f).
El comando dpkg-buildpackage ejecuta las normas de Debian necesarias para poder crear el paquete. Algunas de estar normas contienen llamadas a normas del fichero Makefile original, como puede ser el caso de las normas install y clean:
$(MAKE) clean $(MAKE) DESTDIR=$(CURDIR)/debian/echod install
Fijaros que todos los ficheros que formarán part del paquete se instalan antes temporalmente en la carpeta debian/nombre_paquete (en nuestro caso: debian/echod). Todo empieza a relacionarse!
Podeis encontrar más información sobre el fichero debian/rules de la Debian Policy.
El resto del fichero debian/rules son llamadas a guiones de shell de debhelper. Durante lo siguientes apartados veremos algunos ejemplos de uso de estos guiones:
Ahora vamos a modificar las plantillas que nos proporciona dh_make para configurar nuestro paquet y acabar de crear un Paquete Debian "perfecto".
Seguiremos los siguientes pasos:
Fichero original:
Source: echod Section: unknown Priority: extra Maintainer: Sergi Tur Badenas <[email protected]> Build-Depends: debhelper (>= 5) Standards-Version: 3.7.2 Package: echod Architecture: any Depends: ${shlibs:Depends}, ${misc:Depends} Description: <insert up to 60 chars description> <insert long description, indented with spaces>
Fichero modificado:
Source: echod Section: web Priority: extra Maintainer: Sergi Tur Badenas <[email protected]> Build-Depends: debhelper (>= 5) Standards-Version: 3.7.2 Package: echod Architecture: any Depends: ${shlibs:Depends}, ${misc:Depends} Description: Servidor d'ecos del curs de programació en Linux Aquest servidor és un dimoni que esta a l'espera de rebre missatges d'un client Els missatges rebuts pel client són retornats sense cap canvi al client
$ debchange Esta es la versión inicial de nuestro paquete
y después ejecutamos:
$ debchange
Vemos como se ha modificado el fichero de cambios:
echod (0.1-1) unstable; urgency=low *Initial release (Closes: #nnnn) <nnnn is the bug number of your ITP> *Esta es la versión inicial de nuestro paquete -- Sergi Tur Badenas <[email protected]> Sun, 10 Jun 2007 11:27:06 +0200
Veremos como hemos añadido un comentario al registro de cambios. Consultar la sección debchange para obtener más detalles sobre debchange.
El siguiente paso es modificar el fichero debian/copyright para especificar nuestra licencia. El comando dh_make nos ha creado la siguiente plantilla:
This package was debianized by Sergi Tur Badenas <[email protected]> on Tue, 5 Jun 2007 13:01:02 +0200. It was downloaded from <fill in http/ftp site> Upstream Author: <put author(s) name and email here> Copyright: <put the year(s) of the copyright, and the names of the copyright holder(s) here> License: <Put the license of the package here> The Debian packaging is (C) 2007, Sergi Tur Badenas <[email protected]> and is licensed under the GPL, see `/usr/share/common-licenses/GPL'. # Please also look if there are files or directories which have a # different copyright/license attached and list them here.
Podeis encontrar ficheros de ejemplo de licencias en vuestra propia máquina ejecutando el comando:
$ sudo updatedb $ locate copyright
Por ejemplo la licencia de emacs la encontrareis en:
$ cat $(dpkg -L emacs | grep copyright)
o apache2:
$ cat $(dpkg -L apache2 | grep copyright)
Podeis copiar la licencia libre que os parezca más adecuada a vuestro fichero de copyright.
$ gedit debian/dirs usr/sbin
$ cat debian/README.Debian echod for Debian --------------------- <possible notes regarding this package - if none, delete this file> -- Sergi Tur Badenas <[email protected]> Tue, 5 Jun 2007 13:01:02 +0200
En el fichero README podemos poner las notas que creamos convenientes sobre la aplicación. Otro fichero típico es el fichero TODO (things to do), donde como dice su propio nombre, se muestran las tareas que hay pendientes de hacer. Podemos crear un fichero llamado debian/TODO.Debian.
Estos dos ficheros acabarán en la carpeta de documentación, que siguiendo el estándar FHS debe ser la carpeta /usr/share/doc/nompaquet.
......... # dh_installemacsen # dh_installpam # dh_installmime # dh_python dh_installinit # dh_installcron # dh_installinfo
En este punto es donde hemos de introducir nuestro primer hack del fichero debian/rules'. El comando dh_install no hará nada si ya encuentra el fichero /etc/init.d/echod instalado en el sistema. Como que el instalador del código fuente original del programa (norma install del Makefile) ya instala el fichero dh_installinit no hará nada. Podemos solucionar este problema añadiendo la línea:
$ mv $(CURDIR)/debian/echod/etc/init.d/echod $(CURDIR)/debian/echod.init
En la norma install del fichero debian/rules queda de la siguiente forma:
install: build dh_testdir dh_testroot dh_clean -k dh_installdirs # Add here commands to install the package into debian/echod. $(MAKE) DESTDIR=$(CURDIR)/debian/echod install mv $(CURDIR)/debian/echod/etc/init.d/echod $(CURDIR)/debian/echod.init
Es un buen punto para hacer notar como todo el fichero debian/rules está lleno de llamadas a los comandos del paquete deb-helper (comandos dh_*). Cada uno de estos comandos tiene su correspondiente manual donde podemos obtener información detallada de lo que hacen.
El comando dh_installinit creará los ficheros:
Estos ficheros son los que conjuntamente con los ficheros (en el caso que existan):
Conformarán los Scripts de mantenimiento finales postinst, postrm y prerm que encontraremos en el fichero control.tar.gz del paquete debian final.
Si vemos el código de uno de ellos echod.postinst.debhelper:
# Automatically added by dh_installinit if [ -x "/etc/init.d/echod" ]; then update-rc.d echod defaults >/dev/null if [ -x "`which invoke-rc.d 2>/dev/null`" ]; then invoke-rc.d echod start || exit $? else /etc/init.d/echod start || exit $? fi fi # End automatically added section
Veremos que el script postinst se encargará de configurar nuestro sistema para iniciar el demonio automáticamente al iniciar el sistema. Simplemente Genial! El resto de scripts hacen tareas similares (como por ejemplo sacar del inicio el demonio si lo desinstalamos).
NOTA: Hay que recalcar que los scripts echod.*.debhelper no reescriben nuestros ficheros postinst, postrm, etc sino que deb_helper se encarga de añadir este código (operación merge) a nuestro fichero.
Las plantillas son:
Son los tres formatos soportados por los ficheros man. Como podeis ver las plantillas siempre acaban con la extensión .ex.
El guión de shell de debhelper que instala los manuales es dh_installman y está activado por defecto en el fichero debian/rules. Los únicos pasos que hemos de seguir son editar alguna de las plantillas, poner un nombre adecuado al fichero (típicamente 'nomcomando.seccion) y crear un fichero debian/manpages con la lista de ficheros manual. Los pasos a seguir:
Copiamos la plantilla:
$ cp debian/manpage.1.ex debian/echod.1
Y editamos el manual para añadir la documentación a nuestro gusto:
$ gedit debian/echod.1 &
Y editamos el manual. Una vez editado ejecutamos:
$ gedit debian/manpages &
Añadir la línea:
debian/echod.1
Si no tocamos la plantilla el resultado final será:
$ man echod ECHOD(SECTION) ECHOD(SECTION) NAME echod - program to do something SYNOPSIS echod [options] files... bar [options] files... DESCRIPTION This manual page documents briefly the echod and bar commands. echod is a program that... OPTIONS These programs follow the usual GNU command line syntax, with long options starting with two dashes (‘-’). A summary of options is included below. For a complete description, see the Info files. -h, --help Show summary of options. -v, --version Show version of program. SEE ALSO bar(1), baz(1). The programs are documented fully by The Rise and Fall of a Fooish Bar, available via the Info system. AUTHOR echod was written by <upstream author>. This manual page was written by Sergi Tur Badenas <[email protected]>, for the Debian project (but may be used by others). juny 8, 2007 ECHOD(SECTION)
Lo primero que tenemos que hacer es crear el fichero debian/templates. Este fichero contiene las plantillas de interfaz con el usuario.
$ gedit debian/templates &
Un plantilla sencilla puede ser la siguiente:
Template: echod/port Type: string Default: 8001 Description: Port Number: Please enter the port number for echod. Description-es.UTF-8: por favor introducir el puerto del servidor echod Description-ca.UTF-8: Por favor introducir el puerto del servidor echod
Esta plantilla se encarga de preguntar a los usuarios el número de puerto. Si estais interesados en hacer plantillas más complejas habría que consultar el apartado Templates de la especificación de Debconf y consultar el manual debconf-devel.
El segundo paso es crear el fichero debian/config:
$ gedit debian/config # Source debconf library. . /usr/share/debconf/confmodule db_version 2.0 #Establecemos que durante la configuración se pueda ir atrás con el botón cancelar db_capb backup #Establecemos nuestros templates a no vistos para que debconf siempre los muestre db_fset echod/port seen false db_fset echod/notconfigured seen false STATE=1 while [ "$STATE" != 0 -a "$STATE" != 2 ] do case "$STATE" in 1) # Preparamos el template echod/port db_input critical echod/port || true #lo mostramos if db_go; then #Controlamos si el valor del puerto está vacio db_get echod/port || true if [ ! -z "$RET" ]; then STATE=2 fi else STATE=0 fi ;; esac done #Si el puerto está vacio mostramos un mensaje de error: template echod/notconfigured if [ "$STATE" = 0 ]; then db_input critical echod/notconfigured || true db_go exit 1 fi
El fichero config solo se encarga del flujo de la interfaz con el usuario. Para este menester, utilizamos las funciones de shell proporcionadas por el fichero /usr/share/debconf/confmodule para comunicarnso con debconf a través de los comandos del protocolo debconf. Si os fijais, el script solo se encarga de llamar a la plantilla echod/port:
y en caso de que cancelemos muestra un mensaje de aviso echod/notconfigured:
El manual de confmodule (man confmodule) nos da información sobre la libreria de debconf para Shell (/usr/share/debconf/confmodule).
Ahora viene la parte más complicada: la lógica de la configuración. En nuestro caso modificaremos el script de mantenimiento postint. dh-make nos ha creado una plantilla para este fichero (debian/postinst.ex) y la aprovecharemos:
$ cp debian/postinst.ex debian/postinst $ gedit debian/postinst &
Una vez hemos copiado la plantilla le añadiremos la función get_config() justo antes del case:
get_config() { db_get echod/port port="$RET" } handle_config() { cfile=/etc/echod/port tempcfile=`tempfile` cat > $tempcfile <<EOF ${port} EOF ucf $tempcfile $cfile chmod 644 $cfile }
Y llenaremos el case configure con el siguiente código:
. /usr/share/debconf/confmodule db_version 2.0 # Read debconf get_config db_stop exec 0<&1 handle_config
El fichero ha de quedar igual que este.
Resumiendo, el codigo lee el puerto que hemos introducido, y lo guarda al fichero /etc/echod/port.
El último paso que nos queda es descomentar la línea dh_installdebconf del fichero debian/rules:
# Build architecture-dependent files here. binary-arch: build install ..... dh_installdocs dh_installexamples # dh_install # dh_installmenu dh_installdebconf # dh_installlogrotate # dh_installemacsen
Ahora ya está todo preparado y podemos crear nuestro paquete Debian:
$ fakeroot # dpkg-buildpackage # exit
No olvideis el exit si no quereis pensar que estais haciendo cosas como root pero en realidad no (fake root ;-))
Para instalarlo ejecuamos:
$ sudo dpkg -i ../echod_0.1-1_i386.deb
Si queremos reconfigurar:
$ sudo dpkg-reconfigure echod
Si hacemos algún cambio y queremos volver a crear el primer paquete lo tendríamos que desinstalar con:
$ sudo apt-get remove --yes --purge echod
Es tan sencillo cómo hacer los cambios que queramos y cambiar de versión con:
$ dch -i
Y notificamos los cambios:
echod (0.1-1ubuntu1) feisty; urgency=low
-- Sergi Tur Badenas <[email protected]> Wed, 13 Jun 2007 12:13:34 +0200 echod (0.1-1) unstable; urgency=low *Initial release (Closes: #nnnn) <nnnn is the bug number of your ITP> *Primera Versio -- Sergi Tur Badenas <[email protected]> Fri, 8 Jun 2007 17:11:24 +0200
Y ahora ya podemos crear el nuevo paquete con:
$ fakeroot # dpkg-buildpackage # exit
Como que la prueba la he hecho en un Ubuntu, ahora el nuevo paquete se llama echod_0.1-1ubuntu1_i386.deb:
$ ls -la .. ....... -rw-r--r-- 1 sergi sergi 10883 2007-06-13 12:14 echod_0.1-1ubuntu1.diff.gz -rw-r--r-- 1 sergi sergi 324 2007-06-13 12:14 echod_0.1-1ubuntu1.dsc -rw-r--r-- 1 sergi sergi 673 2007-06-13 12:15 echod_0.1-1ubuntu1_i386.changes -rw-r--r-- 1 sergi sergi 9566 2007-06-13 12:15 echod_0.1-1ubuntu1_i386.deb