Creative Commons License
Excepto donde se indique otra cosa, todo el contenido de este lugar está bajo una licencia de Creative Commons.
Taquiones > debian > Mi repositorio Debian

Mi repositorio Debian

Con objeto de tener accesibles por vía canónica los paquetes Debian que tengo que construir, voy a crear un repositorio personal en Taquiones y para ello anoto aquí los pasos que he seguido.

En el servidor: configurando debpool

debpool es el programa que debemos instalar para automatizar la creación y mantenimiento de nuestro repositorio. Un simple

# apt-get install debpool

es más que suficiente. Después procede tocar la configuración modificando el archivo /etc/debpool/Config.pm, que está escrito en lenguaje Perl y debe seguir sus normas.

Los parámetros que tocamos son:

$Options{'archive_dir'} = '/var/virtual/www/files/debian';
$Options{'compress_dists'} = 1;

para indicar la raíz física del repositorio y que los archivos estén comprimidos (dependiendo de gzip en ese caso).

$Options{'dists'} = {
    'stable' => 'woody',
    'unstable' => 'sid',
};

$Options{'sections'} = [ 'main', 'contrib', 'non-free' ];
$Options{'archs'} = [ 'i386', 'amd64', 'powerpc' ];

Y le decimos que queremos mantener dos distribuciones (stable y unstable), tres secciones (main,contrib y non-free) y tres arquitecturas (i386,amd64 y powerpc). Los fuentes estarán siempre y la arquitectura All suele ignorarse, aunque los envíos que a ella se realicen se reflejarán en las correspondientes arquitecturas.

Todas las disposiciones anteriores están así porque tengo máquinas funcionando con ellas, no por capricho, y porque necesito hacer backports sobre paquetes en concreto.

$Options{'release_origin'} = 'Taquiones';
$Options{'release_label'} = 'Taquiones';
$Options{'release_description'} = 'Repositorio Debian de Taquiones';

$Options{'release_noauto'} = [
    'experimental',
];

Aquí etiquetamos el repositorio para que los archivos Release estén correctamente referenciados, y le indicamos que aquellos que procedan de la rama experimental no deben ser automáticamente etiquetados como seleccionables por apt.

$Options{'daemon'} = 0;
$Options{'rollback'} = 1;
$Options{'rebuild-files'} = 1;
$Options{'rebuild-dbs'} = 1;
$Options{'rebuild-all'} = 1;

Y con este último grupo de opciones le indicamos que:

1. No funcione como un proceso demonio.
1. Sí permite que versiones antiguas en el directorio *Incoming*
sobreescriban versiones mayores en el archivo.
1. Reconstruya *siempre* todos los archivos, tanto metadatos como fuentes,
como paquetes, en cada operación con el archivo.

Eso sí, queda pendiente la firma de los paquetes, que por cuestión de tiempo no voy a incluir ahora aquí.

En el servidor: repositorio global

