Auteur Sujet: Scripts pour mettre en place un serveur miroir Ubuntu  (Lu 7812 fois)

0 Membres et 1 Invité sur ce sujet

vivien

  • Administrateur
  • *
  • Messages: 28 628
    • Twitter LaFibre.info
Scripts pour mettre en place un serveur miroir Ubuntu
« le: 19 janvier 2015 à 17:22:16 »
Scripts pour mettre en place un serveur miroir Ubuntu dans votre université / entreprise

Il y a peu de documentation pour mettre en place un serveur miroir, je vais donc donner un exemple concret, a adapter à votre besoin.

On part sur un serveur Linux avec Apache 2.4 qui va héberger un miroir de :
- Libre-office
- Ubuntu-cd (les fichiers iso a graver sur un CD/DVD)
- Ubuntu-archive (les données pour les logiciels disponibles dans la logithèque, ainsi que les mises-à -jour de sécurité)

L'architecture retenue sur le disque est celle-ci :
- /home/libre-office : Les 35 Gio de libre-office (taille réelle au 19/01/2015)
- /home/ubuntu-cd : Les 39 Gio de Ubuntu-cd (taille réelle au 19/01/2015)
- /home/ubuntu-archive : Les 1028 Go de Ubuntu-archive (taille réelle au 29/12/2017)
- /home/scripts : les 5 scripts pour mettre à jour le miroir
- /home/log/libre-office : Log pour Libre-office
- /home/log/ubuntu-cd : Log pour Ubuntu-cd
- /home/log/ubuntu : Log pour les archives Ubuntu
- /home/ubuntu-archive/log/ : Log des scripts Rsync client

Les fichiers du miroir mis en place sont disponible en http avec Apache 2.4 et avec Rsync pour qu'une autre personne puisse se synchroniser sur votre serveur pour en faire un autre.
A n'activer qu'en cas de besoin,bien sur, mais cela permet de faire un tutoriel complet.

vivien

  • Administrateur
  • *
  • Messages: 28 628
    • Twitter LaFibre.info
Scripts pour mettre en place un serveur miroir Ubuntu
« Réponse #1 le: 19 janvier 2015 à 17:22:22 »
Contenu de la crontab :

Voici le contenu de la crontab d'un utilisateur (les scripts n'ont pas besoin de tourner sous root, et pour des raison de sécurité il est déconseillé de les faire tourner sous root) :

# Synchronisation Libre-Office toutes les 4 heures
41 1 * * * /home/scripts/sync-libre-office.sh >/home/log/scripts-log/sync-libre-office_01h.log 2>/home/log/scripts-err/sync-libre-office_01h.err.log
41 5 * * * /home/scripts/sync-libre-office.sh >/home/log/scripts-log/sync-libre-office_05h.log 2>/home/log/scripts-err/sync-libre-office_05h.err.log
41 9 * * * /home/scripts/sync-libre-office.sh >/home/log/scripts-log/sync-libre-office_09h.log 2>/home/log/scripts-err/sync-libre-office_09h.err.log
41 13 * * * /home/scripts/sync-libre-office.sh >/home/log/scripts-log/sync-libre-office_13h.log 2>/home/log/scripts-err/sync-libre-office_13h.err.log
41 17 * * * /home/scripts/sync-libre-office.sh >/home/log/scripts-log/sync-libre-office_17h.log 2>/home/log/scripts-err/sync-libre-office_17h.err.log
41 21 * * * /home/scripts/sync-libre-office.sh >/home/log/scripts-log/sync-libre-office_21h.log 2>/home/log/scripts-err/sync-libre-office_21h.err.log

# Synchronisation Ubuntu CD toutes les 4 heures
11 3 * * * /home/scripts/sync-ubuntu-cd.sh >/home/log/scripts-log/sync-ubuntu-cd_03h.log 2>/home/log/scripts-err/sync-ubuntu-cd_03h.err.log
11 7 * * * /home/scripts/sync-ubuntu-cd.sh >/home/log/scripts-log/sync-ubuntu-cd_07h.log 2>/home/log/scripts-err/sync-ubuntu-cd_07h.err.log
11 11 * * * /home/scripts/sync-ubuntu-cd.sh >/home/log/scripts-log/sync-ubuntu-cd_11h.log 2>/home/log/scripts-err/sync-ubuntu-cd_11h.err.log
11 15 * * * /home/scripts/sync-ubuntu-cd.sh >/home/log/scripts-log/sync-ubuntu-cd_15h.log 2>/home/log/scripts-err/sync-ubuntu-cd_15h.err.log
11 19 * * * /home/scripts/sync-ubuntu-cd.sh >/home/log/scripts-log/sync-ubuntu-cd_19h.log 2>/home/log/scripts-err/sync-ubuntu-cd_19h.err.log
11 23 * * * /home/scripts/sync-ubuntu-cd.sh >/home/log/scripts-log/sync-ubuntu-cd_23h.log 2>/home/log/scripts-err/sync-ubuntu-cd_23h.err.log

# Synchronisation Ubuntu ARCHIVE toutes les 4 heures
22 0 * * * /home/scripts/sync-ubuntu-archive.sh >/home/log/scripts-log/sync-ubuntu-archive_00h.log 2>/home/log/scripts-err/sync-ubuntu-archive_00h.err.log
22 4 * * * /home/scripts/sync-ubuntu-archive.sh >/home/log/scripts-log/sync-ubuntu-archive_04h.log 2>/home/log/scripts-err/sync-ubuntu-archive_04h.err.log
22 8 * * * /home/scripts/sync-ubuntu-archive.sh >/home/log/scripts-log/sync-ubuntu-archive_08h.log 2>/home/log/scripts-err/sync-ubuntu-archive_08h.err.log
22 12 * * * /home/scripts/sync-ubuntu-archive.sh >/home/log/scripts-log/sync-ubuntu-archive_12h.log 2>/home/log/scripts-err/sync-ubuntu-archive_12h.err.log
22 16 * * * /home/scripts/sync-ubuntu-archive.sh >/home/log/scripts-log/sync-ubuntu-archive_16h.log 2>/home/log/scripts-err/sync-ubuntu-archive_16h.err.log
22 20 * * * /home/scripts/sync-ubuntu-archive.sh >/home/log/scripts-log/sync-ubuntu-archive_20h.log 2>/home/log/scripts-err/sync-ubuntu-archive_20h.err.log


