Preparar una máquina para el desarrollo de paquetes Debian


En esta entrada vamos a explicar los pasos a dar para tener una máquina lista para la creación de paquetes Debian. Lo que a continuación se muestra no pretende ser, ni mucho menos, una explicación genérica, ya que una de las principales características que tiene el desarrollo en Debian es que no hay una sola forma de hacer las cosas, sino múltiples. En la Política Debian se especifican de forma muy detallada las características que debe tener un paquete fuente o uno binario, pero no la forma de obtenerlo, que es mucho más libre. Aquí simplemente explico los pasos que he seguido yo, en buena parte siguiendo las recomendaciones de Arturo Borrero, que me ha ayudado mucho en estos primeros pasos con el empaquetado de Debian, para tener donde buscarlos cuando me haga falta y si de paso le sirve a alguien en sus inicios, pues mejor :).

La situación más habitual es que desarrollemos una nueva versión de un paquete para la rama Debian inestable (Sid), por lo que el primer paso será tener preparada una máquina para esta rama.

Preparar una máquina con Debian Sid

Normalmente no se instala una máquina directamente con Debian Sid, sino que se usa una de la rama «stable» o «testing» y la pasamos a «unstable» modificando la lista de repositorios. Lo lógico sería usar una máquina virtual o similar sin entorno gráfico y solo con los paquetes esenciales al inicio, ya iremos añadiendo desde la rama «unstable» los paquetes que vayamos necesitando para el desarrollo. En un caso sencillo basta con modificar solo la rama main en el fichero /etc/apt/sources.list, que debería quedar de la siguiente manera:

deb http://deb.debian.org/debian unstable main
deb-src http://deb.debian.org/debian unstable main

Actualizamos la lista de paquetes:

sudo apt update

Y pasamos la máquina a sid (este proceso puede llevar bastante tiempo porque se van a actualizar prácticamente todos los paquetes y requerirá reiniciar para que se utilice el nuevo núcleo):

sudo apt dist-upgrade

Finalmente desinstalamos todos los paquetes que ya no sean necesarios y reiniciamos:

sudo apt -y autoremove
sudo  systemctl reboot

Instalación de un proxy apt (apt-cacher-ng)

En el proceso de desarrollo de debian que explicaremos, vamos a crear una y otra vez nuevos entornos limpios (normalmente entornos enjaulados) en los que hacer las modificaciones y probar los nuevos paquetes, por lo que es muy conveniente usar un proxy apt que hará que todos estos entornos compartan los paquetes descargados por apt en lugar de bajarlos directamente de Internet, haciendo que la creación de los mismos sea bastante más rápida y no se use innecesariamente mucho ancho de banda. En este caso vamos a instalar el paquete apt-cacher-ng y vamos a configurar la máquina para que también utilice este proxy:

sudo apt install apt-cacher-ng

Podemos definir en el fichero /etc/apt-cacher-ng/backends_debian.default el repositorio que vamos a usar por defecto en Debian, por ejemplo:

http://deb.debian.org/debian/

Si modificamos ese fichero, habrá que reiniciar el servicio:

sudo systemctl restart apt-cacher-ng.service

Modificamos finalmente los repositorios de la máquina para que utilice el proxy apt (fichero /etc/apt/sources.list):

deb http://localhost:3142/deb.debian.org/debian unstable main
deb-src http://localhost:3142/deb.debian.org/debian unstable main

Y comprobamos que funciona correctamente haciendo una actualización.

sbuild

Hay diferentes herramientas para crear paquetes debian, en Guía del nuevo desarrollador de Debian por ejemplo, se explica la utilización de pbuilder. La única que he utilizado desde que comencé a empaquetar ha sido sbuild, que tiene como principal ventaja la capacidad de construir paquetes utilizando entornos limpios que se montan al vuelo dentro de una jaula schroot, para lo que seguimos los pasos de la wiki de debian de este paquete (https://wiki.debian.org/sbuild):

sudo apt install sbuild schroot debootstrap
sudo sbuild-adduser $LOGNAME 
cp /usr/share/doc/sbuild/examples/example.sbuildrc $HOME/.sbuildrc # copy example config into your home as suggested

Cerramos la sesión y volvemos a entrar en la máquina o ejecutamos `newgrp sbuild` para que el usuario pertenezca al grupo sbuild en la sesión. Por último creamos el entorno enjaulado donde se van a desarrollar los paquetes y se va a usar los repositorios del proxy apt:

sudo sbuild-createchroot --include=eatmydata,ccache,gnupg unstable /srv/chroot/unstable-amd64-sbuild http://localhost:3142/deb.debian.org/debian

Por último comprobamos que el entorno schroot está listo y actualizado:

sudo sbuild-update -udcar unstable

unstable: Performing update.
Hit:1 http://localhost:3142/deb.debian.org/debian unstable InRelease
Reading package lists... Done
unstable: Performing dist-upgrade.
Reading package lists... Done
Building dependency tree... Done
Calculating upgrade... Done
0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
unstable: Performing clean.
unstable: Performing autoclean.
Reading package lists... Done
Building dependency tree... Done
unstable: Performing autoremove.
Reading package lists... Done
Building dependency tree... Done
0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.

Como hemos creado un entorno enjaulado para debian unstable, éste puede quedar obsoleto rápidamente a medida que esta rama avence. Así que la instrucción anterior que actualiza el entorno será interesante ejecutarla de vez en cuando, así será más rápido su uso posterior.

Ya tenemos la máquina con Debian sid y configurada la herramienta sbuild para la creación de paquetes en un entorno limpio schroot.

Prueba de funcionamiento

Vamos a probar que efectivamente todo funciona reconstruyendo la creación de un paquete ya desarrollado, es decir, construir nosotros un paquete debian desde el fichero fuente del paquete y verificar que obtenemos exactamente el mismo resultado que el paquete disponible en los repositorios.

Instalamos el software necesario para poder construir un paquete (make, compiladores y un conjunto básico de scripts y herramientas usadas en Debian):

sudo apt install devscripts build-essential

Buscamos el código fuente de un paquete debian en packages.debian.org, en este caso lo haremos con el primer paquete que adopté (arptables) que es pequeño y bastante sencillo de empaquetar, por lo que vamos a https://packages.debian.org/arptables. Allí encontraremos bastante información sobre el paquete, enlaces para descargar el binario en diferentes arquitectura y en la columna de la derecha, las opciones de descargar el código fuente, en particular en formado dsc (Debian Source Control), por lo que seleccionamos la URL que enlaza al fichero arptables_….dsc, en estos momentos http://deb.debian.org/debian/pool/main/a/arptables/arptables_0.0.5-1.dsc.

Usamos dget para descargar el paquete fuente:

dget http://deb.debian.org/debian/pool/main/a/arptables/arptables_0.0.5-1.dsc

Que descarga los ficheros dsc, arptables_*.orig.tar.gz (fichero fuente original del proyecto) y arptables_*.debian.tar.xz (fichero fuente con las modificaciones de debian). Al utilizar dget, todo se descarga y descomprime en el directorio arptables-0.0.5, que queda finalmente con el siguiente contenido:

-rw-r--r-- 1 debian debian 61653 Dec  2 14:11 arptables.c
-rw-r--r-- 1 debian debian 12058 Dec  2 14:11 arptables-legacy.8
-rw-r--r-- 1 debian debian  1683 Dec  2 14:11 arptables-restore
-rw-r--r-- 1 debian debian  1501 Dec  2 14:11 arptables-restore.8
-rw-r--r-- 1 debian debian  1252 Dec  2 14:11 arptables-save
-rw-r--r-- 1 debian debian  1398 Dec  2 14:11 arptables-save.8
-rw-r--r-- 1 debian debian  1815 Dec  2 14:11 arptables-standalone.c
-rw-r--r-- 1 debian debian 18110 Dec  2 14:11 COPYING
drwxr-xr-x 4 debian debian  4096 Dec  5 09:19 debian
drwxr-xr-x 2 debian debian  4096 Dec  2 14:11 extensions
drwxr-xr-x 4 debian debian  4096 Dec  2 14:11 include
drwxr-xr-x 2 debian debian  4096 Dec  2 14:11 libarptc
-rw-r--r-- 1 debian debian  2274 May  9 15:15 Makefile

Donde el directorio debian/ contiene las modificaciones respecto al código fuente original (se usa el término «código fuente de upstream») que se incluyen en el empaquetado de Debian (información del paquete, mantenedores, licencia, modificaciones para adaptarlo a la política de Debian, etc.).

Ya podemos construir el paquete debian, aunque antes de continuar renombramos el fichero arptables_0.0.5-1.dsc a arptables_0.0.5-1.dsc.bak para poder compararlo finalmente con el resultado de nuestra construcción de paquete y luego construimos el paquete con la orden sbuild.

mv arptables_0.0.5-1.dsc arptables_0.0.5-1.dsc.bak
cd arptables_0.0.5/
sbuild


...
+------------------------------------------------------------------------------+
| Summary                                                                      |
+------------------------------------------------------------------------------+

Build Architecture: amd64
Build Type: binary
Build-Space: 2056
Build-Time: 9
Distribution: unstable
Host Architecture: amd64
Install-Time: 47
Job: /home/debian/arptables/arptables_0.0.5-1.dsc
Lintian: pass
Machine Architecture: amd64
Package: arptables
Package-Time: 67
Source-Version: 0.0.5-1
Space: 2056
Status: successful
Version: 0.0.5-1
--------------------------------------------------------------------------------
Finished at 2020-05-09T15:39:15Z
Build needed 00:01:07, 2056k disk space

Una vez que termine se habrá compilado el paquete arptables_0.0.5-1 y en el directorio padre aparecerán los siguientes ficheros:

lrwxrwxrwx 1 debian debian    50 May  9 15:38 arptables_0.0.5-1_amd64.build -> arptables_0.0.5-1_amd64-2020-05-09T15:38:08Z.build
-rw-rw-r-- 1 debian debian  4474 May  9 15:39 arptables_0.0.5-1_amd64.buildinfo
-rw-rw-r-- 1 debian debian  1432 May  9 15:39 arptables_0.0.5-1_amd64.changes
-rw-rw-r-- 1 debian debian 38144 May  9 15:39 arptables_0.0.5-1_amd64.deb
-rw-r--r-- 1 debian debian  5032 May  9 15:38 arptables_0.0.5-1.debian.tar.xz
-rw-r--r-- 1 debian debian  1071 May  9 15:38 arptables_0.0.5-1.dsc
-rw-r--r-- 1 debian debian 52247 Dec 10 11:27 arptables_0.0.5.orig.tar.gz
-rw-rw-r-- 1 debian debian 85156 May  9 15:39 arptables-dbgsym_0.0.5-1_amd64.deb

Si comparamos el fichero arptables_0.0.5-1.dsc ahora generado con el descargado, podemos comprobar que son idénticos (salvo la firma GPG del descargado de los repositorios de debian):

diff -y arptables_0.0.5-1.dsc.bak arptables_0.0.5-1.dsc

                                                              >	-----BEGIN PGP SIGNED MESSAGE-----
                                                              >	Hash: SHA512
                                                              >
Format: 3.0 (quilt)                                             Format: 3.0 (quilt)
Source: arptables                                               Source: arptables
Binary: arptables                                               Binary: arptables
Architecture: linux-any                                         Architecture: linux-any
Version: 0.0.5-1                                                Version: 0.0.5-1
Maintainer: Debian Netfilter Packaging Team <pkg-netfilter-te   Maintainer: Debian Netfilter Packaging Team <pkg-netfilter-te
Uploaders: Alberto Molina Coballes <alb.molina@gmail.com>       Uploaders: Alberto Molina Coballes <alb.molina@gmail.com>
Homepage: http://www.netfilter.org/                             Homepage: http://www.netfilter.org/
Standards-Version: 4.4.1                                        Standards-Version: 4.4.1
Vcs-Browser: https://salsa.debian.org/pkg-netfilter-team/pkg-   Vcs-Browser: https://salsa.debian.org/pkg-netfilter-team/pkg-
Vcs-Git: https://salsa.debian.org/pkg-netfilter-team/pkg-arpt   Vcs-Git: https://salsa.debian.org/pkg-netfilter-team/pkg-arpt
Build-Depends: debhelper (>= 11)                                Build-Depends: debhelper (>= 11)
Package-List:                                                   Package-List:
 arptables deb net optional arch=linux-any                       arptables deb net optional arch=linux-any
Checksums-Sha1:                                                 Checksums-Sha1:
 048b0df613cfb2c1c9f44f166cc32816a4fa43eb 52247 arptables_0.0    048b0df613cfb2c1c9f44f166cc32816a4fa43eb 52247 arptables_0.0
 5d724b7dc27a5399bdbe51ad41e7209dc27e2dba 5032 arptables_0.0.    5d724b7dc27a5399bdbe51ad41e7209dc27e2dba 5032 arptables_0.0.
Checksums-Sha256:                                               Checksums-Sha256:
 4f9a0656ce5c90868f551cd4deeb2d04f33899667e1fb2818b64e432fe8f    4f9a0656ce5c90868f551cd4deeb2d04f33899667e1fb2818b64e432fe8f
 710280fd34c6c097edc19d899014a1bf974103f8c104c9ff7752de11f3f0    710280fd34c6c097edc19d899014a1bf974103f8c104c9ff7752de11f3f0
Files:                                                          Files:
 ca6616bedd885ac14dd1af8757fb20fa 52247 arptables_0.0.5.orig.    ca6616bedd885ac14dd1af8757fb20fa 52247 arptables_0.0.5.orig.
 67a92fdaaef2328c854972d59ffeec9b 5032 arptables_0.0.5-1.debi    67a92fdaaef2328c854972d59ffeec9b 5032 arptables_0.0.5-1.debi
                                                               >
                                                               >	-----BEGIN PGP SIGNATURE-----
                                                               >
                                                               >	iQIzBAEBCgAdFiEE3ZhhqyPcMzOJLgepaOcTmB0VFfgFAl3vfmYACgkQaOcTm
                                                               >	FfjFpRAAhooaVeOCrrJ8L3HE84PKPZENk0S11Yi0CWMubyBEaF1sWocCEsn8E
                                                               >	S0KkyYTwPKv5jivtJDR7D0Qiz5xomvIRoU6rRtkFdU31PojNjYN4eu1lTsA31
                                                               >	6Lpw/4EsR2OTIcmCSYYxkREb2LYvJC9gK9kOT/FMRRAjJmjEm1wdV459KTnAP
                                                               >	hVRKg0/i5qd2l9gnGWKQ1OsCr+m4cKWuVxdurGXjEFx6wXkY38Uv0B9abkNt6
                                                               >	j48E2RzjrgPXpfgfU7MqQlAfOJXb701QnuZpKuvQ0RAMcDCg2Aj29Bhk7uczX
                                                               >	sKG7JfYTeFj4XyKh7b4erqN4d7L4v6Is1QBHZcfJp0I4WL8LfUaI8kNKfaClj
                                                               >	iaIKU7HFGMPaYCxvaGYORWcjMAz1lpCwtqLcUu9mmf8OMemJljoc2hWJsWHzD
                                                               >	eQDBT2jGbduCcLogK1XoslhB/KA6mm63ir3UZ2hTwW6x/+EpNZJz5zM9Rz/AW
                                                               >	JJj9kljDUCgTN0+rwvs7OmkGyV7fsaHsMNlcwEOGmQvWnBTG+aborJ4iZWpho
                                                               >	t3f+uGpPSBrpfARS+nv3lWyKsve7bQQnxE4bzwZaAFURdKhEdgq/OpXT+mM3Q
                                                               >	+qoV+YC3ef/RFws4nP+pz5hq+6gTtMbyppQkP/qTVAuOl1yrqks=
                                                               >	=yvMK
                                                               >	-----END PGP SIGNATURE-----

Ya tenemos pues nuestra máquina preparada para construir paquetes, aunque para desarrollar propiamente no basta con esto, habrá que utilizar otras herramientas que comentaremos en próximas entradas en el blog.

Preparar una máquina para el desarrollo de paquetes Debian

Deja una respuesta

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. Salir /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Salir /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Salir /  Cambiar )

Conectando a %s