En el presente artículo voy a describir una forma de construir tu propio
repositorio local de paquetes. La idea es crear CDs `de expansión', es
decir, quemar el CD con los paquetes, ficheros y directorios que
obtengamos para que, con un simple apt-cdrom add los tengamos
disponibles, aunque también podríamos emplear los mismos pasos para
crearnos un repositorio en nuestro disco duro con muy pocas diferencias.
Lo primero que tenemos que conseguir son los propios paquetes que
queremos incluir en el repositorio. De sitios como apt-get.org podemos obtener las URLs
de donde bajarlos. Con un poco de pericia en el uso de wget
podemos obtener dichos paquetes. Por ejemplo:
wget --recursive --level=inf --no-parent --relative --timestamping \
--no-host-directories --cut-dirs=5 --directory-prefix=kde-3.0.5a
--accept *.deb \
ftp://download.us.kde.org/pub/kde/stable/3.0.5a/Debian/woody/
con el comando anterior nos bajamos sólo los .deb de KDE 3.0.5a
desde el directorio indicado, y los guardamos bajo el directorio
kde-3.0.5. He puesto las opciones de wget en formato largo para
que sean comprensibles a simple vista, aunque un vistazo a la página man
no estaría de más. La opción --timestamping nos permite que
interrumpamos la descarga y la lancemos de nuevo sin que se vuelvan a
descargar los ficheros que no hayan variado.
En el ejemplo anterior nos descargábamos los ficheros de un FTP, pero
no es diferente hacerlo desde un repositorio web. Por ejemplo:
wget --recursive --level=inf --no-parent --relative --timestamping \
--no-host-directories --cut-dirs=5 --directory-prefix=gnome2 --accept *.deb \
http://people.debian.org/~kov/debian/dists/woody/gnome2/binary-i386/
En este caso --accept *.deb impide además que nos bajemos los
listados de directorios *.html, que no los necesitamos. Si quisiéramos
bajarnos también los fuentes, añadiríamos las extensiones *.tar.gz,
*.diff.gz y *.dsc. Pero no es necesario bajarse ni los Packages o
Packages.gz ni los Sources o Sources.gz. Esos ficheros los construiremos
nosotros según nuestras necesidades más adelante.
Obsérvese también el uso de --cut-dirs. Esta opción habrá que
ajustarla para evitar los diversos directorios que no nos sirven de
nada. En el segundo caso, despreciamos ~kov/debian/dists/woody/gnome2
(por eso --cut-dirs vale 5) y lo guardamos sólamente en el
subdirectorio gnome2. Esto es así porque luego nosotros construiremos
nuestro árbol de directorios a nuestra medida.
Supongamos que ya hemos bajados todos esos paquetes que deseamos añadir
a nuestro repositorio o CD extra. Puede que sean grandes colecciones de
paquetes, como los de XFree 4, KDE 3 o GNOME 2, o puede que no sean más
que unos cuantos paquetes de actualización. En cualquier caso, antes
de nada deberemos pensar como vamos a almacenarlos. Para ello, lo mejor
es primero darle un vistazo a la organización de directorios que
necesitamos.
Para construir un CD Debian, necesitamos un directorio principal que
generalmente se llama debian/ (yo así lo recomiendo) en el cual
guardaremos todos los ficheros y paquetes necesarios. Dentro de
debian/ creamos el directorio dists y dentro las
distintas ramas de la distribución. En este ejemplo estamos preparando
un CD extra para la versión estable, así que crearemos un directorio
stable/. Y no está de más añadirle un enlace simbólico con
el codename (woody/ en mi caso) que apunte a
stable/.
Dentro del directorio de la distribución concreta (stable en
este ejemplo) es cuando las cosas empiezan a ponerse interesantes. Lo
normal en un CD habitual de Debian es que tengamos en esta profundidad
los directorios main/, contrib/ y non-free.
Pero a nosotros este nivel nos va a servir para dividir los diferentes
grupos de paquetes, de forma que en un futuro podamos prescindir de toda
una parte de ellos y sin embargo poder seguir empleando otras.
Con un ejemplo se entenderá mejor. Si en este CD vamos a guardar la
última versión de GNOME 2, KDE 3 y XFree 4.2, puede suceder que en el
futuro preparemos otro repositorio que tenga versiones superiores de los
mismos. Esto no sería demasiado problema. Sin embargo, sí que podría ser
un problema que quisiéramos utilizar la versión GNOME 2 de este CD, pero
la versión de KDE 3 del siguiente. Si los separamos en este nivel, luego
en el fichero /etc/apt/sources.lists podemos indicarle qué
apartados nos interesan de cada fuente (por ejemplo, de un CD), mientras
que si agrupamos todo en un único apartado, esto no sería posible. Así
que la recomendación es crear un apartado por cada conjunto de paquetes
que pueda estar relacionado, teniendo en cuenta la flexibilidad
anterior.
Dentro de cada apartado tenemos un subdirectorio por arquitectura
(binary-i386/, binary-sparc/, binary-arm/,
...), uno común para todas las arquitecturas (binary-all), por
ejemplo para los paquetes de documentación, y uno para los fuentes
(source/). En mi caso sólo voy a usar paquetes para i386, así
que me limito a crear dentro de cada apartado un directorio
binary-i386, y ahí volcaré todos los *.deb descargados que
corresponden a ese apartado, sin preocuparme de que estuvieran
clasificados en diversos subdirectorios en el origen.
Aun hay otro nivel más de profundidad en los directorios (a estas
alturas un ya está harto). La buena noticia es que no vamos a crear
estos directorios a mano. Dejaremos que la máquina lo haga por nosotros
(eso, que empiece a trabajar un poco). Para ello, movemos primero los
*.deb del apartado dentro del binary-i386 correspondiente y luego
ejecutamos el siguiente script, para el que antes debemos haber
instalado los paquetes grep, textutils (cut) y dpkg-dev
(dpkg-scanpackages):
#!/bin/bash
#
# Organizar en secciones una colección de paquetes .deb
#
dpkg-scanpackages . /dev/null > Packages
FICHEROS=`grep 'Filename: ' Packages | cut -d ' ' -f 2`
SECCIONES=`grep 'Section: ' Packages | cut -d ' ' -f 2`
for FICHERO in $FICHEROS; do
SECCION=`echo $SECCIONES | cut -d ' ' -f 1`
# crear los directorios de seccion
if [ ! -d $SECCION ]; then
mkdir -m 755 -p $SECCION
fi
# mover cada fichero a su seccion
SECCIONES=`echo $SECCIONES | cut -d ' ' -f 2-`
chmod 644 $FICHERO
mv $FICHERO $SECCION
done
rm Packages
Este script crea los directorios correspondientes a cada sección
y mueve cada paquete al dicho directorio. Estas secciones son las
`oficiales' de Debian (admin,base,...). Una advertencia: los paquetes
que corresponde al apartado contrib aparecen aquí dentro de directorios
contrib/seccion/ y lo mismo pasa con los non-free en
non-free/seccion/. En mi caso he decidido no hacer
distinciones entre estas ramas, así que he movido manualmente (suelen
ser pocos) estos paquetes a su sección correspondiente (por ejemplo,
non-free/admin/ a admin/. Otras opciones complicarían
las cosas.
El script de arriba debería modificarse para hacer lo mismo
pero con la tripleta de ficheros fuente paquete.dsc
paquete.orig.tar.gz y paquete.diff.gz
(directorio source/). Además, habría que emplear
dpkg-scansources en vez de dpkg-scanpackages. Se deja
como ejercicio al lector interesado. O:-)
En este punto hemos conseguido crear una estructura que equivale a la
organización de un CD debian, con los paquetes en los directorios
correspondientes. Pero aun nos falta lo más importante: los ficheros
índices de paquetes Packages.gz (y Sources.gz, para los fuentes). Podría
ser un trabajo pesado, pero las herramientas de Debian nos proporcionan
lo necesario para hacerlo de manera sencilla. Nos movemos al directorio
superior de debian (debian/) y lanzamos el siguiente
script que automágicamente nos hará el trabajo sucio:
#!/bin/bash
for x in `find . -type d -name 'binary-*'`; do
cmd="apt-ftparchive packages $x | gzip -9 > $x/Packages.gz"
echo "$cmd"
eval "$cmd"
done
for x in `find . -type d -name 'source'`; do
cmd="apt-ftparchive sources $x | gzip -9 > $x/Sources.gz"
echo "$cmd"
eval "$cmd"
done
El segundo for sólo es necesario en el caso de tener fuentes,
pero tampoco pasa nada si lo ejecutamos no teniéndolos.
Lo último que tenemos que repasar antes de quemar nuestro CD es revisar
los permisos de ficheros y directorios. Unos buenos permisos pueden ser
644 para ficheros y 755 para directorios. Si no damos permisos de
lectura suficientes, nos podemos encontrar con ficheros inaccesibles, y
un CD con problemas. Puesto que me he encontrado con CDs de revistas que
las versiones de Debian de los paquetes tenían todo tipo de problemas,
no os aconsejo que paséis por alto este detalle. Es suficiente:
find debian/ -type f -exec chmod 644 {} ";"
find debian/ -type d -exec chmod 755 {} ";"
por encima del directorio debian/ para tenerlo como queremos.
El último paso es quemar el CD. No es mi objetivo dar una explicación
de cómo quemar CDs, para eso está la CD-Writing HOWTO.
Sólo recomendar que muevas todo debian/ dentro de un directorio
que hará el papel del punto de montaje del CD (por ejemplo
cd/). Además, ahí puedes añadir el resto de cosas que quieras
quemar en el CD, aparte de los paquetes debian, si es que así lo
quieres. Una vez todo listo:
mkisofs -r -o cd_image cd/
debería ser suficiente para crear el fichero cd_image con la
imagen a quemar (fíjate que no sobrepasa la capacidad del CD) y,
usando cdrecord un otra herramienta quemarlo en el medio. ¡Hay Más De
Una Manera De Hacerlo(TM)!, como usar otros programas gráficos que no
necesitan de mkisofs, etc. Esta es simplemente a la hackers'
way, y no es ni mejor ni peor que otras.
Llega el momento de probar el CD (aunque, dicho sea de paso, podrías
haberlo probado antes de quemarlo, te remito nuevamente a la CD-Writing HOWTO). Hacemos un apt-cdrom add e
introducimos el CD. Después de recorrer el CD y leer los
Packages.gz y
Sources.gz existentes, te pedirá un nombre para el CD. Se lo
introduces (por ejemplo Debian GNU/Linux 3.0 Bilo's Golden
Edition) y listo. Si haces un apt-get update ya deberías
tener los paquetes disponibles. Con un apt-get upgrade, te
actualizará aquellos que tengas instalados y haya en los CDs una versión
superior, pidiéndote el CD recién creado para realizar la operación.
¿Impresionante, verdad? ;-)
Ya que estuvimos hablando de ello, no estaría de más echar un vistazo
al fichero /etc/apt/sources.lists. Por ejemplo:
deb cdrom:[Debian 3.0 jcantero-1 Extension]/ debian/dists/stable/gnome2/binary-i386/
deb cdrom:[Debian 3.0 jcantero-1 Extension]/debian/ stable acrobat5 kde-3.0.5a mozilla-1.2.1 multimedia xfree-4.2.1
¡Vaya! parece que sí que ha pillado los diversos apartados del CD,
aunque no perfectamente el de Gnome 2. No obstante, parece que funciona.
Comentando/borrando lo que queramos de estas líneas tendremos un control
más fino de lo que queramos que esté disponible de éste CD en nuestra
instalación Debian.
Por último comentar que el método de organización de paquetes aquí empleado es el tradicional de Debian, y vale para versiones anteriores. Para rizar el rizo, este artículo debería introducirse en el proceloso mundo de los Package Pools. Pero eso... será en otra ocasión (para empezar, porque hay bastante poca información sobre los mismos).
Podéis encontrar más información sobre la construcción de repositorios en: