Tu propio repositorio de Debian

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.

#!/bin/sh
# Mirrorea debian
#
# Version 1.5 - 06.feb.2006
# 	* Eliminado repositorio non-US
#	* Control de sincronizacion y reintentos
# Version  1.0 - 17.ene.2005
#	* Primer version

# 0 corre en modo consola con feedback a stdout
# 1 corre en modo batch con feedback a /var/log/syslog
SILENT=0

# Cantidad de reintentos en sincronizar antes de abortar
REINTENTOS=10

DEBMIRROR=/usr/bin/debmirror

function bajo_mirror {
	if [ $SILENT -eq 1 ]; then
        	/usr/bin/logger "Inicio actualizacion mirror $DISTRO"
		PROGRESO=""
	else
		echo Distro:     $DISTRO
        	echo Section:    $SECTION
        	echo Server:     $HOST
		echo Mirror en:  $LOCATION
		PROGRESO="-p -v"
	fi
	BUCLES=1
	run_debmirror
	if [ $SILENT -eq 1 ]; then
		/usr/bin/logger "Final actualizacion mirror $DISTRO"
	else
		echo "========================================================================================"
	fi
}

function run_debmirror {
	if [ $BUCLES -gt $REINTENTOS ]; then return; fi
	# TEST="--dry-run"
	$DEBMIRROR $TEST $PROGRESO -h $HOST -d $DISTRO $REPOSIT --nosource -s $SECTION $LOCATION
	if [ $? -ne 0 ]; then
		if [ $SILENT -eq 1 ]; then
			/usr/bin/logger "Error al sincronizar repositorio, intento $BUCLES"
		else
			echo "Error al sincronizar repositorio, intento $BUCLES"
		fi
		BUCLES=$(($BUCLES+1))
		run_debmirror
	fi
}

#DISTRO=sid,sarge
DISTRO=sid
SECTION=main,contrib,non-free,main/debian-installer
LOCATION=/mirror/debmirror
HOST=ftp.us.debian.org
bajo_mirror

# Para hacer una replica de otro repositorio, agregar bloques como el siguiente
#
#DISTRO=sid/non-US
#SECTION=main,contrib,non-free
#LOCATION=/mirror/debmirror_non-US
#HOST=non-us.debian.org
#REPOSIT="-r /debian-non-US"
# bajo_mirror

exit 0

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

