Rsyncreposcript1

Tu propio repositorio de Debian GNU/Linux

En casa tengo 5 máquinas con Debian GNU/Linux, Los dos servidores de series y películas, el router, el que utilizo como monitor, servidor de DC, etc, y el portátil. He decidido tener un repositorio de Debian local para que las actualizaciones e instalaciones sean más rápidas y eficientes. Para hacer eso he buscado por Internet cual es el mejor sistema, y después de probar varios os resumo el mejor sistema a mi juicio.

Lo primero es descargar este archivo de la web oficial de Bebian. Lo pego debajo para seguirlo mejor.

——————————————————–

#! /bin/sh
set -e

  1. This script originates from http://www.debian.org/mirror/anonftpsync
  1. CVS: cvs.debian.org:/cvs/webwml – webwml/english/mirror/anonftpsync
  2. Version: $Id: anonftpsync,v 1.43 2008-06-15 18:16:04 spaillar Exp $
  1. Note: You MUST have rsync 2.6.4 or newer, which is available in sarge
  2. and all newer Debian releases, or at http://rsync.samba.org/
  1. Don’t forget:
  2. chmod u+x anonftpsync
  1. Set the variables below to fit your site. You can then use cron to have
  2. this script run daily to automatically update your copy of the archive.
  1. TO is the destination for the base of the Debian mirror directory
  2. (the dir that holds dists/ and ls-lR).
  3. (mandatory)

