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à.