Créer un miroir CentOS pour les updates
Et tu sync, et tu sync, et tu wget
Hier, j'ai commencé à me dire que ça serait sympa de rendre encore plus rapide mes installations de machines virtuelles CentOS 5. Donc, avant d'attaquer le trifouillage de mes kickstarts afin d'appliquer mes configurations de manière automatique, j'en suis venu à la conclusion qu'avoir le dépôt des mises à jour en local serait plus rapide que de devoir tout récupérer sur Internet.
Donc, il me faut me synchroniser avec un miroir. Comme je suis chez Free, j'ai voulu utiliser leur miroir. Oui mais, ce n'est qu'un miroir FTP. Et la plupart des scripts de synchronisation de miroir utilisent rsync. Je me suis donc rabattu sur le miroir de l'IPSL Jussieu qui possède un mirroir http, ftp et rsync. Génial ! Quelques instants plus tard, j'adapte ce script qui donne ceci :
#!/bin/bash
#################################################################################
# #
# CentOS mirror syncer #
# Comes from : #
# #
# http://lists.centos.org/pipermail/centos-mirror/2005-April/000936.html #
# http://wiki.monserveurperso.com/wakka.php?wiki=MirroringFTP #
# man wget #
# #
#################################################################################
RSYNC=`which rsync`
RSYNC_OPTS="-aHv --delete --bwlimit=512 "
CHOWN=`which chown`
CHMOD=`which chmod`
MIRROR="rsync://distrib-coffee.ipsl.jussieu.fr/pub/linux/centos/5/updates/i386/"
LOCAL="/home/ftp/mirrors/centos/5/updates/i386/"
PIDFILE="/var/run/centosmirror.pid"
# Don't run it twice...
if [ -f "$PIDFILE" ]; then
RUNPID=`cat $PIDFILE`
if ps -p $RUNPID; then
echo "CentOS Mirror is already running..."
exit 1
else
echo "CentOS Mirror pid found but process dead, cleaning up"
rm -f $PIDFILE
fi
else
echo "No CentOS Mirror Process Detected"
fi
echo $$ > $PIDFILE
echo -n "CentOS Mirror Started at "
date
# Download, set up rights
$RSYNC $RSYNC_OPTS $MIRROR $LOCAL
$CHOWN -R apache:apache $LOCAL
$CHMOD -R 755 $LOCAL
echo -n "CentOS Mirror Ended at "
date
rm -f $PIDFILE
Ca, c'était la version rsync. Et si on est derrière un proxy, et qu'on ne peut pas faire du rsync? Pour le moment je me suis concentré sur ftp, mais ce script devrait tourner pour http :
#!/bin/bash
#################################################################################
# #
# CentOS mirror syncer #
# Comes from : #
# #
# http://lists.centos.org/pipermail/centos-mirror/2005-April/000936.html #
# http://wiki.monserveurperso.com/wakka.php?wiki=MirroringFTP #
# man wget #
# #
#################################################################################
# Variables
WGET=`which wget`
WGET_OPTS="-m --limit-rate=512k -nH --cut-dir 5"
CHOWN=`which chown`
CHMOD=`which chmod`
MIRROR="ftp://ftp.free.fr/mirrors/ftp.centos.org/5/updates/i386/*"
LOCAL="/home/ftp/mirrors/centos/5/updates/i386/"
PIDFILE="/var/run/centosmirror.pid"
# Don't run it twice...
if [ -f "$PIDFILE" ]; then
RUNPID=`cat $PIDFILE`
if ps -p $RUNPID; then
echo "CentOS Mirror is already running..."
exit 1
else
echo "CentOS Mirror pid found but process dead, cleaning up"
rm -f $PIDFILE
fi
else
echo "No CentOS Mirror Process Detected"
fi
echo $$ > $PIDFILE
# wget + ftp = .listing files
find $LOCAL -name ".listing" -delete
echo -n "CentOS Mirror Started at "
date
# Download, set up rights
$WGET $WGET_OPTS $MIRROR -P $LOCAL
$CHOWN -R apache:apache $LOCAL
$CHMOD -R 755 $LOCAL
echo -n "CentOS Mirror Ended at "
date
rm -f $PIDFILE
find $LOCAL -name ".listing" -delete
On remarquera que c'est grosso modo la même chose, la version wget générant des fichiers .listing pour le téléchargement récursif, je les efface avant et après coup, au cas où.Comme mon miroir est aussi dispo en http, je rend le tout accessible pour l'utilisateur apache. Ce dernier script reste cependant à améliorer, car contrairement à rsync, il n'efface pas les fichiers présents en local mais disparus du miroir distant.