Modifier /etc/crontab pour que la maintenance sur le serveur miroir se face en avance : il doit faire la rotation des log avant et non pendant que les serveurs font leur mise à jour.

Faire la modification des heures pour que cron.daily soit lancé en pleine nuit. Munin est lui lancé toutes les 5 minutes (00 / 05 / 10 / 15 / 20 / 25 / 30 / 35 / 40 / 45 / 50 /55) et il jusqu'à deux minutes pour interroger les hôtes. Pour réduire l'impact de perte de log pour les log de rsyncd, il faut lancer la rotation deux minutes aprés donc ici 3h57 permet de perdre une minute maximum de log, là ou 3h55 ferait perdre 4 minutes.
nano /etc/crontab
# /etc/crontab: system-wide crontab
# Unlike any other crontab you don't have to run the `crontab'
# command to install the new version when you edit this file
# and files in /etc/cron.d. These files also have username fields,
# that none of the other crontabs do.

SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

# m h dom mon dow user  command
17 *    * * *   root    cd / && run-parts --report /etc/cron.hourly
57 3    * * *   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
17 4    * * 7   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
37 4    1 * *   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )
#

Les scripts de /etc/cron.daily sont donc lancés à 3h57
Les scripts de /etc/cron.weekly sont donc lancés à 4h17
Les scripts de /etc/cron.monthly sont donc lancés à 4h37

Et enfin, ne pas oublier de recharger la crontab : sudo service cron reload

Pourquoi en pleine nuit ?

Une connexion TCP peut durer plusieurs heures.

Voici un exemple d'une connexion démarrée le 9 mai à 18h57 qui s'est terminée le 12 mai à 17h37, la connexion a donc durée  (cela reste exceptionnel de telles connexion, le fichier fait 745 Mio soit un débit moyen de Kb/s)
2a02:8433:601:1200:4687:fcff:fe6c:a9a 54230 - [09/May/2016:18:57:24 +0200] "GET /ubuntu/pool/multiverse/r/redeclipse-data/redeclipse-data_1.5.1-2_all.deb HTTP/1.1" 200 780953731 "-" "Wget/1.16 (linux-gnu)"

Quand on fait un reload, de nombreux slots deviennent inutilisables car bloqués par des connexions qui sont en cours. Il faut donc faire le reload a un moment où il y a peu de trafic.

Si on est trop proche de 6h00, on risque de manquer de ressources pour les mises à jour des PC allumés 24h/24 qui se fait peu après 6h00.

Si on est trop proche de minuit, il y a encore un trafic important (nombreuses connexions à 1h du matin observé dans certains cas)

