# 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