Le paquet ubumirror est un ensemble de scripts permettant de créer et maintenir à jour un miroir de la distribution Ubuntu. A la différence de l'outil apt-mirror utilisant wget, celui-ci réalise la synchronisation sur la base de l'outil rsync offrant de meilleurs performances. Ce paquet apporte une solution supportée par la communauté Ubuntu pour le maintient des miroirs synchronisés et uniformisés. Celui-ci a été introduit dans la distribution avec la release de Lucid 10.04 LTS.
Pour créer et maintenir un miroir à jour et fonctionnel, il est recommandé de suivre ces indications :
Il suffit d'installer le paquet ubumirror.
Ce paquet comprend 5 (4 avant Ubuntu 16.04 LTS) scripts shell pour les synchronisations et un unique fichier de configuration.
Le script /usr/bin/ubuarchive va synchroniser l'ensemble des paquets de la distribution pour les architectures officiellement supportées (i386, amd64, powerpc et sparc jusqu'à 6.10). Cette synchronisation se fait en deux temps. Premièrement, on synchronise pool contenant l'ensemble des paquets (.dsc, .diff.gz, .tar.gz et .deb), ainsi que project. Deuxièmement, on synchronise indices et dists. Ces deux synchronisations se font avec l'option --delete-after qui assure de supprimer les paquets qui ont disparu le plus tard possible (après la copie de tous les nouveaux fichiers). Ceci est important car les outils de gestion de paquets (tel que APT) se basent sur la seconde partie (indices et dists) pour déterminer quels sont les paquets disponibles sur le dépôt. L'absence de paquets dans le pool alors qu'ils seraient référencés dans indices et dists générera des erreurs chez l'utilisateur du dépôt.
Le script /usr/bin/uburelease va synchroniser l'ensemble des images officielles (iso, img) nécessaires pour réaliser l'installation d'une machine sous Ubuntu ou sous une distribution fille officiellement supportée (Edubuntu et Kubuntu). Cette synchronisation se fait en un temps avec l'option --delete-after.
Le script /usr/bin/ubucdimage va synchroniser l'ensemble des images (iso, img) nécessaires, quotidiennement mises à jour, pour réaliser l'installation d'une machine sous Ubuntu et les distributions filles officiellement supportées (Edubuntu et Kubuntu). Cette synchronisation se fait en un temps avec l'option --delete-after. Vu son caractère évolutif quotidien, cette synchronisation, en fonction de la variable UBUCDI_FLAVOUR expliquée ci-dessous, générera beaucoup de trafic.
A l'image du script ubuarchive, celui-ci va synchroniser l'ensemble des paquets de la distribution pour les architectures non-officiellement supportées (armel, hppa, ia64, lpia, powerpc, sparc)
Ce script va synchroniser les images officielles développées par Ubuntu pour être exécutées sur les clouds publics certifiés Ubuntu
Le fichier /etc/ubumirror.conf est bien documenté en soi. En voici une traduction personnelle:
# Adresse e-mail utilisée pour avertir l'administrateur du miroir EMAIL=root@localhost # Le FQDN du serveur HOSTNAME=$(hostname -f) # Limite de bande passante utilisée pour tous les scripts (0 signifie sans limite) # La valeur est exprimée en Ko par seconde SPEED=0 # Timeout pour chaque script - 600 secondes par défaut IO_TIMEOUT=600 # UBUARC_DIR est la destination pour la base du répertoire archive # Le script ubuarchive ne s'exécutera pas si cette variable n'est pas définie #UBUARC_DIR="/srv/mirror/ubuntu" # UBUCDI_DIR est la destination pour la base du répertoire cdimage # Le script ubucdimage ne s'exécutera pas si cette variable n'est pas définie #UBUCDI_DIR="/srv/mirror/ubuntu-cdimage" # UBUREL_DIR est la destination pour la base du répertoire releases # Le script uburelease ne s'exécutera pas si cette variable n'est pas définie #UBUREL_DIR="/srv/mirror/ubuntu-releases" # UBUPOR_DIR est la destination pour la base du répertoire ports # Le script ubuports ne s'exécutera pas si cette variable n'est pas définie #UBUPOR_DIR="/srv/mirror/ubuntu-ports" # UBUCLOUD_DIR est la destination pour la base du répertoire des images cloud # Le script ubucloudimage ne s'exécutera pas si cette variable n'est pas définie #UBUCLOUD_DIR="/srv/mirror/ubuntu-ports" # LOGDIR est le répertoire où seront enregistrés tous les logs (journaux) LOGDIR="/var/log/ubumirror/" # UBUxxx_MIRROR est la destination rsync (au format hôte::répertoire/) sur le mirroir # de référence à partir duquel sera fait la synchronisation par les scripts d'ubumirror UBUARC_MIRROR=rsync://rsync.archive.ubuntu.com/ubuntu UBUCDI_MIRROR=rsync://rsync.cdimage.ubuntu.com/cdimage UBUREL_MIRROR=rsync://rsync.releases.ubuntu.com/releases UBUPOR_MIRROR=rsync://rsync.ports.ubuntu.com/ubuntu-ports UBUCLOUD_MIRROR=rsync://rsync.cloud-images.ubuntu.com/cloud-images # UBUxxx_EXCLUDE est une liste d'exclusions à appliquer lors la synchronisation UBUARC_EXCLUDE="\ # --exclude binary-powerpc/ --exclude binary-sparc/ \ # --exclude daily-installer-powerpc/ --exclude daily-installer-sparc/ \ # --exclude installer-powerpc/ --exclude installer-sparc/ \ # --exclude *_powerpc.deb --exclude *_powerpc.udeb \ # --exclude *_sparc.deb --exclude *_sparc.udeb \ # --exclude Contents-powerpc.gz --exclude Contents-sparc.gz \ " UBUCDI_EXCLUDE="\ # --exclude *-powerpc.* --exclude *-sparc.* \ # --exclude source/ \ " UBUREL_EXCLUDE="\ # --exclude *-powerpc.* --exclude *-sparc.* \ " UBUPOR_EXCLUDE="\ # --exclude binary-powerpc/ --exclude binary-sparc/ \ # --exclude daily-installer-powerpc/ --exclude daily-installer-sparc/ \ # --exclude installer-powerpc/ --exclude installer-sparc/ \ # --exclude *_powerpc.deb --exclude *_powerpc.udeb \ # --exclude *_sparc.deb --exclude *_sparc.udeb \ # --exclude Contents-powerpc.gz --exclude Contents-sparc.gz \ " UBUCLOUD_EXCLUDE=""
Ce fichier de configuration doit être adapté à vos besoins.
Par sécurité, il est recommandé de synchroniser son miroir à partir d'un compte avec des droits restreints. Pour ce faire, l'administrateur pourra créer le compte système mirror.
sudo useradd -r -m -d /home/mirror -c "User to perform mirror synchronization" -s /bin/false mirror
Il faut créer le répertoire de logs (cfr LOGDIR) et donner les droits d'écriture à l'utilisateur mirror
sudo mkdir /var/log/ubumirror sudo chown mirror /var/log/ubumirror
Il faut créer les répertoires qui accueillent la synchronisation (cfr UBNxxx_DIR) et donner les droits d'écriture à l'utilisateur mirror
sudo mkdir /srv/mirror/ubuntu sudo chown mirror /srv/mirror/ubuntu
sudo -u mirror -H ubuarchive
La première exécution sera longue. Si vous n'avez pas une IP fixe, votre connexion se coupera à un moment et l'administrateur recevra un mail d'avertissement que la synchronisation n'a pas réussie. Ce n'est pas grave. Il faudra juste relancer le script qui a échoué. Après avoir introduit votre mot de passe administrateur, s'il vous est demandé, l'exécution de la commande ci-dessus ne renverra rien sur la console (standard output aka stdout). Vous pouvez alors envoyer ce processus à l'arrière plan avec la combinaison des touches CTRL et Z suivi de la commande bg. L'administrateur pourra alors suivre l'évolution de la commande dans le journal (fichier log) avec la commande
tail -f /var/log/ubumirror/ubuarchive.log
Vous pouvez quitter ce processus avec la combinaison des touches CTRL et C sans crainte d'arrêter le processus ubuarchive. Ce sont bien deux processus distincts. Une fois que la première synchronisation sera réussie, l'administrateur pourra automatiser les synchronisations avec un cron job et rendre le miroir accessible aux utilisateurs par http, ftp et/ou rsync.
L'exécution des autres scripts est similaire.
Pour automatiser la synchronisation, il faut créer un cron job (tâche récurrente) pour l'utilisateur mirror
sudo crontab -u mirror -e
Et y ajouter la commande suivante
33 */6 * * * /usr/bin/ubuarchive >/dev/null 2>&-
En fonction des besoins, d'autres commandes y seront introduites pour lancer la synchronisation les autres parties du miroir.
Ceci a pour but de remplacer ce qui a été présenté ci-dessus. L'expérience a montré qu'avec une mauvaise bande passante chez le client, il arrive que le script /usr/bin/ubuarchive ne se termine pas en moins de 6 heures. Le cron job ci-dessus relance un second processus de synchronisation. Ces processus vont se battre la bande passante disponible et risquent de ne pas arriver à synchroniser le miroir. Ainsi de suite, de multiple processus de synchronisation vont être lancés chaque 6 heures. Au bout de 24 heures, la situation est pratiquement irrécupérable et l'administrateur devra gérer le problème manuellement. Le script proposé ci-dessous va d'abord vérifier si un processus de synchronisation existe avant d'en lancer un nouveau. De plus, lorsque la synchronisation échoue, elle est relancée immédiatement (après 60 secondes). L'administrateur recevra quand-même un mail d'avertissement mais ne devrait pas s'en inquiéter.
#!/bin/sh PID=$$ PIDFILE=$HOME/ubuarchive.pid if [ -e $PIDFILE ] ; then currentPID=`cat $PIDFILE` echo "Ubuarchive is already running with PID : $currentPID" exit fi echo $PID > $PIDFILE exitCode=1 until [ $exitCode -eq 0 ]; do nice -n 16 ubuarchive exitCode=$? sleep 60 done rm $PIDFILE
Ce script pourra être sauvé sur /home/mirror/ubuarchive.sh et il sera lancé par un cron job (en remplacement du précédent).
33 */6 * * * /home/mirror/ubuarchive.sh >/dev/null 2>&-
Afin de profiter de ce miroir comme source de téléchargement des paquets de la distribution, il faut le rendre accessible en http ou https. Pour ce faire, il faut installer et configurer un serveur Web. L'exemple qui suit est basé sur lighttpd.
Il suffit d'installer le paquet lighttpd
# -*- depends: dir-listing -*- # Virtual host $HTTP["host"] == "mirror.example.com" { server.document-root = "/mnt/mirror" } # Alias redirection alias.url += ( "/mirror" => "/mnt/mirror" )
L'activation du site se fait avec la commande lighttpd-enable-mod
sudo lighttpd-enable-mod mirror Met dependency: dir-listing Enabling mirror: ok Enabling dir-listing: ok Run /etc/init.d/lighttpd force-reload to enable changes
Comme suggérer par la commande précédent, il faut recharger le serveur lighttpd pour qu'il prenne en compte la modification.
sudo /etc/init.d/lighttpd force-reload
Le site est à présent accessible sur l'url http://mirror.example.com ou http://<Serveur IP>/mirror
Contributeur principal : Qedinux.
Basé sur « Ubuntu Wiki Mirror » et « UECProvisioningMirror » par Dustin Kirkland et Jonathan Davies.