Nuestro siguiente objetivo es hacer disponible el repositorio a nivel global en la máquina, por lo que procedemos a seguir las instrucciones del archivo /usr/share/doc/debpool/README.User de la siguiente forma:

  1. Creamos un usuario concreto para el repositorio con la siguiente orden:

    # adduser --system --group --shell /bin/bash --gecos 'Debian Pool Manager' debpool
    Adding system user `debpool'...
    Adding new group `debpool' (112).
    Adding new user `debpool' (112) with group `debpool'.
    Creating home directory `/home/debpool'.
    #
    
  2. Cambiamos permisos y propiedad de los archivos del repositorio:

    # chown debpool:debpool /var/virtual/www/files/debian/
    # chmod a+rx /var/virtual/www/files/debian/
    
  3. Creamos un lugar donde registrar los eventos:

    # mkdir /var/log/debpool
    # chown debpool:debpool /var/log/debpool
    # chmod a+rx /var/log/debpool
    

    y nos aseguramos de que en la configuración aparezca en la configuración

    $Options{'log_file'} = '/var/log/debpool/debpool.log';
    

    y que convendría incluir en logrotate para no desbordar el disco en el futuro. Para ello creamos un archivo llamado /etc/logrotate.d/debpool y que contenga:

    /var/log/debpool/debpool.log {
        weekly
        rotate 4
        compress
        missingok
        create 644 debpool debpool
    }
    
  4. Ejecutamos una vez el programa debpool para asegurarnos de que las rutas están correctamente descritas.

    # su debpool -c "/usr/bin/debpool"
    

    con lo que deberíamos tener lo siguiente en la raíz del repositorio

    # ls -la
    total 32
    drwxr-sr-x  8 debpool debpool 4096 Oct 16 09:51 .
    drwxrwsr-x  7 victor  victor  4096 Oct  3 07:06 ..
    drwxr-x---  2 debpool debpool 4096 Oct 16 09:51 db
    drwxr-xr-x  4 debpool debpool 4096 Oct 16 09:51 dists
    drwxrwxr-t  2 debpool debpool 4096 Oct 16 09:51 incoming
    drwxr-xr-x  2 debpool debpool 4096 Oct 16 09:51 installed
    drwxr-xr-x  5 debpool debpool 4096 Oct 16 09:51 pool
    drwxr-x---  2 debpool debpool 4096 Oct 16 09:51 reject
    #
    

    Eso sí, del directorio pool cuelgan ahora un auténtico alud de subdirectorios que se pueden explorar si se tiene curiosidad, aunque confiamos en que el programa hay hecho bien su trabajo.

  5. Ahora disponemos una ejecución regular con cron de la siguiente forma:

    # crontab -u debpool -e
    

    donde añadimos estas líneas:

    @reboot         /usr/bin/debpool --nodaemon
    */5 *   * * *    /usr/bin/debpool --nodaemon
    

    para que se ejecute en cada reinicio y en periodos de cinco minutos. Esto último es totalmente personalizable; a nosotros nos viene bien que sea así porque según lo colocamos queremos usarlo desde otras máquinas, pero si agota los recursos de la máquina es preferible ampliar el intervalo.

  6. Por último es conveniente establecer algún tipo de acceso para las cuentas clientes, de manera que puedan dejar sus paquetes en el directorio incoming sin trabas respecto a los permisos.

    Lo que yo he hecho ha sido habilitar mi clave pública para acceder sin contraseña al usuario debpool en el respositorio, incluyéndola en el archivo /home/debpool/.ssh/authorized_keys. Algo sencillo y muy práctico como veremos en la siguiente sección.

En el cliente: cómo enviar paquetes

En el lado cliente vamos a usar el programa upload, también escrito en Perl, y con una configuración similar.

Creamos un archivo en $HOME/.dupload.conf con el siguiente contenido:

package config;

$default_host = "taquiones";

$preupload{'changes'} = '';

$cfg{taquiones} = {
    fqdn            =>  q(taquiones.net),
    login           =>  q(debpool),
    incoming        =>  q(/var/virtual/www/files/debian/incoming),
    mailto          =>  q(victor@taquiones.net),
    dinstall_runs   =>  0,
    fullname        =>  q(Victor Moral),
    visibleuser     =>  q(victor),
    method          =>  'scpb'
};

1;

El archivo es bastante explicativo por sí mismo, cabe destacar que es posible tener más de un repositorio al que enviar (de ahí la opción $default_host) y que podemos conectarnos con la cuenta que queramos (el parámetro login) y usar varios métodos de envío (hemos elegido scpb).

Respecto al uso, lo cómodo a mi entender es que, una vez terminada la creación del paquete, verifiquemos su contenido y lo despachemos en una secuencia similar a ésta:

  1. Construimos el paquete mediante

    $ debuild -rfakeroot -uc -us
    

    Asumiendo que tengamos la infraestructura creada como es preceptivo y sabiendo que estamos indicándolo que no firme nada.

  2. Verificamos su contenido y leemos los resultados y cambiamos cosas hasta conseguir un paquete satisfactorio

    $ lintian dhis-dns9-engine_0.06-2_amd64.changes
    
  3. Envíamos al repositorio con el programa debrelease, el cual toma por defecto el método dupload para enviar:

    $ debrelease -t taquiones
    Uploading (scpb) to taquiones.net:/var/virtual/www/files/debian/incoming
    [ job dhis-dns9-engine_0.06-1_amd64 from dhis-dns9-engine_0.06-1_amd64.changes
    announce (dhis-dns9-engine_0.06-1_amd64.changes) to victor@taquiones.net will be sent
    dhis-dns9-engine_0.06-1_all.deb, md5sum ok
    dhis-dns9-engine_0.06-1.dsc, md5sum ok
    dhis-dns9-engine_0.06-1.tar.gz, md5sum ok
    dhis-dns9-engine_0.06-1_amd64.changes ok ]
    Uploading (scp) to taquiones (taquiones.net)
    [ Uploading job dhis-dns9-engine_0.06-1_amd64
    dhis-dns9-engine_0.06-1_all.deb 17.7 kB, ok
    dhis-dns9-engine_0.06-1.dsc 0.3 kB, ok
    dhis-dns9-engine_0.06-1.tar.gz 25.9 kB, ok
    dhis-dns9-engine_0.06-1_amd64.changes 0.8 kB, ok
    dhis-dns9-engine_0.06-1_all.deb                              100%   18KB  17.7KB/s   00:00
    dhis-dns9-engine_0.06-1.dsc                                  100%  284     0.3KB/s   00:00
    dhis-dns9-engine_0.06-1.tar.gz                               100%   26KB  25.9KB/s   00:00
    dhis-dns9-engine_0.06-1_amd64.changes                        100%  867     0.9KB/s   00:00
    announcing to  victor@taquiones.net
    , ok ]
    

    Lo anterior es un ejemplo tomado del envío de un paquete real que tuve que construir y cuya historia no viene al caso.

A los pocos minutos de haber enviado el paquete, si todo ha ido bien, tendremos los siguientes archivos en el repositorio:

$ pwd
/var/virtual/www/files/debian/pool/main/d/dhis-dns9-engine
$ ls -ltra
-rw-r--r--  1 debpool debpool 18156 Oct 16 10:50 dhis-dns9-engine_0.06-1_all.deb
-rw-r--r--  1 debpool debpool 26512 Oct 16 10:50 dhis-dns9-engine_0.06-1.tar.gz
-rw-r--r--  1 debpool debpool   284 Oct 16 10:50 dhis-dns9-engine_0.06-1.dsc
drwxr-xr-x  3 debpool debpool  4096 Oct 16 10:50 ..
-rw-r--r--  1 debpool debpool   423 Oct 16 10:50 dhis-dns9-engine_0.06-1.source
-rw-r--r--  1 debpool debpool   803 Oct 16 10:50 dhis-dns9-engine_0.06-1.package
drwxr-xr-x  2 debpool debpool  4096 Oct 16 10:50 .

estas líneas en el archivo de registro de eventos:

2006-10-16 10:45:02 [GENERAL/DEBUG] Starting processing run
2006-10-16 10:45:09 [GENERAL/DEBUG] Exiting.
2006-10-16 10:50:02 [GENERAL/DEBUG] Starting processing run
2006-10-16 10:50:02 [GENERAL/INFO] Processing changefile 'dhis-dns9-engine_0.06-1_amd64.changes'
2006-10-16 10:50:03 [INSTALL/INFO] Installed dhis-dns9-engine (0.06-1) to distribution(s): sid
2006-10-16 10:50:06 [GENERAL/DEBUG] Exiting.
2006-10-16 10:55:02 [GENERAL/DEBUG] Starting processing run
2006-10-16 10:55:06 [GENERAL/DEBUG] Exiting.
2006-10-16 11:00:02 [GENERAL/DEBUG] Starting processing run
2006-10-16 11:00:14 [GENERAL/DEBUG] Exiting.

y deberíamos haber recibido un correo electrónico notificándonos la nueva entrada en el repositorio.

En el lado cliente: usarlo con apt

Dado que hemos creado un repositorio Debian completo, las líneas que debemos incluir en el archivo /etc/apt/sources.list son:

deb http://taquiones.net/files/debian/ main contrib non-free
deb-src http://taquiones.net/files/debian/ main contrib non-free