Suite à une grosse refonte de mon architecture informatique, je voulais pouvoir "ranger" mieux certaines choses.
Voici le "topo":
- les snapshots ZFS, c'est bien mais c'est propre au FS (Files Système), c'est à dire que çà ne fonctionne que sur ZFS
- les backup-rsync c'est bien, mais faut les faire au fil de l'eau (l'avantage, c'est que c'est des fichiers normaux, donc, qui ne sont pas liées au FS)
... alors, je me suis dis qu'il serait sans doute possible de faire des rsync de snapshots dans un répertoire "backup-rsync (dédié aux rsync)".
Pour faire cela, il faut passer par des clones de snapshots, et là le rsync devient possible facilement.
Seulement c'est lourd et il faut être attentif à ce qu'on fait ...
le principe c'est:
un pool "rpool" qui contient des datasets (comme nas1_marc)
ce pool contient par exemple:
rpool/nas2_marc (le dataset ou jeu de volume)
rpool/nas2_marc@auto-20180213-060000
rpool/nas2_marc@auto-20180214-060000
rpool/nas2_marc@snap
rpool/nas2_marc@unautresnapshot
rpool/nas2_marc@auto-20180217-060000
rpool/nas2_marc@auto-20180218-060000
le but est de faire un rsync entre rpool/nas2_marc@auto-20180213-060000 et rpool/nas2_marc@auto-20180214-060000, dans un répertoire contenant le même nom que le snapshot (en remplaçant le @ par -) et ensuite de supprimer rpool/nas2_marc@auto-20180213-060000.
Pour cela il faut:
1) au moins 2 datasets
ensuite,
2) il faut transformer les 2 datasets en clones pour avoir une structure de fichiers normale
puis,
3) faire le rsync (avec l'option backup)
puis,
4) supprimer les clones et le dataset le plus ancien
A chaque lancement du script, un dataset est éliminé, et, si il n'y en a plus assez, le script s'arrête.
De cette façon, on se retrouve avec
la disparition du datatset rpool/nas2_marc@auto-20180213-060000
la différence entre ( rpool/nas2_marc-auto-20180213-060000 et rpool/nas2_marc-auto-20180213-060000 ) rangé dans un répertoire dédié: rpool/BACKUP_nas2/rpool/nas2_marc-auto-20180214-060000 qui se trouvera dans une zone de backup qui se trouve extérieur au pool.
(dans mon cas, je fais le backup dans le même pool, mais sinon, çà donnerait: unautrepool/BACKUP_nas2/rpool/nas2_marc-auto-20180214-060000)
Chaque lancement du script "mange" le plus ancien snapshot et crée en échange un backup-rsync avec le même nom que le snapshot (avec un - à la place du @)
J'ai mis une petite sécurité, car si il y a moins de 2 snapshots, çà grignote l'arborescence du système ... ce qui ... est un peu gênant
J'ai donc fait un script qui permet de faire çà.
Attention ! je ne suis pas "bon" en script, je me débrouille comme je peux, donc c'est juste pour info, et c'est sans doute "mal fait", mais çà permet d'atteindre l'objectif, c'est l'essentiel
Donc, c'est juste à titre indicatif, juste pour partager
Il ne faut pas l'utiliser tel quel, mais l'analyser avant, il y a des choses à améliorer !
Voici le script (il y a quelques commentaires)
#!/bin/bash
echo "";echo "=[debut]======================================";
echo "";
echo "type="$1" (genre nas1 ou nas2)";
echo "pool="$2;
echo "dataset="$3;
echo "faire ctrl-c si pas bon";
read ligne;
sleep 1
# chemin zfs (sans le / devant)
chz=$2"/"$3;
if [ -d /$chz ]
then
# le chemin est bon
echo "pool="$2" dataset="$3" répertoire OK";
else
# le chemin zfs n'est pas bon, on sort
echo "PB param";
exit
fi
# création d'une liste de snapshot (filtrée)
zfs list -H -o name -t snapshot | grep $chz"@" | xargs -n1 >./listsnap;
# on vérifie si il y a au moins 2 snapshots
lgfich=`cat ./listsnap | wc -l`;
if [ $lgfich -lt 3 ]
then
echo "!!! pas assez de snapshots !!! ("$lgfich")";
zfs snapshot $chz@`date +%Y-%m-%d_%Hh%M%S`;
echo "un snapshot a été crée - relancer le script";
exit
else
echo "Nbr de snapshots OK ("$lgfich")";
fi
# on fait un double
cp ./listsnap ./listsnap2;
# on enlève les @ dans la liste2
sed -i -e "s/@/-/g" ./listsnap2;
# on lit la première ligne (dataset@snapshot)
lig1=`sed -n 1p ./listsnap`;
# on lit la première ligne (dataset)
lig1sar=`sed -n 1p ./listsnap2`;
# on lit la deuxième ligne (dataset@snapshot)
lig2=`sed -n 2p ./listsnap`;
# on lit la deuxième ligne (dataset)
lig2sar=`sed -n 2p ./listsnap2`;
echo "";
echo "source..........="$lig1sar;
echo "destinantion....="$lig2sar;
echo "";
# on crée un clone du premier dataset (pour avoir un chemin de destination)
echo "création du clone source";
zfs clone $lig1 $lig1sar && echo "OK";
# on crée un clone du deuxième dataset (pour avoir un chemin de destination)
echo "création du clone destination";
zfs clone $lig2 $lig2sar && echo "OK";
### le but est de faire un rsync du premier snapshot sur le suivant ###
# affichage du rsync;
echo"";
echo "rsync -vrht --stats --progress --del --force --ignore-errors --backup --backup-dir=/rpool/BACKUP_"$1"/"$lig1sar"/ /"$lig1sar"/ /"$lig2sar"/";
rsync -vrht --stats --progress --del --force --ignore-errors --backup --backup-dir="/rpool/BACKUP_"$1"/"$lig1sar /$lig1sar/ /$lig2sar/;
echo "";
# on supprime la source qui a servit à faire le rsync (snapshot+clone)
zfs destroy -R $lig1;
# on supprime uniquement le clone
zfs destroy $lig2sar;
# on montre ce qu'il reste comme datasets (doit toujours être supérieur ou égal à 2)
zfs list | grep $3;
echo "";
echo "=[fin]================================================";
Voilà, de cette façon, je grignote mes datasets et je retrouve les différences de ces derniers dans les répertoires adéquats.
Je vais sans doute améliorer "la chose" avec un réportoire "current" dans la zone de backup-rsync (qui sera la différence entre le dernier snapshot et le dataset), c'est à dire en gros un rsync du dataset(clone) vers snapshot(clone)
soit par un autre script ou un ajout dans le script ci-dessus
Comme je suis du genre à déplacer des "trucs" (ou éventuellement les déplacer et renommer), je mettrai peut-être la zone de backup-rsync en déduplication.