TO=/media/debian/

  1. RSYNC_HOST is the site you have chosen from the mirrors file.
  2. (http://www.debian.org/mirror/list-full)
  3. (mandatory)

RSYNC_HOST=ftp.es.debian.org

  1. RSYNC_DIR is the directory given in the “Packages over rsync:” line of
  2. the mirrors file for the site you have chosen to mirror.
  3. (mandatory)

RSYNC_DIR=debian/

  1. LOGDIR is the directory where the logs will be written to
  2. (mandatory)

LOGDIR=/media/debian/log

  1. ARCH_EXCLUDE can be used to exclude a complete architecture from
  2. mirrorring. Please use as space seperated list.
  3. Possible values are:
  4. alpha, amd64, arm, armel, hppa, hurd-i386, i386, ia64, m68k, mipsel, mips, powerpc, s390, sh and sparc

#

  1. There is one special value: source
  2. This is not an architecture but will exclude all source code in /pool

#

  1. eg.
  2. ARCH_EXCLUDE=”alpha arm armel hppa hurd-i386 ia64 m68k mipsel mips s390 sparc”

#

  1. With a blank ARCH_EXCLUDE you will mirror all available architectures
  2. (optional)

ARCH_EXCLUDE=“alpha arm armel hppa hurd-i386 ia64 m68k mipsel mips s390 sparc”

  1. EXCLUDE is a list of parameters listing patterns that rsync will exclude, in
  2. addition to the architectures excluded by ARCH_EXCLUDE.

#

  1. Use ARCH_EXCLUDE to exclude specific architectures or all sources

#

  1. –exclude stable, testing, unstable options DON’T remove the packages of
  2. the given distribution. If you want do so, use debmirror instead.

#

  1. The following example would exclude mostly everything:

#EXCLUDE=”# –exclude stable/ –exclude testing/ –exclude unstable/ # –exclude source/ # –exclude *.orig.tar.gz –exclude *.diff.gz –exclude *.dsc # –exclude /contrib/ –exclude /non-free/ # ”

  1. With a blank EXCLUDE you will mirror the entire archive, except the
  2. architectures excluded by ARCH_EXCLUDE.
  3. (optional)

EXCLUDE=

  1. MAILTO is the address to send logfiles to;
  2. if it is not defined, no mail will be sent
  3. (optional)

MAILTO=

  1. LOCK_TIMEOUT is a timeout in minutes. Defaults to 360 (6 hours).
  2. This program creates a lock to ensure that only one copy
  3. of it is mirroring any one archive at any one time.
  4. Locks held for longer than the timeout are broken, unless
  5. a running rsync process appears to be connected to $RSYNC_HOST.

LOCK_TIMEOUT=360

  1. You may establish the connection via a web proxy by setting the environment
  2. variable RSYNC_PROXY to a hostname:port pair pointing to your web proxy. Note
  3. that your web proxy’s configuration must support proxy connections to port 873.

#

  1. RSYNC_PROXY=”IP:PORT”
  2. export RSYNC_PROXY=$RSYNC_PROXY
  1. There should be no need to edit anything below this point, unless there
  2. are problems.

#—————————————————————————–#

  1. If you are accessing a rsync server/module which is password-protected,
  2. uncomment the following lines (and edit the other file).
  1. . ftpsync.conf
  2. export RSYNC_PASSWORD
  3. RSYNC_HOST=$RSYNC_USER@$RSYNC_HOST

#—————————————————————————–#

  1. Check for some environment variables

if [ -z "$TO" ] || [ -z "$RSYNC_HOST" ] || [ -z "$RSYNC_DIR" ] || [ -z "$LOGDIR" ]; then
echo “One of the following variables seems to be empty:”
echo “TO, RSYNC_HOST, RSYNC_DIR or LOGDIR”
exit 2
fi

  1. Note: on some non-Debian systems, hostname doesn’t accept -f option.
  2. If that’s the case on your system, make sure hostname prints the full
  3. hostname, and remove the -f option. If there’s no hostname command,
  4. explicitly replace `hostname -f` with the hostname.

HOSTNAME=`hostname -f`

  1. The hostname must match the “Site” field written in the list of mirrors.
  2. If hostname doesn’t returns the correct value, fill and uncomment below
  3. HOSTNAME=mirror.domain.tld

LOCK=”${TO}/Archive-Update-in-Progress-${HOSTNAME}”

  1. The temp directory used by rsync –delay-updates is not
  2. world-readable remotely. It must be excluded to avoid errors.

TMP_EXCLUDE=”–exclude .~tmp~/”

  1. Exclude architectures defined in $ARCH_EXCLUDE

for ARCH in $ARCH_EXCLUDE; do
EXCLUDE=$EXCLUDE”–exclude binary-$ARCH/ –exclude disks-$ARCH/ –exclude installer-$ARCH/ –exclude Contents-$ARCH.gz –exclude Contents-$ARCH.diff/ –exclude arch-$ARCH.files –exclude arch-$ARCH.list.gz –exclude *_$ARCH.deb –exclude *_$ARCH.udeb ”
if [ "$ARCH" = "source" ]; then
SOURCE_EXCLUDE=”–exclude source/ –exclude *.tar.gz –exclude *.diff.gz –exclude *.dsc ”
fi
done

  1. Logfile

LOGFILE=$LOGDIR/debian-mirror.log

  1. optionally, use the rsync module name in the log file name:
  2. LOGFILE=$LOGDIR/$(echo $RSYNC_DIR | tr / _)-mirror.log
  3. LOGFILE=$LOGDIR/${RSYNC_DIR/\//_}-mirror.log
  1. Get in the right directory and set the umask to be group writable

#
cd $HOME
umask 002

  1. If we are running mirror script for the first time, create the
  2. destination directory and the trace directory underneath it

if [ ! -d "${TO}/project/trace/" ]; then
mkdir -p ${TO}/project/trace
fi

  1. Check to see if another sync is in progress

if [ -f "$LOCK" ]; then

  1. Note: this requires the findutils find; for other finds, adjust as necessary

if [ "`find $LOCK -maxdepth 1 -cmin -$LOCK_TIMEOUT`" = "" ]; then

  1. Note: this requires the procps ps; for other ps’, adjust as necessary

if ps ax | grep ‘[r]’sync | grep -q $RSYNC_HOST; then
echo “stale lock found, but a rsync is still running, aiee!”
exit 1
else
echo “stale lock found (not accessed in the last $LOCK_TIMEOUT minutes), forcing update!”
rm -f $LOCK
fi
else
echo “current lock file exists, unable to start rsync!”
exit 1
fi
fi

touch $LOCK

  1. Note: on some non-Debian systems, trap doesn’t accept “exit” as signal
  2. specification. If that’s the case on your system, try using “0″.

trap “rm -f $LOCK” exit

set +e

  1. First sync /pool

rsync –recursive –links –hard-links –times –verbose –timeout=3600 $TMP_EXCLUDE $EXCLUDE $SOURCE_EXCLUDE $RSYNC_HOST::$RSYNC_DIR/pool/ $TO/pool/ » $LOGFILE 2>&1
result=$?

if [ "$result" = 0 ]; then

  1. Now sync the remaining stuff

rsync –recursive –links –hard-links –times –verbose –delay-updates –delete-after –timeout=3600 –exclude “Archive-Update-in-Progress-${HOSTNAME}” –exclude “project/trace/${HOSTNAME}” $TMP_EXCLUDE $EXCLUDE $SOURCE_EXCLUDE $RSYNC_HOST::$RSYNC_DIR/ $TO » $LOGFILE 2>&1

LANG=C date -u > “${TO}/project/trace/${HOSTNAME}”
else
echo “ERROR: Help, something weird happened” | tee -a $LOGFILE
echo “mirroring /pool exited with exitcode” $result | tee -a $LOGFILE
fi

if [ -n "$MAILTO" ]; then

mail -s “debian archive synced” $MAILTO < $LOGFILE

fi

savelog $LOGFILE >/dev/null

rm $LOCK

——————————————————–

Si qureis podeis copiar y pegar directamente en vuestra instalación.

* Cabia esto por el directrio donde quieras dejar la copia del repositiorio.
* Cambia esto por el repositio desde el que quieras sicronizar. Puedes dejar el que yo he puesto si estás en españa. Tienes la lista completa aquí.
* Cambia esto por el directorio donde quieras dejar el log de la instalación, te servira también para ver como va la sincronización.
* Arquitecturas que quieres excluir de la sincronización, en mi caso todas excepto i386, AMD64 y PowerPC. Más arriba están todas las arquitecturas, para que puedas copiar y pegar las que quieras evitar.

Bien, entonces copiamos el texto anterior entre los separadores de guiones, cambiamos los datos para adecuarlos a nuestra instalación y… ¿habra que probarlo no?.

Para esto teneos que darle permisos de ejecución con ‘chmod u+x anonftpsync’ como pone en el propio archivo, y después simplemente lo ejecutamos con ‘./anonftpsync’ si es que estamos en la misma carpeta del archivo. Esto hará que el proceso comience si todo está bien, pero dejará la actual sesión esperando a que el proceso termine, y este puede tardar varios días, así que si lo pefieres puedes ejecutarlo así: ‘./anonftpsync &’ para ejecutarlo en segundo plano.

Ahora que el proceso ya ha comenzado, tendrás curiosidad en saber como va ¿no?, pues esto lo hacemos así: ‘tail -f /media/debian/log/debian-mirror.log’.

Debes tener en cuenta que los repositiorios pueden ocupar mucho espacio en tu disco, así que tenlo en cuenta. En mi caso alrededor de 140 GB.

Si quereis poner la copia del repositorio en vuestro propio servidor web, yo os recomiendo que instales Cherokee, muy facil de instalar. ‘apt-get install cherpkee’

La carpeta por defecto donde están las paginas publicadas por cherokee es ‘/var/www’, en mi caso para poner ahi el repositioorio lo hago con ‘ln -s /media/debian /var/www/debian’. Con esto hacemos un enlace simbolico desde la ubicación fisica del repositorio hasta la carpeta publica del servidor web.

Ya solo falta que cambiemos la dirección de los repositorios de los PCs que queremos que se actualicen desde nuestro repositorio interno. Para hacer esto editamos el fichero /etc/apt/sources.list de esas máquinas y sustituimos las lineas que tenga con la dirección de nuestro repositorio local, os pongo un ejemplo.

Línea original: ‘deb http://ftp.es.debian.org/debian/ lenny main’

Línea modificada: ‘deb http://192.168.0.77/debian/ lenny main’

Ahora solo falta programar de forma automática la actualizxación del repositorio. Para hacerlo simplemente lo añadimos a las tareas del cron, que es el respomnsable en GNU/Linux de ejecutar procesos temporizados.

nano /etc/crontab

y añadimos algo así como esto:

00 1 * * * root /media/anonftpsync &

Todos los domingos días a la 1 en punto de la madrugada….

Posted by admin on Martes, Julio 1st, 2008 at 22:28.
4 Responses to “Tu propio repositorio de Debian GNU/Linux”

tal cual esta la linea del cron se lanza el script todos los dias a la 1 de la madrugada, para que se lance todos los domingos a la 1 la linea deberia ser

00 1 * * 0 root /media/anonftpsync &
tambien sirve
00 1 * * 7 root /media/anonftpsync &
ya que cron interpreta el dia de la semana 0 y 7 como domingo

saludos

Left by riptide on Julio 4th, 2008

Ok corregido muchas gracias

Left by admin on Julio 4th, 2008

Hola amigo muy explícito y claro tu artículo, ahora bien quiero saber si con este proceso tambien voy a tener disponible en mis respositorios los paquetes multimedia. de no ser asi por favor ayudame un poco…

Left by Pedro M Ramirez S on Agosto 15th, 2008

Si como paquetes multimedia usas los libres (cosa que te recomiendo), la respuesta es si, te pongo un ejemplo.

Dentro de estos repositiorios encontraras los paquetes ‘vlc’ perfecto a mi juicio para reproducir video con cualquier codec, incluidos los de alta definición como los .mkv, divx, xvid, etc, en cuanto al audio tambien tienes Amarok, lo mejor de lo mejor en reproductores de audio, ademas de reproducir, te clasifica la musica, busca los albunes, las portadas, las letras de las canciones…. ¡¡lo tienes todo!!

Left by admin on Agosto 15th, 2008

fuente. http://mimemoria.net/2008/07/tu-propio-repositorio-de-debian-gnulinux/

Unless otherwise stated, the content of this page is licensed under GNU Free Documentation License.