Hace 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
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 🙂
Guty: sin dudas que con
rsync
funciona también. No conozco como lo tenes hecho a tu script de rsync, pero conociendorsync
te puedo decir quedebmirror
optimiza la transferencia ya que trabaja de forma muy parecida a cómo haceapt-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.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?
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
Gracias Luis.
En Debian el paquete del programa se llama jigdo-file.
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.
Solución completa la que propones y que yo uso personalmente.
Para otras necesidades podeis echarle un vistazo a apt-cacher, apt-move y apt-proxy.
La información sobre cada uno de ellos en http://www.es.debian.org/distrib/packages y en Google 😉
P.D. Muy bueno el artÃculo Rodolfo
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
Felicitaciones ..y gracias por el aporte…..
Arturo
Chile
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
Hola,
¿Cómo tienes que hacer si solo te interesa hacer mirror de ciertos paquetes y no toda la distro?
Saludos
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.
Amigo ejecuto el script y solo baja los Packages.gz y Sources.gz, no baja los .deb, mi intención es bajar un mirror completico de Sid.
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…
No parece estar buscando un servidor web…. el problema parece estar en la sintaxis de los repositorios en /etc/apt/sources.list
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
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
German, si ya cuentas con los DVD puedes crearte un repositorio, siguiendo este tutorial.
Si no tienes los DVD y debes bajarlo…. pues ya construye tu repositorio, que será más últil para el futuro.
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