0 comentarios en «Tu propio repositorio de Debian»

  • Grande Rodolfo!!!!!!
    Muchas gracias.
    Ahora en marzo cuando arme nuevamente el aula me voy a tener que dar una vuelta por Montevideo con un disco duro para traerme esos 12 gigas y ademas venirme como socio del uylug 😉

  • Acá en mi trabajo, y por sugerencia de un amigo tuyo (Federico Heinz), tenemos un mirror debian también.
    Eso sí, nosotros lo hicimos un poco menos laburado y usamos rsync que por el momento va joya.
    Voy a probar tu alternativa para alguna lanparty 🙂

  • Rodolfo Pilas dice:

    Guty: sin dudas que con rsync funciona también. No conozco como lo tenes hecho a tu script de rsync, pero conociendo rsync te puedo decir que debmirror optimiza la transferencia ya que trabaja de forma muy parecida a cómo hace apt-get para actualizar tu Debian.

    En definitiva, debmirror primero baja el Release y si existe algo nuevo recién allí baja los Packages con la descripción de paquetes, y a partir del éstos fijarse qué archivos estan obsoletos (los borra) y qué debe ser descargado para dejar todo funcionando.

    Con rsync revisas el 100% de los archivos en el origen y el 100% de los archivos en el destino, para luego hacer la réplica de las diferencias.

  • luis mariño dice:

    rodolfo:
    podes usar apt-spy para elegir el HOST

    y seria bueno tener una variable para indicar el protocolo (ej. –method=http )
    pues no todos los HOST soportan ftp

    antes lo mantenia con rsync
    pero cada tanto tenia que agregar exclusiones para nuevas ramas

    –exclude ‘Contents-*.gz’
    –exclude binary-hurd-i386/ –exclude «*_hurd-i386.deb»
    –exclude disks-hurd-i386/ –exclude installer-hurd-i386/
    –exclude binary-ia64/ –exclude «*_ia64.deb»
    –exclude disks-ia64/ –exclude installer-ia64/

  • Rodolfo: eso que rsync chequea el total de paquetes cada vez , no lo sabía. Vamos a ver si cambiamos el método del mirror.
    Y lo que dice Luis Mariño es verdad, cada tanto hay que agregar lineas a la variable EXCLUDE para quitar ramas que no me sirven.

  • Ahora, supongan que quiero usar todos los paquetes que contiene ese mirror para crear un set de CDs de instalación, ¿qué programa podría usar?

  • luis mariño dice:

    podes utilizar Jigsaw Download

    ejemplo para sarge unofficial

    $ jigdo-lite ftp://ftp.fsn.hu/pub/CDROM-Images/debian-unofficial/sarge/jigdo/sarge-i386-1.jigdo

    baja el .template si no lo bajastes
    y te pide donde tenes los .deb y demas ej: /cdrom , el mirror o un directorio
    crea una indice de lo que tenes
    lo que no encuentra lo baja de internet del pool de http://ftp.fsn.hu o de otro
    al final verifica el md5sum del iso

    es interactivo no podes pasarle todo por parametros

    Luis

  • Estoy trabajando con rsync para la sincronización de archivos de clientes a un servidor central y programo la sincronización para que se ejecute cada noche. Mi preocupación es no conocer, para todos los clientes, como se ejecutaron los rsync. Si alguien conoce alguna interfaz gráfica para windows o como interpretar los logs que se generaron, agradeceria el favor. Desde ya gracias.

  • Hola, actualmente tengo todas las imágenes .iso, Me gustaría saber como puedo aprovechar dichas imàgenes para hacer el mirror, sin tocar los iso ni extraer los paquetes. Muchas gracias

  • ronald Villalobos dice:

    Hola arturo, soy administrador de 15 centros de computacion y en cada centro quiero hacer un repositorio de debian en cada servidor, esto debido a que tengo los 15 cd de una de las distribuciones de debian. y andar con estos cd de centro en centro aveces resulta algo engorroso. que debo hacer? ley tu articulo pero esto hace cuando se va a bajar todo el repositorio.. mi pregunta es si yo tengo el repositorio en cd, al crear una carpeta en el servidor, grabar los 15 cd alli y apuntar a esa carpeta desde las estaciones d etrabajo al momento de configurar apt esata funciona?
    de antemano.. GRACIAS!

  • Gracias por la información, pero mi «problemilla» es grave..

    Una vez que estaba ya descargando los ficheros, me di cuenta que se estaban bajando en un directorio equivocado, por lo que maté el proceso y eliminé los archivos descargados…. cuando volvía a ejecutar debmirror…. seguía descargando desde el último paquete que no había descargado……

    Como podría hacer para que volviese a descargar desde 0%

    Muchas gracias !!!!

  • Hola, anduvo todo bien con el script. Ya tengo mi propio repositorio.
    Le agregué la posibilidad de elegir el método HTTP, y de configurar un Proxy. Medio artesanalmente, pero anda.

    Copio acá abajo:

    _______________________________________________________________________

    #!/bin/sh
    # Mirrorea debian
    #
    # Version 1.6 – 11.May:2006 – flazcano@rosario.gov.ar
    # * Agregado el soporte para Proxy
    # * Agregado el soporte para distintos metodos ademas de ftp
    # Version 1.5 – 06.feb.2006
    # * Eliminado repositorio non-US
    # * Control de sincronizacion y reintentos
    # Versión 1.0 – 17.ene.2005

    # 0 corre en modo consola con feedback a stdout
    # 1 corre en modo batch con feedback a /var/log/syslog
    SILENT=0

    # Cantidad de reintentos en sincronizar antes de abortar
    REINTENTOS=10

    DEBMIRROR=/usr/bin/debmirror

    PROXY=»–proxy=http://proxy.pm.rosario.gov.ar:3128/»
    METHOD=»–method=http»

    function bajo_mirror {
    if [ $SILENT -eq 1 ]; then
    /usr/bin/logger «Inicio actualizacion mirror $DISTRO»
    PROGRESO=»»
    else
    echo Distro: $DISTRO
    echo Section: $SECTION
    echo Server: $HOST
    echo Mirror en: $LOCATION
    PROGRESO=»-p -v»
    fi
    BUCLES=1
    run_debmirror
    if [ $SILENT -eq 1 ]; then
    /usr/bin/logger «Final actualizacion mirror $DISTRO»
    else
    echo «========================================================================================»
    fi
    }

    function run_debmirror {
    if [ $BUCLES -gt $REINTENTOS ]; then return; fi
    #TEST=»–dry-run»
    $DEBMIRROR $TEST $PROGRESO -h $HOST -d $DISTRO $REPOSIT $PROXY $METHOD –nosource -s $SECTION $LOCATION
    if [ $? -ne 0 ]; then
    if [ $SILENT -eq 1 ]; then
    /usr/bin/logger «Error al sincronizar repositorio, intento $BUCLES»
    else
    echo «Error al sincronizar repositorio, intento $BUCLES»
    fi
    BUCLES=$(($BUCLES+1))
    run_debmirror
    fi
    }

    DISTRO=sarge
    SECTION=main,contrib,non-free,main/debian-installer
    LOCATION=/mirror/debmirror
    HOST=ftp.de.debian.org
    bajo_mirror

    exit 0

  • Gracias por el artículo. Muy interesante. Ahora bien, aprovecho para consultarte lo siguiente: si quisiera también hacer un mirror de las actualizaciones de seguridad, ¿cómo debería hacer? Probé con:

    DISTRO=stable/updates,testing/updates
    SECTION=main,contrib,non-free
    LOCATION=/mnt/datos/debmirror_updates
    HOST=security.debian.org
    bajo_mirror

    pero de esa forma falla. Gracias anticipadas!

  • muy lindo ,. me estoy haciendo la recorrida por todo el blog ,.. en realidad estoy probando que anden los botones de los meses anteriores que nadie usa,…tenes un problema cuando pones codigo , si te fijas saltan rectangulos,.. eso creo es del css

  • Lo que puedes hacer, Coward, es tener tus paquetes de interés descargados y los copias a /var/cache/apt/archives/ antes de hacer el apt-get install.

    Por ahi había un documento que explicaba como mantener un «repositorio» con los paquetes y los montaba por nfs en ese directorio.

  • alberkman, pueden ser muchas cosas, desde que no encuentre los directorios, hasta que las firmas (certificados) no estén validados y debidamente instalados en tu sistema.

    Yo me inclino por los certificados digitales de verificación, por lo que te sugiero leas lo que te dice luego de bajar cada repositorio.

    También te sugiero que leas los comentarios que están mas arriba, pues allí hay información de cómo solucionar el tema certificados.

  • Ultima versión chequea archivo /root/.gnupg/trustedkeys.gpg que debe ser creado con las llaves de Debian:

    gpg --no-default-keyring --keyring trustedkeys.gpg --keyserver pgp.mit.edu --recv-keys 6070D3A1

  • Que tal Rodolfo, Feliz navidad y prospero año nuevo. Excelente tu tutoría. Me cree mi propio repositorio con el. Buen trabajo. estoy replicando Debian testing (lenny) 18,1 Gib en total, 3 dias de descarga valen la pena 😉

    Rodolfo te quiero preguntar un problema que tengo al ejecutar «apt-get update»

    Imposible obtener /localhost/~toor/debmirror/dists/testing/Release Unable to find expected entry non-fre/binary-i386/Packages in Meta-index file (malformed Release file?)

    No entiendo por que el Imposible obtener /localhost/~toor/debmirror/dists/testing/Release
    si existe…

    Me puedes dar una ayuda… Ademas de algun consejo para mantener mi replica a tope (usar otro HOST algo)
    Bueno Rodolfo espero que me puedas ayudar. Que estes Muy Bien Suerte!!!Saludos…

  • Rodolfo en el /etc/apt/sources.list lo he colocado asi:

    deb http://localhost/~toor/debmirror/ testing main contrib non-fre

    Debian:/home/toor# apt-get update
    Des:1 http://localhost testing Release.gpg [189B]
    Ign http://localhost testing/main Translation-es
    Ign http://localhost testing/contrib Translation-es
    Ign http://localhost testing/non-fre Translation-es
    Des:2 http://localhost testing Release [68,6kB]
    Ign http://localhost testing/main Packages/DiffIndex
    Ign http://localhost testing/contrib Packages/DiffIndex
    Des:3 http://localhost testing/main Packages [4920kB]
    Des:4 http://localhost testing/contrib Packages [78,5kB]
    Descargados 5067kB en 12s (393kB/s)
    Imposible obtener http://localhost/~toor/debmirror/dists/testing/Release Unable to find expected entry non-fre/binary-i386/Packages in Meta-index file (malformed Release file?)
    Leyendo lista de paquetes… Hecho
    E: Algunos archivos de índice no se han podido descargar, se han ignorado,
    o se ha utilizado unos antiguos en su lugar.

  • Que tal Rodolfo. En el /etc/apt/sources.list lo he colocado de esta manera.

    deb http://localhost/~toor/debmirror/ testing main contrib non-fre

    Esta correcto?

    en el debmirror.sh lo tengo asi

    DISTRO=testing
    SECTION=main,contrib,non-free,main/debian-installer
    LOCATION=/home/toor/public_html/debmirror
    HOST=ftp.us.debian.org
    bajo_mirror

  • Si te fijas arriba te está diciendo que no puede bajar
    Unable to find expected entry non-fre/binary-i386/Packages
    y es porque tienes mal escrito, lo correcto es non-free, que lo debes arreglar en el /etc/apt/sources.list

  • German Cabrera dice:

    Rodolfo, se puede colocar las imagenes de Debian 5 DVD en el disco duro, crear repositorio y luego actualizar los programas con rsync ? te agradezco si puedes ayudarnos como realizar está actividad

  • Hoal buenas ya se que es un tema un poco pasado yo soy principiante en esto y tu scrip me da problemas no se qu e sea y a ver si me puedes ayudar

    si lo corro haci como lo bajo me da error
    : no se encontró la orden
    : no se encontró la orden
    : no se encontró la orden
    : no se encontró la orden
    ‘ebmirror.sh: line 19: error sintáctico cerca del elemento inesperado `{
    ‘ebmirror.sh: line 19: `function bajo_mirror {

    si a las function bajo_mirror { le quito el espacio dejandolo haci

    function bajo_mirror{

    me marca este error

    : no se encontró la orden
    : no se encontró la orden
    : no se encontró la orden
    : no se encontró la orden
    debmirror.sh: line 71: error sintáctico: no se esperaba el final del fichero

    Bueno espero y me puedas ayudar

Dejar una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Puedes usar estas etiquetas y atributos HTML:

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

WordPress Anti-Spam by WP-SpamShield