Wednesday, February 20, 2008

Tu propio repositorio de Debian
17.01.05 | 27 Comentarios

debian mirrorHace ya tiempo que mi amigo Luis Mariño me había hablado de tener una réplica (mirror) de Debian GNU/Linux; de hecho, la Primera Fiesta Debian de Instalación fue hecha utilizando un mirror del propio Luis. Así­ que un día me puse las pilas (aunque parezca redundante ;) ) y armé mi propio repositorio de Debian, a partir del cual actualizo todas mis computadoras (y las computadoras de mis amigos que vienen por casa). El esfuerzo vale la pena, pues hacer


apt-get upgrade
Descargados 3621kB en 5s (716kB/s)

apt-get dist-upgrade
Descargados 14,4MB en 2s (6773kB/s)

en solamente 7 segundos es fantástico.

Unos días atrás, ante una consulta en la lista UYLUG-linux, Christian Huelmo me sugirió documentar cómo hacer un repositorio, así que aquí­ escribo una breve receta para tener un repositorio funcionando, bah, exactamente cómo hago yo para tenerlo funcionando ;)

Version 1.5

Preparando el terreno

Debemos tener al menos un espacio libre de 15 GB. Yo actualmente estoy replicando Sid y en total ocupa 12 GB. En mi script la variable LOCATION define el lugar donde estará el repositorio.

Tenemos que instalar los paquetes:

* gnupg - GNU privacy guard
* debmirror - Debian partial mirror script, with FTP and package pool support

Es necesario informar a su sistema de verificación de firmas dónde encontrar las firmas de los releases de Debian, para ello debe editar el archivo que esta en el home del usuario que mantendrá el mirror y tener las dos líneas que se indican abajo; el archivo es el ~/.gnupg/gpg.conf:

keyserver-options auto-key-retrieve
keyserver keyring.debian.org

Armando y manteniendo la réplica

El siguiente es el script que utilizo para mantener mi réplica, yo lo tengo colocado en /usr/local/bin/, pero puede estar ubicado en el lugar de su preferencia.

1. #!/bin/sh
2. # Mirrorea debian
3. #
4. # Version 1.5 - 06.feb.2006
5. # * Eliminado repositorio non-US
6. # * Control de sincronizacion y reintentos
7. # Version 1.0 - 17.ene.2005
8. # * Primer version
9.
10. # 0 corre en modo consola con feedback a stdout
11. # 1 corre en modo batch con feedback a /var/log/syslog
12. SILENT=0
13.
14. # Cantidad de reintentos en sincronizar antes de abortar
15. REINTENTOS=10
16.
17. DEBMIRROR=/usr/bin/debmirror
18.
19. function bajo_mirror {
20. if [ $SILENT -eq 1 ]; then
21. /usr/bin/logger "Inicio actualizacion mirror $DISTRO"
22. PROGRESO=""
23. else
24. echo Distro: $DISTRO
25. echo Section: $SECTION
26. echo Server: $HOST
27. echo Mirror en: $LOCATION
28. PROGRESO="-p -v"
29. fi
30. BUCLES=1
31. run_debmirror
32. if [ $SILENT -eq 1 ]; then
33. /usr/bin/logger "Final actualizacion mirror $DISTRO"
34. else
35. echo "========================================================================================"
36. fi
37. }
38.
39. function run_debmirror {
40. if [ $BUCLES -gt $REINTENTOS ]; then return; fi
41. # TEST="--dry-run"
42. $DEBMIRROR $TEST $PROGRESO -h $HOST -d $DISTRO $REPOSIT --nosource -s $SECTION $LOCATION
43. if [ $? -ne 0 ]; then
44. if [ $SILENT -eq 1 ]; then
45. /usr/bin/logger "Error al sincronizar repositorio, intento $BUCLES"
46. else
47. echo "Error al sincronizar repositorio, intento $BUCLES"
48. fi
49. BUCLES=$(($BUCLES+1))
50. run_debmirror
51. fi
52. }
53.
54.
55. #DISTRO=sid,sarge
56. DISTRO=sid
57. SECTION=main,contrib,non-free,main/debian-installer
58. LOCATION=/mirror/debmirror
59. HOST=ftp.us.debian.org
60. bajo_mirror
61.
62. # Para hacer una replica de otro repositorio, agregar bloques como el siguiente
63. #
64. #DISTRO=sid/non-US
65. #SECTION=main,contrib,non-free
66. #LOCATION=/mirror/debmirror_non-US
67. #HOST=non-us.debian.org
68. #REPOSIT="-r /debian-non-US"
69. # bajo_mirror
70.
71. exit 0

# Descargar el código de: debmirror.sh

Al ejecutar el script, debmirror se encargaró de crear todos los directiorios que sean necesarios, por lo que no precisa tener ninguna estructura pre-creada.

