Les instantanés sont importants que vous exécutiez une simple machine virtuelle sur votre ordinateur personnel ou qu’il s’agisse d’une base de données d’entreprise qui est constamment mise à jour et modifiée. Disposer d’instantanés, c’est-à-dire d’une copie de l’ensemble du système de fichiers tel qu’il était à une période donnée est important.
Les gens perdent souvent la trace de ce qui a mal tourné, un fichier a été supprimé et personne n’a remarqué sa disparition. Plusieurs sauvegardes sont passées et maintenant vous réalisez qu’un fichier important est absent de toutes les sauvegardes disponibles des 5 dernières semaines. Dans ce tutoriel, nous allons voir comment utiliser les instantanés ZFS et aborder les différentes politiques d’instantanés qui fonctionneraient de manière optimale, à la fois en termes d’utilisation des ressources et de possibilité de récupération.
ZFS a à la fois la vue d’ensemble de haut niveau des fichiers et des répertoires et comprend comment les données sont écrites sur le disque. Lorsque l’on écrit physiquement des données sur un disque, cela se fait par blocs discrets. En général, la taille des blocs peut aller jusqu’à 1 Mo, mais la valeur par défaut est généralement de 128 Ko. Maintenant, cela signifie que chaque modification (lecture, écriture ou suppression) se produira dans les blocs discrets.
Le mécanisme de copie sur écriture garantit que chaque fois qu’un bloc est modifié, au lieu de modifier le bloc directement, il fait une copie du bloc avec les modifications requises effectuées sur le nouveau bloc.
Ceci est particulièrement utile dans les cas où, disons, il y a une panne de courant et votre système se plante pendant que de nouvelles données étaient écrites sur le disque. Si cela se produit dans un système de fichiers traditionnel, vos fichiers seront corrompus ou laissés avec des trous. Mais si vous utilisez ZFS, vous pouvez perdre la transaction en cours alors que cela se produisait, mais le dernier état valide de vos fichiers sera toujours laissé intact.
Les instantanés reposent également sur cette fonctionnalité, et assez fortement en fait. Lorsque vous prenez un instantané d’un ensemble de données donné (‘ensemble de données’ est le terme ZFS pour un système de fichiers), ZFS enregistre simplement l’horodatage lorsque l’instantané a été fait. Et c’est tout ! Aucune donnée n’est copiée et aucun stockage supplémentaire n’est consommé.
C’est seulement lorsque le système de fichiers change, et que les données qu’il contient divergent de l’instantané, que l’instantané commence à consommer du stockage supplémentaire. Ce qui se passe sous le capot est le suivant – Au lieu de recycler les anciens blocs au fil du temps, ZFS les conserve. Cela améliore également l’utilisation du stockage. Si vous faites un instantané d’un ensemble de données de 20 Go et que vous modifiez seulement quelques fichiers texte ici et là, l’instantané peut ne prendre que quelques Mo d’espace.
Création d’instantanés
Pour démontrer l’utilisation des instantanés, commençons par un ensemble de données qui a beaucoup de fichiers texte, juste pour garder la question simple. La machine virtuelle que j’utiliserai pour la démonstration fonctionne sous FreeBSD 11.1-RELEASE-p3 qui est la dernière version stable disponible au moment de la rédaction de ce document. Le système de fichiers racine est monté sur le pool zroot par défaut et beaucoup de répertoires familiers comme /usr/src, /home, /etc sont tous leurs propres ensembles de données montés sur zroot. Si vous ne savez pas ce que signifie un pool (ou un zpool), dans le jargon ZFS, cela vaudrait la peine de le lire avant de continuer.
Un des nombreux systèmes de fichiers, ou ensembles de données, qui viennent par défaut sur FreeBSD est : zroot/usr/src
Pour regarder ses propriétés, exécutez la commande suivante.
:~$ zfs list zroot/usr/src
Comme vous pouvez le voir il utilise 633 Mo de stockage. Il contient toute l’arborescence des sources du système d’exploitation.
Prenons un instantané de zroot/usr/src
:~$ zfs snapshot zroot/usr/
Le symbole @ agit comme un délimiteur entre le jeu de données et le nom de l’instantané, qui dans notre cas est snapshot1.
Maintenant regardons l’état du snapshot lors de sa création.
En exécutant la commande :
zfs list -rt all zroot/usr/src
Vous pouvez voir que le snapshot n’utilise aucun espace supplémentaire lors de sa naissance. Il n’y a pas non plus d’espace disponible, car comme il s’agit d’un jeu de données strictement en lecture seule, l’instantané lui-même ne peut pas croître, modifier ou rétrécir. Enfin, il n’est monté nulle part ce qui le rend complètement isolé de la hiérarchie du système de fichiers donnée.
Maintenant, supprimons le répertoire sbin dans /usr/src/
:$ rm /usr/src/sbin
En regardant l’instantané, vous verrez maintenant qu’il a grandi,
Ceci est attendu parce que le mécanisme de copie sur écriture est à l’œuvre ici et que la suppression (ou la modification) des fichiers a conduit à ce que plus de données soient associées uniquement à l’instantané et non au jeu de données réellement utilisé.
Notez la colonne REFER dans la sortie ci-dessus. Elle vous donne la quantité de données accessibles sur le jeu de données alors que la colonne USED vous montre juste la quantité d’espace occupé sur le disque physique.
Le mécanisme Copy-On-Write de ZFS donne souvent ces résultats contre-intuitifs où la suppression d’un fichier donnerait l’impression que plus d’espace est maintenant utilisé qu’avant. Cependant, ayant lu jusqu’ici, vous savez ce qui se passe réellement !
Avant de terminer, récupérons la sbin du snapshot1. Pour ce faire, il suffit d’exécuter :
:/usr/src$ zfs rollback zroot/usr/
Politique d’instantanés
La prochaine question à poser est la suivante : à quelle fréquence voulez-vous prendre les instantanés ? Bien que cela puisse varier d’une entreprise à l’autre, prenons l’exemple d’une base de données très dynamique qui change de temps en temps.
Pour commencer, vous prendriez des instantanés toutes les 6 heures environ, mais comme la base de données change beaucoup, il deviendrait rapidement infaisable de stocker tous les nombreux instantanés créés. Donc, l’étape suivante serait de purger les instantanés qui sont plus anciens que, disons, 48 heures.
Maintenant, le problème serait de récupérer quelque chose qui a été perdu il y a 49 heures. Pour contourner ce problème, vous pouvez garder un ou deux instantanés de cet historique de 48 heures et les conserver pendant une semaine. Purgez-les quand ils deviennent plus vieux que cela.
Et si vous pouvez continuer ainsi, vous pourriez entasser des instantanés jusqu’à la genèse même du système, juste par ordre décroissant de fréquence. Enfin, je tiens à souligner que ces instantanés sont en LECTURE SEULE, ce qui signifie que si vous êtes infecté par un ransomware et que toutes vos données sont cryptées (modifiées). Ces instantanés seraient, très probablement, toujours intacts.