# Création de snapshots de système de fichiers XFS {{INLINETOC}} L'atelier consiste à reprendre les données des répertoires `/data/ops` et `/data/petra` de l'ancien serveur vers le partage NFS du nouveau serveur, et d'ammorcer les snapshots journaliers avec des liens physqiues comme POC. Les dossiers dans lesquels sont hébergés ces liens sont libellés avec le numero du jour du mois ``` mkdir -pv /data/backups/{01..31}/ops /data/backups/{01..31}/petra ``` Contrairement aux snapshots btrfs ou xfs, les images créées avec cette méthode sont interdépendantes, les fichiers référencés avec un lien physique sont ceux de la source. Si on altère le source on altère le fichier référencé dans le dossier de backup et vice-versa, mais lorsqu'on détruit l'inode de la source le fichiers hard linked subsistent. ## Les scripts de synchronisation Les Scripts ont la même structure et déroulent le même algorithme: - synchronisation du dossier `/data` de l'ancien serveur sur le partage nfs du nouveau serveur - si le sous-dossier existe dans le dossier du jour précédent((le script est programmé avant la sauvegarde du jour c'est à dire après la sauvegarde de la veille)) on le détruit - création du sous-dossier de la sauvegarde dans le dossier correspondant au jour précédent((le script est programmé avant la sauvegarde du jour c'est à dire après la sauvegarde de la veille)) - synchronisation des sous-dossiers sources(dossiers dans le partage nfs) dans les sous-dossiers de `backups/` du jour précédent((le script est programmé avant la sauvegarde du jour c'est à dire après la sauvegarde de la veille)) ``` cat > ~/syncro-nfsshare-ops.sh << 'EOF' #!/bin/bash # Script pour faire un snapshot en utilisant les liens physiques set -o errexit set -o nounset set -o pipefail readonly SOURCE_DIR="/data/ops/" readonly BACKUP_DIR="/nfsshare/ops/" LC_TIME="fr_FR.UTF-8" BACKUP_PATH="/nfsshare/backups/$(date -d yesterday +%d)/ops/" rsync -av --delete ${SOURCE_DIR} ${BACKUP_DIR}>> /root/synchro-nfsshare-ops.log LC_TIME="fr_FR.UTF-8" TIMEFORMAT="Sauvegarde ${SOURCE_DIR} de "$(date -d yesterday +%A)" en %R secondes ..." { time { cd ${BACKUP_DIR} for _rep in */ ; do echo "ammorce de ${BACKUP_PATH}${_rep%/}/" LATEST_LINK="${BACKUP_PATH}${_rep%/}/" if [ -d "${LATEST_LINK}" ] then rm -rf "${LATEST_LINK}" fi mkdir -p "${LATEST_LINK}" # La commande cp ci-dessous equivaut à la commande rsync avec --link-dest # cp -al "${BACKUP_DIR}/${_rep}" "${LATEST_LINK}" rsync -a --link-dest="${BACKUP_DIR}/${_rep}" "${BACKUP_DIR}/${_rep}" "${LATEST_LINK}" touch "${LATEST_LINK}/$(date -d yesterday +%A-%w-%d)" done "$@" 2>&3 } } 3>&2 2>> /root/synchro-nfsshare-ops.log tail -n40 /root/synchro-nfsshare-ops.log | mailx -s "synchro nfsshare ops $(date)" -S smtp=smtp://smtp.oc.dgfip:25 -S from="esi.marseille.snsreseau@dgfip.finances.gouv.fr" esi.marseille.snsreseau@dgfip.finances.gouv.fr EOF ``` ``` cat > ~/syncro-nfsshare-petra.sh << 'EOF' #!/bin/bash # Script pour faire un snapshot en utilisant les liens physiques set -o errexit set -o nounset set -o pipefail readonly SOURCE_DIR="/data/petra/" readonly BACKUP_DIR="/nfsshare/petra/" LC_TIME="fr_FR.UTF-8" BACKUP_PATH="/nfsshare/backups/$(date -d yesterday +%d)/petra/" rsync -av --delete ${SOURCE_DIR} ${BACKUP_DIR}>> /root/synchro-nfsshare-petra.log LC_TIME="fr_FR.UTF-8" TIMEFORMAT="Sauvegarde ${SOURCE_DIR} de "$(date -d yesterday +%A)" en %R secondes ..." { time { cd ${BACKUP_DIR} for _rep in */ ; do echo "ammorce de ${BACKUP_PATH}${_rep%/}/" LATEST_LINK="${BACKUP_PATH}${_rep%/}/" if [ -d "${LATEST_LINK}" ] then rm -rf "${LATEST_LINK}" fi mkdir -p "${LATEST_LINK}" # La commande cp ci-dessous equivaut à la commande rsync avec --link-dest # cp -al "${BACKUP_DIR}/${_rep}" "${LATEST_LINK}" rsync -a --link-dest="${BACKUP_DIR}/${_rep}" "${BACKUP_DIR}/${_rep}" "${LATEST_LINK}" touch "${LATEST_LINK}/$(date -d yesterday +%A-%w-%d)" done "$@" 2>&3 } } 3>&2 2>> synchro-nfsshare-petra.log tail -n40 /root/synchro-nfsshare-petra.log | mailx -s "synchro nfsshare petra $(date)" -S smtp=smtp://smtp.oc.dgfip:25 -S from="esi.marseille.snsreseau@dgfip.finances.gouv.fr" esi.marseille.snsreseau@dgfip.finances.gouv.fr EOF ``` ## Les tests de synchronisation ### Première synchronisation ^ source ^^ cible ^^ backup mercredi ^^ ^ chemin ^ volumétrie ^ chemin ^ volumétrie ^ chemin ^ volumétrie ^ | /data/petra | 929G | /data/petra | 929G | /data/backups/mercredi/petra | 929G | | /data/ops | 254G | /data/ops | 254G | /data/backups/merceredi/ops | 254G | | Total | 1,2T | | 1,2T | | 1,2T | | Sur Disque | 1,2T | | 1,2T | | <1G | En regardant le fichier `o51e/home/nagios/MegaSAS.log` on observe que les deux versions du fichier sont identiques (même inode, même taille et même date) ``` ls -ali /data/ops/o51e/home/nagios/MegaSAS.log 6232096771 -rw-r--r--. 1 root root 4827776011 28 déc. 20:40 /data/ops/o51e/home/nagios/MegaSAS.log ls -ali /data/backups/mercredi/ops/o51e/home/nagios/MegaSAS.log 6232096771 -rw-r--r--. 1 root root 4827776011 28 déc. 20:40 /data/backups/mercredi/ops/o51e/home/nagios/MegaSAS.log ``` Si on altère le contenu du clone de backup on s'aperçoit qu'on affecte aussi le fichier source, il s'agit bien d'un lien physique: ``` echo "ligne ajoutée">> /data/backups/mercredi/ops/o51e/home/nagios/MegaSAS.log ls -ali /data/backups/mercredi/ops/o51e/home/nagios/MegaSAS.log 6232096771 -rw-r--r--. 2 root root 4829513818 30 déc. 07:27 /data/backups/mercredi/ops/o51e/home/nagios/MegaSAS.log ls -ali /data/ops/o51e/home/nagios/MegaSAS.log 6232096771 -rw-r--r--. 2 root root 4829513818 30 déc. 07:27 /data/ops/o51e/home/nagios/MegaSAS.log ``` ### Deuxième synchronisation ^ source ^^ cible ^^ backup mercredi ^^ backup jeudi ^^ ^ chemin ^ volumétrie ^ chemin ^ volumétrie ^ chemin ^ volumétrie ^ chemin ^ volumétrie ^ | /data/petra | 929G | /data/petra | 929G | /data/backups/mercredi/petra | 929G | /data/backups/Thirsday/petra | 929G | | /data/ops | 254G | /data/ops | 254G | /data/backups/merceredi/ops | 254G | /data/backups/Thirsday/ops | 254G | | Total | 1,2T | | 1,2T | | 1,2T | | 1,2T | | Sur Disque | 1,2T | | 1,2T | | <1G | | <1G | En regardant le fichier `o51e/home/nagios/MegaSAS.log` on observe: ``` ls -ali /data/ops/o51e/home/nagios/MegaSAS.log 6175290448 -rw-r--r--. 2 root root 4829513803 29 déc. 20:40 /data/ops/o51e/home/nagios/MegaSAS.log ls -ali /data/backups/Thursday/ops/o51e/home/nagios/MegaSAS.log 6175290448 -rw-r--r--. 2 root root 4829513803 29 déc. 20:40 /data/backups/Thursday/ops/o51e/home/nagios/MegaSAS.log ls -ali /data/backups/mercredi/ops/o51e/home/nagios/MegaSAS.log 6232096771 -rw-r--r--. 1 root root 4827776011 28 déc. 20:40 /data/backups/mercredi/ops/o51e/home/nagios/MegaSAS.log ``` - que les fichier `/data/ops/o51e/home/nagios/MegaSAS.log` et `/data/backups/Thursday/ops/o51e/home/nagios/MegaSAS.log` sont identiques (même inode, même taille et même date) - que le lien physique `/data/backups/mercredi/ops/o51e/home/nagios/MegaSAS.log` pointe vers l'ancien fichier, qui subsiste bien que la dernière synchronisation ait écrasé la source((Un fichier n'est totalement supprimé que lorsque tous les liens vers l'inode ont été supprimés, l'inode lui-même sera supprimé)). ### Autres synchronisations On observe une augmentation de la taille sur le disque dur, mais pas autant que le cumul des sauvegardes quotidiennes ^ Sauvegarde ^ Nombre((en comptant la sauvegarde source)) ^ Taille sur le disque ^ | Mercredi | 2 | 1,2T | | Jeudi | 3 | 1,3T | | Vendredi | 4 | 1,3T | | Lundi | 7((en comptant les sauvegardes de samedi et dimanche)) | 1,4T | ## Programmation des sauvegardes ### Configuration de crontab Pour ajouter aou modifier **crontab** utiliser la commande `crontab -e`: ``` # minute heure jour-du-mois numero-du-mois jour-de-la-semaine(6=samedi) #0 8 25 8 6 rsync -avP /data/ops/o13e /data/ops-o13e-25aout2018/ 2>&1 >> /data/sauveOPS.log ``` ### Chronogramme des travaux 0h00 24h00 24h00 | J-1 | J | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | ^ ^ | ^ ^ ^ | | 12h00 | | | | | ^ li87a| | | | | 20h00| | | | | | | | | | t13a | | | | 21h30 | | | | t51a | | | | 21h40 | | | | t63a | | | | 21h50 | | | | t44a | | | | 21h55 | | | | t44c | | | 1h10 | | | t44v | | | 1h20 | | | st67a | | 3h00 | | t13a | 5h30 | t51a | 5h40 | t63a | 5h50 | t44a | 5h55 | syncro nfsshare 12h00