Debianizando - Creacion Paquetes Debian
Debianizando - Creacion Paquetes Debian
Debianizando - Creacion Paquetes Debian
15 de abril de 1999
Resumen
El paquete es el componente fundamental de una distribución, pero dentro de éstos hay
mucho más de lo que uno pudiera imaginar. En este artı́culo se analiza la distribución Debian
GNU/Linux desde esta perspectiva.
(Este artı́culo ha sido publicado por La Espiral y su versión mas reciente se puede encontrar en
http://www.laespiral.org1 )
1. Introducción
Es importante conocer la estructura de paquetes que las distribuciones usan, porque sólo
ası́ uno es capaz de arreglar los problemas que puedan surgir en su uso diario (corrupción de
archivos, instalación de programas fuera de la distribución, etc.).
A pesar de que las distribuciones vienen con un buen número de software (Debian GNU/Linux,
por ejemplo, cuenta con más de 2500 paquetes de software) a veces interesará instalar software
que no es parte de la distribución o que aún no ha sido incorporado a ésta; esto incluye paquetes
de software que se encuentran en la red y software comercial, e, incluso, aplicaciones creadas por
el propio usuario; para estas cosas serán necesario hacerse sus propios paquetes si no se quiere
entrar en conflicto con el sistema de paquetes. Por supuesto, si se desea contribuir a las distin-
tas distribuciones con software, evidentemente, se deberá dar los programas convenientemente
empaquetados.
También puede ser útil para recompilar paquetes nuevos con librerı́as antiguas, es el caso, por
ejemplo, con los paquetes hamm de Debian 2.0 compilados para libc6, que podrı́an instalarse en
un sistema bo (Debian 1.3.1), que utiliza libc5, sin más que recompilar el código fuente e instalar
el paquete (si fuera sólo ésta la única dependencia problemática, el significado de las dependencias
se verá más tarde).
1
El copyright de este artı́culo es compartido por su autor y Open Resources. Este artı́culo se distribuye
bajo la licencia de la Revista OR (OR Magazine License). Puedes ver esta licencia en la siguiente URL:
http://www.openresources.com/magazine/license/index.html.
La Espiral - Creación de paquetes de Debian 2
En éste artı́culo se verá en detalle el sistema de paquetes de Debian GNU/Linux desde el punto
de vista del formato de paquete (.deb) con objeto de preparar al lector interesado para lo arriba
indicado. Hay que tener en cuenta, sin embargo, que el sistema de paquetes es mucho más amplio
que sólo un formato de archivo ya que lleva detrás toda una filosofı́a de “cómo hacer las cosas”,
que en el caso de Debian es una Polı́tica bien definida.
La razón de detallar el sistema de paquetes de Debian es múltiple: por un lado el sistema de
paquetes de Debian GNU/Linux es muy versátil, con algunas caracterı́sticas que dan uniformidad
a la distribución en cuanto a la localización de programas y documentación; asimismo, el sistema
Debian GNU/Linux es el más abierto con respecto a la incorporación de desarrolladores (en inglés,
maintainers) a éste, a diferencia de otras distribuciones comerciales en las cuales la contribución
está más limitada. Y finalmente, porque de entre muchos otros formatos de paquetes Debian ofrece
más que la mayorı́a, como puede leer en este informe.
Se lleva un tiempo debatiendo sobre una posible estandarización de los sistemas de paquetes,
que quizás se consiga como ya se consiguió homogeneizar la estructura de directorios a través
del Linux Filesystem Structure (FSSTND), con lo que es posible que en un futuro habrá mayor
compatibilidad entre las distribuciones.
es semi-automático (vı́a varios servidores de ftp anónimo y las máquinas de Debian) y, también es
posible que personas ajenas a Debian (u otros desarrolladores de Debian) manden cambios, para,
por ejemplo, arreglar errores crı́ticos. Es por tanto importante que los paquetes vayan firmados
por el que hizo las modificaciones (dpkg-buildpackage llama a PGP al final) y proteger contra
modificaciones del paquete que se intenten hacer una vez el maintainer ha dado su versión. Se
firma ası́ el fichero .dsc que contiene una descripción del paquete y una “huella” de los ficheros
anteriormente vistos, esta firma se realiza con una función “hash” muy conocida: MD5; también
se firma, si existiera, el fichero .changes que contiene las modificaciones realizadas entre una
versión.
5. El directorio debian
Debian controla las caracterı́sticas y evolución del paquete a través de una serie de ficheros.
Cosas tales como la descripción del paquete, las dependencias con otros paquetes, con librerı́as
instaladas, cambios producidos en el paquete, reglas para construir y compilar los binarios del
paquete, etc.
Esto se consigue con el directorio debian/, que, en principio, es lo único que añade Debian
al código fuente original de un paquete. En este directorio se encuentran un conjunto de ficheros
(vea la figura 1) que deben seguir unas reglas definidas en la Polı́tica de Paquetes de Debian, en la
que se explica tanto el contenido de éstos como su formato.
En el fichero control se definen las caracterı́sticas del paquete, y es, básicamente, lo que se
observa cuando se ejecuta dpkg –status sobre un paquete ya instalado o dpkg –info sobre uno no
instalado (sobre el fichero .deb). Sus campos son:
Section: sección de Debian a la que pertenece (por ejemplo: devel, web, admin...).
Priority: prioridad que tiene este paquete dentro de la distribución (required, important,
optional, standard, extra).
Architecture: arquitectura para la que se ha creado (i386, alpha, arm, m68k, powerpc,
sparc..).
Depends: dependencias con otros paquetes, se indica tanto el paquete como su versión.
Conflicts: paquetes con los que entra en conflicto y que no pueden estar instalados cuando
se instala éste.
Suggests: paquetes que mejoran el paquete que se está instalando y que, aunque no son
necesarios para su funcionamiento, se recomienda su instalación.
Description: descripción breve (una lı́nea) y larga del contenido del paquete.
La Espiral - Creación de paquetes de Debian 6
El fichero rules contiene las reglas para construir el paquete y será la que llamen los pro-
gramas de construcción de paquetes. Se trata de un Makefile, un fichero habitual para aquellos
acostumbrados a compilar programas en entornos UNIX. Dentro de este fichero encontramos una
serie de reglas y objetivos a cumplir. Dentro de estos últimos podemos destacar varios de impor-
tancia:
clean: limpia el árbol de binarios y ficheros temporales. Se ejecutará siempre para asegurse
que la compilación/construcción del paquete se hace sobre una base “limpia”.
build: compila las fuentes del programa para obtener los binarios (también otras cosas gen-
eradas automáticamente como, a veces, la documentación).
binary: llama a dos subobjetivos: binary-indep y binary-arch, que van a realizar la insta-
lación del paquete bajo debian/tmp, moviendo allı́ programas, documentación y librerı́as,
cambiando los permisos y propietarios según corresponda. El primero realizará las tareas
independientes de arquitectura y el segundo las tareas para una arquitectura determinada.
get-orig-source: especifica una forma de obtener el código fuente original que se ha utiliza-
do para construir el paquete (vı́a ftp).
Existen otros ficheros: menu, init.d, crontab... que pueden usarse para integrar el pa-
quete aún más en el sistema.
7. El formato .deb
Los ficheros .deb generados por el procedimiento ya visto, no son sino una serie de ficheros en-
cadenados con el programa ar, en total tres: data.tar.gz, control.tar.gz y debian-binary.
Los dos primeros son, por un lado un tar.gz (data.tar.gz) con el árbol de directorios que se genera
en debian/tmp y que se desempaquetará directamente sobre el raı́z del disco duro en el momento
de instalar, y por otro el directorio DEBIAN (control.tar.gz) que contiene muchos de los ficheros
vistos en debian/, aunque algunos estarán modificados.
Es posible extraer estos por separado, el tar.gz con el comando dpkg -x fichero.deb direc-
torio destino y el DEBIAN con el comando dpkg -c fichero.deb directorio destino. Aunque
en realidad esto se puede hacer también con ar -x fichero.deb, lo que hace posible instalar un
La Espiral - Creación de paquetes de Debian 8
paquete Debian incluso en un sistema que no sepa nada de distribuciones, simplemente con tener
la herramienta GNU ar ya instalada. También se puede construir un fichero .deb (es decir hac-
er el proceso inverso) con el programa ar o con dpkg –build directorio que creará el fichero
directorio.deb.
la base de datos del sistema de paquetes está en texto en claro, es posible arreglar problemas
de corrupción a mano sin que el sistema se quede inutilizado si la base de datos queda
corrompida.
la cooperación entre paquetes y el sistema se hace posible de varias formas: a través del
paquete menu, definiendo un estándar de acceso a la documentación mediante el paque-
te doc-base (con la documentación en HTML en http://localhost/doc) y de instalación de
servidor (raı́z del servidor y residencia de CGIs) lo que permite a los paquetes integrarse
con el servidor local de web.
su adherencia a los estándares es firme, no sólo existen estándares, sino que se cumplen,
existiendo un seguimiento constante de que se cumpla la polı́tica definida (ver si no la
pagina de Lintian, también disponible como paquete)
es posible tener distintas versiones del mismo kernel, o compilar el kernel junto con los
módulos fácilmente.
La Espiral - Creación de paquetes de Debian 9
epoca: Un entero generalmente pequeño, si no existe se asume que es 0. Se utiliza para so-
portar el cambio de sistemas de numeración de versiones que pueda hacer el autor original.
Generalmente no se muestra.
version-upstream: Ésta es la parte principal de la versión, se trata del número de versión del
paquete original (upstream) del cual se ha hecho el fichero .deb. Normalmente se mantiene
el formato usado por el autor original (aunque a veces pueda tener que ser modificado para
que no existan conflictos), sólo puede tener los caracteres alfanuméricos y ‘+’,‘-’,‘.’ o ‘:’ y
debe comenzar por un dı́gito.
Seguir este esquema es importante porque Debian lo usa para resolver conflictos y depen-
dencias, que dependen, en muchos casos, de una versión determinada. Sólo con un esquema fijo
puede dpkg saber si una versión es más nueva o más vieja que otra.
package=hello
build:
$(checkdir)
./configure --prefix=/usr
$(MAKE) CFLAGS=-O2 LDFLAGS=
touch build clean:
$(checkdir)
-rm -f build
-$(MAKE) -i distclean || $(MAKE) -f Makefile.in distclean
-rm -rf *˜ debian/tmp debian/*˜ debian/files*
cp ChangeLog debian/tmp/usr/doc/$(package)/changelog
gzip -9v debian/tmp/usr/doc/$(package)/changelog{,.Debian}
dpkg-shlibdeps hello
dpkg-gencontrol
chown -R root.root debian/tmp
chmod -R g-ws debian/tmp
dpkg --build debian/tmp ..
define checkdir
test -f $(package).c -a -f debian/rules endef
source diff:
@echo >&2 ’source and diff are obsolete - use dpkg-source -b’;
false
checkroot:
$(checkdir)
test root = "‘whoami‘"