3h57 est en période de faible trafic. Cela permet de post-traiter ensuite les log a 7h00 du matin et être sur d'avoir tous les logs.
(la commande GracefulShutdownTimeout 3600 dans /etc/apache2/mods-enabled/mpm_event.conf va limiter à 1h les connexion après un GracefulShutdown et la rotation des log de 3h57 entraîne un GracefulShutdown => l'ancien fichier de log est donc complet à 4h57.

vivien

  • Administrateur
  • *
  • Messages: 28 628
    • Twitter LaFibre.info
Scripts pour mettre en place un serveur miroir Ubuntu
« Réponse #2 le: 19 janvier 2015 à 17:27:57 »
Voici les 3 scripts appelés depuis la crontab :

sync-libre-office.sh :
#!/bin/dash

fatal() {
  echo "$1"
  exit 1
}

warn() {
  echo "$1"
}

# http://download.documentfoundation.org/mirroring.html
RSYNCSOURCE=rsync://rsync.documentfoundation.org/tdf-pub

# Define where you want the mirror-data to be on your mirror
BASEDIR=/home/libre-office/

if [ ! -d ${BASEDIR} ]; then
  warn "${BASEDIR} does not exist yet, trying to create it..."
  mkdir -p ${BASEDIR} || fatal "Creation of ${BASEDIR} failed."
fi

# Première synchro avec débit limité à 41 Mb/s :
# rajouter --bwlimit=5000 --progress (+démarrer dans un screen)
rsync --verbose --recursive --times --links --hard-links --perms \
  --stats --delete-after \
  ${RSYNCSOURCE} ${BASEDIR} || fatal "!!!!!!!!!!!!!!!!!!! ERREUR : RSYNC EN ECHEC !!!!!!!!!!!!!!!!!!!"

#date -u > ${BASEDIR}/.trace/$(hostname -f)
echo "######################## SYNCHRONISATION OK ########################"
date


sync-ubuntu-cd.sh :
#!/bin/dash

fatal() {
  echo "$1"
  exit 1
}

warn() {
  echo "$1"
}

# Find a source mirror near you which supports rsync on
# https://launchpad.net/ubuntu/+cdmirrors
# rsync://<iso-country-code>.rsync.releases.ubuntu.com/releases should always work
RSYNCSOURCE=rsync://fr.rsync.releases.ubuntu.com/releases

# Define where you want the mirror-data to be on your mirror
BASEDIR=/home/ubuntu-cd/

if [ ! -d ${BASEDIR} ]; then
  warn "${BASEDIR} does not exist yet, trying to create it..."
  mkdir -p ${BASEDIR} || fatal "Creation of ${BASEDIR} failed."
fi

# Première synchro avec débit limité à 41 Mb/s :
# rajouter --bwlimit=5000 --progress (+démarrer dans un screen)
rsync --verbose --recursive --times --links --hard-links --perms \
  --stats --delete-after \
  ${RSYNCSOURCE} ${BASEDIR} || fatal "!!!!!!!!!!!!!!!!!!! ERREUR : RSYNC EN ECHEC !!!!!!!!!!!!!!!!!!!"

date -u > ${BASEDIR}/.trace/$(hostname -f)
echo "######################## SYNCHRONISATION OK ########################"
date


sync-ubuntu-archive.sh :

Il y a une particularité à ce script : il doit déjà synchroniser tous les fichiers avant de mettre à jour les indexes.

Si les indexes sont mis à jour avant les fichiers, on risque d'avoir un utilisateur qui tente de télécharger un fichier qui n'est pas encore sur le miroir (une mise-à-jour de sécurité par exemple).
C'est pour cela que pour ce type de miroir, un script avec un Rsync en deux étapes est nécessaire.

Je propose un double script : le premier script appelle le second, ce qui permet d'avoir des logs de ce qui a été réalisé.


Script sync-ubuntu-archive.sh

#!/bin/dash

fatal() {
  echo "$1"
  exit 1
}

warn() {
  echo "$1"
}

LOGDIR=/home/ubuntu-archive/log # Emplacement des log
NB_INCR=10 # Nombre de sauvegardes

if [ ! -d ${LOGDIR} ]; then
  warn "${LOGDIR} does not exist yet, trying to create it..."
  mkdir -p ${LOGDIR} || fatal "Creation of ${LOGDIR} failed."
fi

#### Decale les autres fichiers de log / err
i=${NB_INCR}
while [ $i -gt 0 ]
do
        j=`expr $i - 1`
if [ -f ${LOGDIR}/sync-ubuntu.log.$j ]; then
mv ${LOGDIR}/sync-ubuntu.log.$j ${LOGDIR}/sync-ubuntu.log.$i
fi
if [ -f ${LOGDIR}/sync-ubuntu.err.$j ]; then
mv ${LOGDIR}/sync-ubuntu.err.$j ${LOGDIR}/sync-ubuntu.err.$i
fi
        i=`expr $i - 1`
done

echo "Ubuntu archive mirror: two stage sync"
# lancement du script principal
/home/scripts/sync-ubuntu-archive-2.sh >${LOGDIR}/sync-ubuntu.log.0 2>${LOGDIR}/sync-ubuntu.err.0 &

Script sync-ubuntu-archive-2.sh

#!/bin/dash

fatal() {
  echo "$1"
  exit 1
}

warn() {
  echo "$1"
}

# Find a source mirror near you which supports rsync on
# https://launchpad.net/ubuntu/+archivemirrors
# rsync://<iso-country-code>.rsync.archive.ubuntu.com/ubuntu should always work
RSYNCSOURCE=rsync://fr.archive.ubuntu.com/ubuntu

# Define where you want the mirror-data to be on your mirror
BASEDIR=/home/ubuntu-archive/ubuntu/

if [ ! -d ${BASEDIR} ]; then
  warn "${BASEDIR} does not exist yet, trying to create it..."
  mkdir -p ${BASEDIR} || fatal "Creation of ${BASEDIR} failed."
fi

attempt="1"

# First sync with bit rate limited to 41 Mb/s: add
#  --bwlimit=5000 --progress \
# Step 1 of 2
date -R
echo "#################### SYNC STEP 1 OF 2 ####################"
echo "exclude: Packages*, Sources*, Release*, InRelease; .~tmp~"
rsync --verbose --out-format="%o %b bytes for sync %n (%l bytes)" \
  --recursive --times --links --safe-links --hard-links --perms \
  --stats \
  --exclude "/dists" \
  --exclude "Packages*" --exclude "Sources*" \
  --exclude "Release*" --exclude "InRelease" \
  --exclude ".~tmp~" \
  --exclude ".trace" \
  ${RSYNCSOURCE} ${BASEDIR} || attempt="2"

if [ "$attempt" = "2" ]; then
  echo "!!!!!!!!!!!!!!!!!!! ERROR : SYNC STEP 1 OF 2 HAS FAILED (1st attempt) !!!!!!!!!!!!!!!!!!!"
  echo "ERROR : SYNC STEP 1 OF 2 HAS FAILED (1st attempt)" >&2
  echo "-------------------------------------------------" >&2
  date -R
  echo "Second attempt after 4 minutes (240 seconds) of pause"
  sleep 240
  date -R
  echo "#################### SYNC STEP 1 OF 2 (2nd attempt) ####################"
  echo "exclude: Packages*, Sources*, Release*, InRelease; .~tmp~"
  rsync --verbose --out-format="%o %b bytes for sync %n (%l bytes)" \
    --recursive --times --links --safe-links --hard-links --perms \
    --stats \
    --exclude "/dists" \
    --exclude "Packages*" --exclude "Sources*" \
    --exclude "Release*" --exclude "InRelease" \
    --exclude ".~tmp~" \
    --exclude ".trace" \
    ${RSYNCSOURCE} ${BASEDIR} || attempt="3"
fi

if [ "$attempt" = "3" ]; then
  echo "!!!!!!!!!!!!!!!!!!! ERROR : SYNC STEP 1 OF 2 HAS FAILED (2nd attempt) !!!!!!!!!!!!!!!!!!!"
  echo "ERROR : SYNC STEP 1 OF 2 HAS FAILED (2nd attempt)" >&2
  echo "-------------------------------------------------" >&2
  date -R
  echo "Third attempt after 10 minutes (600 seconds) of pause"
  sleep 600
  date -R
  echo "#################### SYNC STEP 1 OF 2 (3rd attempt) ####################"
  echo "exclude: Packages*, Sources*, Release*, InRelease; .~tmp~"
  rsync --verbose --out-format="%o %b bytes for sync %n (%l bytes)" \
    --recursive --times --links --safe-links --hard-links --perms \
    --stats \
    --exclude "/dists" \
    --exclude "Packages*" --exclude "Sources*" \
    --exclude "Release*" --exclude "InRelease" \
    --exclude ".~tmp~" \
    --exclude ".trace" \
    ${RSYNCSOURCE} ${BASEDIR} || fatal "!!!!!!!!!!!!!!!!!!! ERROR : SYNC STEP 1 OF 2 HAS FAILED (3rd attempt) !!!!!!!!!!!!!!!!!!!"
fi

echo "#################### SYNC STEP 1 OF 2 IS OK WITH $attempt attempt ####################"
date -R


# Step 2 of 2
attempt="1"
echo "#################### SYNC STEP 2 OF 2 ####################"
echo "SYNC Packages* + Sources* + Release* + InRelease"
echo "exclude: .~tmp~"
rsync --verbose --out-format="%o %b bytes for sync %n (%l bytes)" \
  --recursive --times --links --safe-links --hard-links --perms \
  --stats --delete --delete-after \
  --exclude ".~tmp~" \
  ${RSYNCSOURCE} ${BASEDIR} || attempt="2"

if [ "$attempt" = "2" ]; then
  echo "!!!!!!!!!!!!!!!!!!! ERROR : SYNC STEP 2 OF 2 HAS FAILED (1st attempt) !!!!!!!!!!!!!!!!!!!"
  echo "ERROR : SYNC STEP 2 OF 2 HAS FAILED (1st attempt)" >&2
  echo "-------------------------------------------------" >&2
  date -R
  echo "Second attempt after 4 minutes (240 seconds) of pause"
  sleep 240
  date -R
  echo "#################### SYNC STEP 2 OF 2 (2nd attempt) ####################"
  echo "SYNC Packages* + Sources* + Release* + InRelease"
  echo "exclude: .~tmp~"
  rsync --verbose --out-format="%o %b bytes for sync %n (%l bytes)" \
    --recursive --times --links --safe-links --hard-links --perms \
    --stats --delete --delete-after \
    --exclude ".~tmp~" \
    ${RSYNCSOURCE} ${BASEDIR} || attempt="3"
fi

if [ "$attempt" = "3" ]; then
  echo "!!!!!!!!!!!!!!!!!!! ERROR : SYNC STEP 2 OF 2 HAS FAILED (2nd attempt !!!!!!!!!!!!!!!!!!!"
  echo "ERROR : SYNC STEP 2 OF 2 HAS FAILED (2nd attempt)" >&2
  echo "-------------------------------------------------" >&2
  date -R
  echo "Third attempt after 10 minutes (600 seconds) of pause"
  sleep 600
  date -R
  echo "#################### SYNC STEP 2 OF 2 (3rd attempt) ####################"
  echo "SYNC Packages* + Sources* + Release* + InRelease"
  echo "exclude: .~tmp~"
  rsync --verbose --out-format="%o %b bytes for sync %n (%l bytes)" \
    --recursive --times --links --safe-links --hard-links --perms \
    --stats --delete --delete-after \
    --exclude ".~tmp~" \
    ${RSYNCSOURCE} ${BASEDIR} || fatal "!!!!!!!!!!!!!!!!!!! ERROR : SYNC STEP 2 OF 2 HAS FAILED (3rd attempt) !!!!!!!!!!!!!!!!!!!"
fi

echo "#################### SYNC STEP 2 OF 2 IS OK WITH $attempt attempt ####################"
date -R > ${BASEDIR}/project/trace/fr.archive.ubuntu.com
date -R

Pour la première exécution, quand le miroir que vous venez de monter est vise, il est fortement conseillé de limiter le débit avec la directive --bwlimit=5000 qui limite le débit à 5000 Kio/s afin de ne pas trop charger le serveur qui vous fourni les fichiers. Vous pouvez également laisser cette directive après pour ne pas trop dégrader votre connexion lors des mises à jour.

vivien

  • Administrateur
  • *
  • Messages: 28 628
    • Twitter LaFibre.info
Scripts pour mettre en place un serveur miroir Ubuntu
« Réponse #3 le: 19 janvier 2015 à 17:36:00 »
Les fichiers pour Apache 2.4 :

A placer dans /etc/apache2/sites-available/ si vous utilisez Ubuntu server ou Debian. Le site s'active ensuite avec la commande sudo a2ensite libre-office.conf puis sudo service apache2 reload pour la prise en compte des modifications.

Libre-office : libre-office.conf

<VirtualHost *:80>
        ServerName "libre-office.mon-universite.fr"
        ServerAdmin mail@mon-universite.fr

        DocumentRoot "/home/libre-office"
        <Directory "/home/libre-office">
                Options Indexes FollowSymLinks
                AllowOverride None
                # Supprimer la colonne description inutilisée
                IndexOptions +SuppressDescription
                Require all granted
        </Directory>

        ErrorLog "/home/log/libre-office/error.log"
        CustomLog "/home/log/libre-office/access.log" combined
</VirtualHost>


Ubuntu CD : ubuntu-cd.conf

<VirtualHost *:80>
        ServerName "ubuntu-cd.mon-universite.fr"
        ServerAdmin mail@mon-universite.fr

        DocumentRoot "/home/ubuntu-cd"
        <Directory "/home/ubuntu-cd">
                Options Indexes FollowSymLinks
                # Autoriser les .htaccess pour rajouter les infos sur la colonne description
                AllowOverride All
                Require all granted
        </Directory>

        ErrorLog "/home/log/ubuntu-cd/error.log"
        CustomLog "/home/log/ubuntu-cd/access.log" combined
</VirtualHost>


Ubuntu archive : ubuntu.conf

<VirtualHost *:80>
ServerName "fr.archive.ubuntu.com"
ServerAlias "bouyguestelecom.ubuntu.lafibre.info"
        ServerAdmin mail@mon-universite.fr

DocumentRoot "/home/ubuntu-archive"
<Directory "/home/ubuntu-archive">
Options Indexes FollowSymLinks
AllowOverride None
# Supprimer la colonne description inutilisée
IndexOptions +SuppressDescription
Require all granted
# AddType text/plain .0
</Directory>

ErrorLog "/tmp/apache2-ubuntu-error.log"
CustomLog "/home/log/ubuntu/access.log" combiport
</VirtualHost>

<VirtualHost *:443>
ServerName "fr.archive.ubuntu.com"
ServerAlias "bouyguestelecom.ubuntu.lafibre.info"
ServerAdmin signalement-erreur-apache@lafibre.info

SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/bouyguestelecom.ubuntu.lafibre.info/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/bouyguestelecom.ubuntu.lafibre.info/privkey.pem

DocumentRoot "/home/ubuntu-archive"
<Directory "/home/ubuntu-archive">
Options Indexes FollowSymLinks
AllowOverride None
# Supprimer la colonne description inutilisée
IndexOptions +SuppressDescription
Require all granted
# AddType text/plain .0
</Directory>

ErrorLog "/tmp/apache2-ubuntu-error.log"
CustomLog "/home/log/ubuntu/access.log" combiport
</VirtualHost>

vivien

  • Administrateur
  • *
  • Messages: 28 628
    • Twitter LaFibre.info
Scripts pour mettre en place un serveur miroir Ubuntu
« Réponse #4 le: 19 janvier 2015 à 17:44:37 »
Mise en place d'un serveur Rsync

On parle d'un serveur Rsync, et non du client Rsync dont on a déjà mis les scripts avant.
Il s'agit là de proposer les fichiers pour que d'autres puissent se synchroniser sur votre serveur miroir.

Autre cas d'utilisation, plus probable : Vous avez un projet et que vous souhaitez mettre en place un serveur miroir depuis votre serveur primaire. Voici donc ce qu'il faut faire sur le serveur primaire.

Rsync est déjà installé sur de nombreux linux, il faut juste l'activer en tant que serveur.

Cela se fait en éditant le fichier /etc/default/rsync

Et en configurant ces 3 lignes :
RSYNC_ENABLE=true => activer le serveur   (valeur par défaut : RSYNC_ENABLE=false')
RSYNC_NICE='15' => faible priorité CPU   (valeur par défaut : RSYNC_NICE='')
RSYNC_IONICE='-c3' => fiable priorité disque dur   (valeur par défaut : # RSYNC_IONICE='-c3')

Cela donne chez moi :

# defaults file for rsync daemon mode

# start rsync in daemon mode from init.d script?
#  only allowed values are "true", "false", and "inetd"
#  Use "inetd" if you want to start the rsyncd from inetd,
#  all this does is prevent the init.d script from printing a message
#  about not starting rsyncd (you still need to modify inetd's config yourself).
RSYNC_ENABLE=true

# which file should be used as the configuration file for rsync.
# This file is used instead of the default /etc/rsyncd.conf
# Warning: This option has no effect if the daemon is accessed
#          using a remote shell. When using a different file for
#          rsync you might want to symlink /etc/rsyncd.conf to
#          that file.
# RSYNC_CONFIG_FILE=

# what extra options to give rsync --daemon?
#  that excludes the --daemon; that's always done in the init.d script
#  Possibilities are:
#   --address=123.45.67.89 (bind to a specific IP address)
#   --port=8730 (bind to specified port; default 873)
RSYNC_OPTS=''

# run rsyncd at a nice level?
#  the rsync daemon can impact performance due to much I/O and CPU usage,
#  so you may want to run it at a nicer priority than the default priority.
#  Allowed values are 0 - 19 inclusive; 10 is a reasonable value.
RSYNC_NICE='15'

# run rsyncd with ionice?
#  "ionice" does for IO load what "nice" does for CPU load.
#  As rsync is often used for backups which aren't all that time-critical,
#  reducing the rsync IO priority will benefit the rest of the system.
#  See the manpage for ionice for allowed options.
#  -c3 is recommended, this will run rsync IO at "idle" priority. Uncomment
#  the next line to activate this.
RSYNC_IONICE='-c3'

# Don't forget to create an appropriate config file,
# else the daemon will not start.


Il faut également crée un fichier /etc/rsyncd.conf (il n'existe pas) pour indiquer ce que vous allez partager avec Rsync :
uid = nobody
gid = nogroup
use chroot = yes
max connections = 10
timeout = 180
dont compress = *
log format = %a %o %b
transfer logging = yes
motd file = /home/scripts/rsyncd-motd-file.txt

[ubuntu]
   path = /home/ubuntu-archive/ubuntu
   comment = Sync archive Ubuntu
   log file = /tmp/rsyncd.log
   read only = yes

log format permet de spécifier le type de log souhaité :
Le format de log par défaut est : %t [%p] "%o %h [%a] %m (%u) %f %l
Log minimal pour les stats Munin : log format = %a %o %b.


%t pour la date et heure courante
%p pour le numéro de processus de cette session rsync
%o pour l'opération, qui est soit «send», soit «recv», soit «del»
%h pour le nom de l'hôte distant (reverse-dns du client)
%a pour l'adresse IPv4/iPv6 de l'hôte distant (le client)
%m pour le nom du module (ici ubuntu, utile si votre serveur héberge plusieurs miroirs)
%u pour le nom d'utilisateur authentifié (ou bien chaîne de caractère nulle)
%f pour le nom de fichier
%l pour la longueur du fichier en octets
%b pour le nombre d'octets transférés


%b => ce qui est transféré (uniquement les modifications par rapport au précédent fichier)
%l => taille totale du fichier
Vous pouvez voir les  deux tailles dans les log du client rsync sur http://fr.archive.ubuntu.com/log/

Documentation complète en Français : http://www.delafond.org/traducmanfr/man/man5/rsyncd.conf.5.html

Pour rajouter Libre office ou les CD à RSYNCD, il suffit de rajouter ces sections :

[tdf-pub]
   path = /home/libre-office
   comment = Sync Libre-office - The Document Foundation
   log file = /home/log/libre-office/rsyncd.log
   read only = yes

[releases]
   path = /home/ubuntu-cd
   comment = Sync releases Ubuntu CD
   log file = /home/log/ubuntu-cd/rsyncd.log
   read only = yes

Ne pas oublier de faite un service rsync start pour le démarrage du daemon.

Impératif pour que le service se lance au redémarrage du serveur : systemctl enable rsync

Le fichier de log n'est crée que quand le premier client se connecte.
Vérifier via service rsync status que tout est ok.

Ci-dessous 4 connexions de tests, réalisées depuis une ligne SFR :

# service rsync status
● rsync.service - fast remote file copy program daemon
   Loaded: loaded (/lib/systemd/system/rsync.service; disabled; vendor preset: enabled)
   Active: active (running) since dim. 2017-12-17 20:45:57 CET; 5min ago
 Main PID: 31532 (rsync)
    Tasks: 1
   Memory: 785.3M
      CPU: 4.057s
   CGroup: /system.slice/rsync.service
           └─31532 /usr/bin/rsync --daemon --no-detach

déc. 17 20:45:57 ubuntu systemd[1]: Started fast remote file copy program daemon.
déc. 17 20:45:57 ubuntu rsyncd[31532]: rsyncd version 3.1.1 starting, listening on port 873
déc. 17 20:46:38 ubuntu rsyncd[31686]: connect from 44.168.83.79.rev.sfr.net (79.83.168.44)
déc. 17 20:46:47 ubuntu rsyncd[31697]: connect from 44.168.83.79.rev.sfr.net (79.83.168.44)
déc. 17 20:48:42 ubuntu rsyncd[31704]: connect from 44.168.83.79.rev.sfr.net (79.83.168.44)
déc. 17 20:48:42 ubuntu rsyncd[31705]: connect from 44.168.83.79.rev.sfr.net (79.83.168.44)

vivien

  • Administrateur
  • *
  • Messages: 28 628
    • Twitter LaFibre.info
Scripts pour mettre en place un serveur miroir Ubuntu
« Réponse #5 le: 19 janvier 2015 à 17:55:40 »
Optionnel pour ubuntu-archive : Un script, appelé une fois par jour, qui permettre :

- d'archiver dans un fichier texte /home/log/du-shm/du-ubuntu-archive.log la taille du dossier /home/ubuntu-archive/ubuntu
- de récupérer les fichiers meta-release

Les fichiers meta-release sont nécessaire pour upgrader une version d'Ubuntu vers la suivante : ils donnent l’information comme quoi une nouvelle version est disponible. ces fichiers ne sont pas récupérés sur le miroir par défaut, mais sur Internet.

Dans le cadre de machines qui ne sont pas connectés à Internet, il faut modifier le fichier /etc/update-manager/meta-release pour indiquer la nouvelle URL où aller récupérer le fichier qui contient l'information sur les nouvelles versions disponibles.

Le fichier /etc/update-manager/meta-release par défaut :

# default location for the meta-release file

[METARELEASE]
URI = http://changelogs.ubuntu.com/meta-release
URI_LTS = http://changelogs.ubuntu.com/meta-release-lts
URI_UNSTABLE_POSTFIX = -development
URI_PROPOSED_POSTFIX = -proposed


Le script /home/scripts/ubuntu-meta.sh a executer une fois par jour, dans la nuit :
#!/bin/dash

BASEDIR=/home/log/du-shm/

#### Création du dossier si nécessaire ####
#[ -d /home/log/ntpdate ] || mkdir -p ${BASEDIR}

date >>${BASEDIR}du-ubuntu-archive.log
du -shm /home/ubuntu-archive/ubuntu >>${BASEDIR}du-ubuntu-archive.log
echo "------------------------------------" >>${BASEDIR}du-ubuntu-archive.log

### Téléchargement des ficheirs meta-release pour Ubuntu :
wget -O /home/ubuntu-archive/meta-release http://changelogs.ubuntu.com/meta-release
wget -O /home/ubuntu-archive/meta-release-lts http://changelogs.ubuntu.com/meta-release-lts
wget -O /home/ubuntu-archive/meta-release-proposed http://changelogs.ubuntu.com/meta-release-proposed
wget -O /home/ubuntu-archive/meta-release-lts-proposed http://changelogs.ubuntu.com/meta-release-lts-proposed
wget -O /home/ubuntu-archive/meta-release-development http://changelogs.ubuntu.com/meta-release-development
wget -O /home/ubuntu-archive/meta-release-lts-development http://changelogs.ubuntu.com/meta-release-lts-development

Exemple de ligne a rajouter dans la crontab d'un utilisateur (les droits root ne sont pas nécessaire, si l'utilisateur a le droit d'écriture sur le dossier /home/ubuntu-archive)
35 5 * * * /home/scripts/ubuntu-meta.sh

vivien

  • Administrateur
  • *
  • Messages: 28 628
    • Twitter LaFibre.info
Scripts pour mettre en place un serveur miroir Ubuntu
« Réponse #6 le: 19 janvier 2015 à 18:05:33 »
Les logs pour vérifier que tout fonctionne bien

/home/ubuntu-archive/log/sync-ubuntu.err.0: Log des erreurs des scripts Rsync client de la dernière synchronisation.

C'est simple : les fichiers doivent avoir une taille de 0 octets si tout s'est bien passé !
Si il ne sont pas vide, il est intéressant d'ouvrir le log pour voir l'erreur.

Un exemple d'erreur :

rsync error: timeout in data send/receive (code 30) at io.c(137) [sender=3.0.9]
rsync: connection unexpectedly closed (321304304 bytes received so far) [receiver]
rsync error: error in rsync protocol data stream (code 12) at io.c(605) [receiver=3.0.9]
rsync: connection unexpectedly closed (33549628 bytes received so far) [generator]
rsync error: error in rsync protocol data stream (code 12) at io.c(605) [generator=3.0.9]


/home/ubuntu-archive/log/sync-ubuntu.log.0: Log qui détaille les fichiers synchronisés.

Un exemple de fin de fichier :


Number of files: 841,771 (reg: 774,971, dir: 53,848, link: 12,952)
Number of created files: 885 (reg: 885)
Number of deleted files: 1,011 (reg: 1,011)
Number of regular files transferred: 6,373
Total file size: 1,050,282,306,922 bytes
Total transferred file size: 3,592,240,119 bytes
Literal data: 1,098,169,082 bytes
Matched data: 2,494,071,037 bytes
File list size: 31,083,817
File list generation time: 2.424 seconds
File list transfer time: 0.000 seconds
Total bytes sent: 9,379,395
Total bytes received: 1,135,448,729

sent 9,379,395 bytes  received 1,135,448,729 bytes  35,225,480.74 bytes/sec
total size is 1,050,282,306,922  speedup is 917.41
#################### SYNC STEP 2 OF 2 IS OK ####################
Fri, 29 Dec 2017 12:11:41 +0100

Des fichiers réels complets sont sur http://fr.archive.ubuntu.com/log/

vivien

  • Administrateur
  • *
  • Messages: 28 628
    • Twitter LaFibre.info
Scripts pour mettre en place un serveur miroir Ubuntu
« Réponse #7 le: 19 janvier 2015 à 18:35:07 »
La supervision de votre miroir public

Si vous décidez de rendre votre miroir public, il sera supervisé par un robot pour vérifier que tout fonctionne bien.

Les organisme qui gère le serveur primaire mettent généralement un portail dédié public, pour suivre votre miroir.

Voici celui pour Libre office : http://download.documentfoundation.org/mirmon/#fr

Il permet de voir que les 13 miroirs français répondent bien mais il y a un miroir HS en Allemagne.
Il génère également un graphe qui permet de voir que la majorité des serveurs sont mis a jour au moins toutes les 12h.
- 134 miroirs ont des informations fraîches (vert)
- 0 miroir a des information légèrement périmés (bleu)
- 24 miroirs ne sont plus mis à jour depuis plusieurs jours (rouge)
- 26 miroirs ne répondent plus (noir)


vivien

  • Administrateur
  • *
  • Messages: 28 628
    • Twitter LaFibre.info
Scripts pour mettre en place un serveur miroir Ubuntu
« Réponse #8 le: 21 janvier 2015 à 17:34:59 »
En bonus, un script pour mettre le serveur à l'heure automatiquement sur un serveur NTP

La bonne pratique n'est pas de lancer ntpdate dans la crontab pile au début de la minute car sinon le serveur NTP va recevoir de nombreuses demandes en même temps.

La bonne pratique consiste à faire une pause pour le lancer aléatoirement pendant la minute. Mon script va donc faire une pause aléatoire entre 3 et 53 secondes pour que la mise à l'heure ne soit pas réalisée en début de minute :

Le script /etc/cron.d/maj-heure :

# Mise à jour de l'heure a 0h59 ; 4h59 ; 8h59 ; 12h59 ; 16h59 ; 20h59
59 */4 * * *    root    sleep 8s ; /usr/sbin/ntpdate ntp.lafibre.info >>/tmp/ntpdate.log 2>&1

Ce script va loguer ses mise à jour, ce qui permet de voire la dérive du serveur et vérifier que tout fonctionne :

Le log dans /tmp/ntpdate.log :

15 Jan 00:59:34 ntpdate[16803]: adjust time server 194.158.119.97 offset 0.080966 sec
15 Jan 04:59:35 ntpdate[39467]: adjust time server 194.158.119.97 offset 0.080640 sec
15 Jan 08:59:58 ntpdate[14143]: adjust time server 194.158.119.97 offset 0.080876 sec
15 Jan 12:59:44 ntpdate[39893]: adjust time server 194.158.119.97 offset 0.080222 sec
15 Jan 16:59:47 ntpdate[17443]: adjust time server 194.158.119.97 offset 0.081830 sec
15 Jan 20:59:52 ntpdate[43686]: adjust time server 194.158.119.97 offset 0.080411 sec
16 Jan 00:59:26 ntpdate[20585]: adjust time server 194.158.119.97 offset 0.081181 sec
16 Jan 04:59:14 ntpdate[44435]: adjust time server 194.158.119.97 offset 0.080655 sec
16 Jan 08:59:30 ntpdate[19954]: adjust time server 194.158.119.97 offset 0.081338 sec
16 Jan 12:59:58 ntpdate[46078]: adjust time server 194.158.119.97 offset 0.080702 sec
16 Jan 16:59:39 ntpdate[23495]: adjust time server 194.158.119.97 offset 0.080866 sec
16 Jan 21:00:01 ntpdate[755]: adjust time server 194.158.119.97 offset 0.080797 sec
17 Jan 00:59:33 ntpdate[26551]: adjust time server 194.158.119.97 offset 0.080924 sec
17 Jan 04:59:57 ntpdate[1676]: adjust time server 194.158.119.97 offset 0.081275 sec
17 Jan 08:59:38 ntpdate[25479]: adjust time server 194.158.119.97 offset 0.080773 sec
17 Jan 12:59:41 ntpdate[2526]: adjust time server 194.158.119.97 offset 0.081018 sec
17 Jan 16:59:34 ntpdate[28291]: adjust time server 194.158.119.97 offset 0.080643 sec
17 Jan 20:59:53 ntpdate[5594]: adjust time server 194.158.119.97 offset 0.081249 sec
18 Jan 00:59:41 ntpdate[31176]: adjust time server 194.158.119.97 offset 0.080753 sec
18 Jan 04:59:13 ntpdate[6328]: adjust time server 194.158.119.97 offset 0.080980 sec
18 Jan 08:59:17 ntpdate[30099]: adjust time server 194.158.119.97 offset 0.081102 sec
18 Jan 12:59:45 ntpdate[7053]: adjust time server 194.158.119.97 offset 0.081319 sec
18 Jan 16:59:23 ntpdate[33013]: adjust time server 194.158.119.97 offset 0.080566 sec
18 Jan 20:59:59 ntpdate[10553]: adjust time server 194.158.119.97 offset 0.081298 sec
19 Jan 00:59:18 ntpdate[35877]: adjust time server 194.158.119.97 offset 0.101786 sec
19 Jan 04:59:11 ntpdate[10719]: adjust time server 194.158.119.97 offset 0.049850 sec
19 Jan 08:59:25 ntpdate[34673]: adjust time server 194.158.119.97 offset 0.096863 sec
19 Jan 12:59:34 ntpdate[11794]: adjust time server 194.158.119.97 offset 0.072899 sec
19 Jan 16:59:38 ntpdate[37993]: adjust time server 194.158.119.97 offset 0.085440 sec

vivien

  • Administrateur
  • *
  • Messages: 28 628
    • Twitter LaFibre.info
Scripts pour mettre en place un serveur miroir Ubuntu
« Réponse #9 le: 21 janvier 2015 à 17:41:39 »
Bonus : Mettre en place un bonding 802.3ad pour utiliser plusieurs interfaces réseau et dépasser 1 Gb/s pour le miroir Ubuntu :

Attention : cela nécessite une configuration spécifique 802.3ad sur le switch auquel le serveur est connecté

Etherchannel - Bonding :

Coté linux, Etherchannel s'appelle bondind et se matérialise sous la forme d'un module disponible en standard dans le noyau. Comme pour le switch, on regroupe plusieurs interfaces physiques (ethx) sur une interface logique (nommée bondx, x est le numéro de l'interface). Les solutions offertes par le bonding sont nombreuses :

- Mode 0 : Round Robin (équilibrage de charge) : Ce mode augmente la bande passante et gère la tolérance de panne. Groupement de ports pour load balancing et Failover : Le trafic sortant de l'interface est émis alternativement sur chacune des interfaces. Les ports du switch sont groupés avec Etherchannel. Par contre la configuration est statique sans protocole PagP ou LACP (802.3ad).


- Mode 1 : Active - passive / Active backup : Failover seulement : Seule une des interfaces physique est active et répond au requêtes arp. Pas de propriétés particulière sur le switch.

- Mode 2 : Balance-XOR : Groupement de ports pour load balancing et Failover : Le switch est configuré en Etherchannel. Dans le sens sortant, le serveur Linux choisit l'interface physique en fonction de l'adresse mac (source ou destination, ou XOR sur les deux). Sur le switch Cisco, Etherchannel fonctionne aussi sur ce principe (le load balancing effectué sur le switch concerne le trafic entrant sur le serveur Linux). Ainsi les transferts sont parallélisés et le choix de l'interface suit la règle : (Adresse MAC de la source XOR Adresse MAC de la destination) modulo nombre d'interfaces.

- Mode 3 : Broadcast : Failover seulement : Le trafic est transmis sur toutes les interfaces physiques.

- Mode 4 : IEEE 802.3ad : Groupement de ports pour load balancing et Failover : Fonctionne les switchs Ethernet qui supportent cette norme. Le mécanisme de load blancing est similaire à celui du mode Balance-XOR.Il est basé sur le principe qui consiste à affecter toujours le même chemin à la même machine en fonction du couple IP source / IP destination / port. Cela implique que le switch gère le 802.ad et que les interfaces soient compatibles mii-tool et/ou ethtool.

La répartition du trafic se fait par un hash XOR (eXclusive OR ou OU exclusif) en fonction des arguments sélectionnables suivants :
  • les adresses MAC(source et ou destination)
  • les adresses IP (source et ou destination)
  • le port applicatif (destination)

Tous les ports d'un groupe doivent obligatoirement être paramétrés à la même vitesse, même duplex (full/half), même VLAN, même mode (access/trunk).

- Mode 5 : Adaptive transmit load balancing (balance-tlb) : Load balancing dans le sens sortant uniquement : Le trafic sortant de l'interface est émis de sur l'une ou l'autre des interfaces physique en fonction de le charge. Dans le sens entrant, une seule des interfaces physique répond au requêtes ARP. Aucune configuration particulière n'est nécessaire sur le switch. Les drivers de la carte ethernet sur le serveur Linux doivent être compatibles ethool.

- Mode 6 : Adaptative load balancing (balance-alb) : Load balancing dans les deux sens. Reprend le mécanisme balance-tlb dans le sens sortant. Dans le sens entrant, le bonding intercepte les requêtes ARP pour renvoyer alternativement l'adresse des interfaces physiques.
Adaptive load balancing : ce mode inclut en plus du tlb un load balancing sur le flux entrant et seulement pour un trafic IPV4. L'équilibrage est réalisé au niveau ARP. Le module intercepte les réponses pour y réécrire l'adresse MAC de l'une des interfaces du bond tout en tenant compte des spécificités du protocole ARP. La répartition entre les différentes interfaces, se fait de façon séquentielle ( round robin ).

Tous ces modes sont listés et expliqués dans la documentation du module bonding qui est livrée avec les sources du noyau. Cette même documentation est aussi accessible dans sa toute dernière mouture sur le site http://www.sourceforge.net/projects/bonding

Le mode 4 IEEE 802.3ad est conseillé avec des switch Cisco


Exemple de fichier de configuration en mode IEEE 802.3ad avec Ubuntu :
(mode 4 - conseillé avec un switch Cisco)

- Vérifier que le paquet pour gérer le bonding est bien installé (c'est généralement le cas avec les distributions serveur) :
apt install ifenslave-2.6

- Définition du type de bonding a utiliser :
nano -w /etc/modprobe.d/aliase-bond.conf


alias bond0 bonding
options bonding mode=4 xmit_hash_policy=layer3+4 miimon=100 downdelay=200 updelay=200

mode=4 : signifie que nous utilisons le mode 802.3ad
xmit_hash_policy=layer3+4 : choix de l'interface en upload via les info niveau 3 (IP source et IP destination) et 4 (port source et port destination). Par défaut c'est le niveau 2 (adresse mac) => Dans la cas d'un serveur avec une passerelle par défaut, tout le trafic hors du réseau local part via la même interface. Cela ne concerne que l'upload. Pour le download, la configuration se fait sur le switch.
miimon=100 : une vérification de l'état des interfaces physiques est effectuée toutes les 100ms.


-  Définition de l'interface réseau :
nano -w /etc/network/interfaces
# The primary network interface
#auto eth0
#iface eth0 inet dhcp

auto eth0
auto eth1
auto bond0
iface bond0 inet static
      address 138.21.127.54
      netmask 255.255.255.240
      network 138.21.127.48
      broadcast 138.21.127.63
      gateway 138.21.127.62
      up /sbin/ifenslave bond0 eth0 eth1
      down /sbin/ifenslave -d bond0 eth0 eth1

Certaines machines vont utiliser eth0 et d'autres eth1. A noter qu'un même PC, même protocole et même port peut utiliser eth0 en download et eth1 en upload.

En cas de panne d'une des deux liaisons, le trafic passe intégralement par l'autre.
En cas de ré-installation du serveur : l'accès internet est possible dès l'installation sans le bonding et sans re-configuration du routeur.

petrus

  • Expert AS206155
  • Expert
  • *
  • Messages: 781
Scripts pour mettre en place un serveur miroir Ubuntu
« Réponse #10 le: 23 janvier 2015 à 21:38:54 »
Voici les 3 scripts appelés depuis la crontab :

Pourquoi ne pas utiliser apt-mirror qui est fait pour ça ?

En bonus, un script pour mettre le serveur à l'heure automatiquement sur un serveur NTP

Idem, pourquoi utiliser ntpdate dans un cron au lieu de ntpd qui s'occupe de ça tout seul ?

De plus, ntpdate est basé sur du vieux code de ntpd qui n'a pas été maintenu.

BadMax

  • Client Free adsl
  • Modérateur
  • *
  • Messages: 3 340
  • Malissard (26)
Scripts pour mettre en place un serveur miroir Ubuntu
« Réponse #11 le: 24 janvier 2015 à 08:48:52 »
Deux remarques :
 - j'ai pas compris l'interet de lancer ntpdate régulièrement ? Normalement, on lance le daemon ntpd et c'est lui qui va maintenir la machine à l'heure. Ntpdate est utile si le retard à rattraper est supérieure à 1h d'où l'intéret de le lancer au démarrage de la machine au cas où l'heure BIOS serait erronnée
 - sur le bonding, l'utilisation du LACP/802.3ad nécessite une configuration sur le switch. Si le bonding n'est pas actif, normalement le switch n'active pas le trafic -> on est coupé. Il y a cependant plusieurs modes de configurations : forcé (on ne veut que du LACP) ou passif (on attend du LACP).

 

Mobile View