Recuerde que estamos hablando de descargar de Internet aproximadamente 12 GB de archivos, por lo que puede ser una tarea que insuma varios dias o semanas, dependiendo de su conexión. Si su conexión se corta o la transferencia aborta, simplemente re-inicie el script. (una buena solución es un amigo que le provea de una primera copia del repositorio…. Gracias Luis!)

Al finalizar la réplica, posiblemente algunos paquetes que bajaron hace algunos días han sido cambiados por nuevos, vuelva a correr el script las veces que sean necesarias hasta estar completamente seguro que ya no hay paquetes nuevos para bajar a su repositorio local.

Luego que tenga todo replicado, debemos mantener todo día; para esto yo tengo en el crontab de root la siguiente linea:

1 5 * * * /usr/local/bin/debmirror.sh

De todas formas, si esta solución no le satisface, puede ejecutar el script cada cierto tiempo, pero recuerde que Debian tiene un desarrollo vertiginoso y puede ser que cambien muchos paquetes en poco tiempo, lo que puede obligarle a bajar ~6 GB de cosas nuevas si demora alguna semana en sincronizar réplica.

En principio, si tomó las precauciones previas, todo debería funcionar correctamente, aunque el script tiene variables que pueden requerir ser modificadas para obtener un mejor funcionamiento o adecuación a las necesidades de cada sistema:

* DISTRO - Qué distribución de Debian se va a replicar
* SECTION - Qué secciones dentro de la distribución se van a replicar
* LOCATION - (ya comentada anteriormente) Lugar donde estará guardada la réplica en el sistema local
* HOST - Fuente u origen desde donde se descargará la réplica
* TEST - Permite correr correr el script en modo prueba, es decir, se muestra lo que hará, pero no se hace o modifica nada
* SILENT - Permite correr en modo consola o desatendido, mostrando salida por consola o dejando registro en los logs

Disponibilizando los paquetes en su red

Bien, asumiendo de que todo a funcionado de maravillas y que en estos momentos su ancho de banda está saturado descargando paquetes y armando su repositorio, podemos dedicarnos a otras tareas: la primera de ellas es ofrecer o disponibilizar el repositorio al resto de las máquinas de la red y, por qué no, al mismo servidor donde está haciendo su réplica.

Puede hacerlo por FTP o por http. Yo lo hago por http pues ya tengo Apache instalado y funcionando. En otras palabras, lo primero que deberá tener es Apache funcionando y que las máquinas de su red puedan acceder con Firefox (como? hay alguien que navega con otro software…??) al servidor done está su repositorio. Pero, cómo hacer ésto, es tema de otro documento….

Lo más fácil es colocar dos enlaces simbólicos dentro del DocumentRoot de su servidor web. Yo lo tengo así:

/var/www/debian -> /mirror/debmirror
/var/www/debian-non-US -> /mirror/debmirror_non-US

Para que esto funcione deberá asegurarse que la configuración permita que Apache sirva enlaces simbólicos. Busque la configuración de Directory /var/www y asegúrese de tener habilitado Options FollowSymLinks (esto debería venir deshabilitado por defecto).

Para hacer más flexible la forma en que su repositorio sirve paquetes, sugiero dos enlaces simbólicos llamados testing y unstable que apunten a los directorios de los nombres reales de las distribuciones, asi:

/mirror/debmirror/dists/testing -> /mirror/debmirror/dists/sarge
/mirror/debmirror/dists/unstable -> /mirror/debmirror/dists/sid
/mirror/debmirror_non-US/dists/testing -> /mirror/debmirror_non-US/dists/sarge
/mirror/debmirror_non-US/dists/unstable -> /mirror/debmirror_non-US/dists/sid

esto permitirá que las máquinas de su red puedan acceder tanto por el nombre real de la distribución (sid), como por su categoría (unstable); se puede leer más sobre esto en SigT. Además, haciendo esto, dejará todo preparado para la próxima versión de Debian.

El sources.list de sus sistemas Debian

Bueno, ahora la configuración de cada Debian de la red….. Ponga estos repositorios en el /etc/apt/sources.list:

deb http://SU_SERVER/debian unstable main contrib non-free
deb http://SU_SERVER/debian-non-US unstable/non-US main contrib non-free

y cuando tenga ya todo el repositorio replicado disfrute del apt-get

Notas finales

Este documento tiene por objetivo ser una guía rápida. Si alguno de los conceptos aquí descriptos le son ajenos busque documentación complementaria.

Obviamente, este documento es perfectible. Si tiene alguna sugerencia que permita mejorar cómo yo hago mi repositorio, le agradecerí si la comparte conmigo, colocando un comentario aquí mismo o mediante el formulario de contacto. Me comprometo a publicar aquí mismo su sugerencia.

Histórico:

* Version 1.5 - 25.ago.2005 - Verificacion de firmas en GPG.conf
* Version 1.0 - 17.ene.2005

Popularidad: 29%