Gérer des sauvegardes locales avec ZFS et zfstools
Gérer des sauvegardes locales avec ZFS et zfstools Depuis quelques années j’utilise sur FreeBSD et depuis qu’il est disponible sur cet OS, le système de fichiers ZFS.
Notamment, ZFS dispose d’un système de snapshots ou d’instantanés qui permet de créer une image du système de fichier à un instant t.
Alors pourquoi ne pas utiliser, cette possibilité comme système de sauvegarde locale (un peu comme Time Machine le fait sur OS X).
Je m’étais créé des scripts « maison » qui font leur office sans problème. Et voilà (non l’article n’est pas fini) que je trouve quelques minutes pour jeter un oeil à zfstools.
Je teste le biniou et le résultat est impeccable : les mêmes fonctions que mon script avec des raffinements en plus.
Du coup, je bazarde mes scripts « maison » et passe en production les zfstools.
Petit tour d’horizon
Ça c’est ce que j’ai sur mon serveur utilisant ZFS.
➜ c2 ~ zfs list
NAME USED AVAIL REFER MOUNTPOINT
Services 15,1G 200G 34K /Services
Services/Users 7,11G 200G 7,10G /Services/Users
Services/db 17,5M 200G 16,8M /Services/db
Services/mail 7,91G 200G 7,88G /Services/mail
System 8,02G 11,6G 1,08G /
System/tmp 27,3M 11,6G 27,3M /tmp
System/usr 3,13G 11,6G 1,35G /usr
System/usr/local 973M 11,6G 973M /usr/local
System/usr/ports 848M 11,6G 344M /usr/ports
System/usr/ports/distfiles 1,95M 11,6G 1,95M /usr/ports/distfiles
System/usr/ports/packages 503M 11,6G 503M /usr/ports/packages
System/var 3,71G 11,6G 66,2M /var
System/var/db 3,34G 11,6G 3,29G /var/db
System/var/db/pkg 47,7M 11,6G 47,7M /var/db/pkg
System/var/empty 31K 11,6G 31K /var/empty
System/var/log 311M 11,6G 311M /var/log
System/var/tmp 502K 11,6G 502K /var/tmp
Users 61,7G 165G 60,5G /Users
Zfstools utilise la propriété ZFS com.sun:auto-snapshot pour savoir s’il doit réaliser un instantané / snapshot. Sur un nouveau système, cette propriété est non définie :
➜ c2 ~ zfs get com.sun:auto-snapshot
<snip>
Services com.sun:auto-snapshot - -
<snip>
Définir un système de fichier comme non éligible
Pour définir la propriété de façon à ce que le système ne soit pas considérer par zfstools comme éligible au snapshot :
➜ c2 ~ zfs set com.sun:auto-snapshot=false System/tmp
Ainsi on doit voir désormais :
➜ c2 ~ zfs get com.sun:auto-snapshot System/tmp
NAME PROPERTY VALUE SOURCE
System/tmp com.sun:auto-snapshot false local
On réalise la même opération pour tous les systèmes que l’on ne veut pas snapshoter et enfin on rend éligible l’ensemble à zfstools à la prise d’instantanés :
➜ c2 ~ zfs set com.sun:auto-snapshot=true System
Ainsi tous les systèmes de fichiers vont hériter de la propriété du zpool parent.
Test in electro veritas
Maintenant, on va tester en ligne de commande le bon fonctionnement. zfs-auto-snapshot
prend 2 arguments : le nom de l’instantané et le nombre d’instantanés à conserver :
➜ c2 ~ /usr/local/sbin/zfs-auto-snapshot frequent 4
Dans cet exemple (tiré de la configuration par défaut), l’instantané va s’appeler frequent
et 4 instantanés seront conservés, les plus anciens seront supprimés.
Après avoir exécuté la commande :
➜ c2 ~ zfs list -t snapshot
NAME USED AVAIL REFER MOUNTPOINT
System@zfs-auto-snap_daily-2014-10-18-00h07 0 - 1,08G -
Passage en prod
En reprenant la suggestion faite dans l’exemple distribué avec zfstools :
➜ c2 ~ cat /etc/crontab
<snip>
15,30,45 * * * * root /usr/local/sbin/zfs-auto-snapshot frequent 4
0 * * * * root /usr/local/sbin/zfs-auto-snapshot hourly 24
7 0 * * * root /usr/local/sbin/zfs-auto-snapshot daily 7
14 0 * * 7 root /usr/local/sbin/zfs-auto-snapshot weekly 4
28 0 1 * * root /usr/local/sbin/zfs-auto-snapshot monthly 12
Cela donne :
- 4 instantanés espacés de 15 minutes
- 24 instantanés toutes les heures
- 7 journaliers
- 4 hebdos
- 12 mensuels
En fait, un vrai système de sauvegarde incrémental respectant les bonnes pratiques minimales.
Sinon un truc, zfstools est écrit en ruby : ne pas oublier d’ajouter à la variable PATH
le chemin pour accéder à l’interpréteur ruby et surtout l’ajouter à la crontab
:
➜ c2 ~ head /etc/crontab
# /etc/crontab - root's crontab for FreeBSD
<snip>
SHELL=/bin/sh
PATH=/etc:/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin
Comme sur des roulettes
➜ c2 ~ zfs list -t snapshot
NAME USED AVAIL REFER MOUNTPOINT
System@zfs-auto-snap_daily-2014-10-18-00h07 0 - 1,08G -
System@zfs-auto-snap_hourly-2014-10-18-18h00 0 - 1,08G -
System@zfs-auto-snap_frequent-2014-10-18-18h30 0 - 1,08G -
Petit raffinement
zfstools créé un instantané même quand aucune modification n’est intervenue depuis du dernier instantané : ce nouvel instantané aura une taille nulle. Comme il ne sert à rien, autant le supprimer. Justement zfstools vient avec un outil appelé zfs-cleanup-snapshots
dont l’unique mission est justement de supprimer tous les instantanés de 0 octet.
On ajoute dans /etc/crontab
:
*/20 * * * * root /usr/local/sbin/zfs-cleanup-snapshots
Conclusion
zfstools permet de se créer une sauvegarde locale sans trop se fatiguer et sans fichier de configuration. Que demander de plus ? Peut-être la possibilité d’envoyer les instantanés sur une machine distante ? Peut-être la missions de zfs-backup dont on pourrait parler dans un billet futur ?
Enfin pour le moment, c’est un bon début ;-)
Et voilà.