ZFS is een schitterend file-system met ontzettend veel mogelijkheden. (Automatische) snaphots zijn hierbij een erg krachtig middel voor backup doeleinden.
Een erg krachtig principe van het ZFS filesysteem zijn de zogenaamde snapshots. Je maakt dan als het ware een foto (moment-opname) van je huidige files op je ZFS Pool. Heb je bijvoorbeeld een file per ongeluk verwijderd dan kun je deze eenvoudig terughalen van de snapshot. Verder kun je een rollback uitvoeren van je filesysteem zoals deze was op het moment dat de snapshot is gemaakt. Belangrijk om te weten is het feit dat een snapshot read-only is.
Ik kan snapshots het eenvoudigste uitleggen met wat commando’s en voorbeelden. Log hiervoor in op je ZFS server met SSH.
Voor een overzicht van je ZFS pools type je het commando ‘zfs list’
zfs list NAME USED AVAIL REFER MOUNTPOINT Pool1 8.45T 2.27T 8.45T /mnt/Pool1 Pool2 4.70T 2.43T 4.70T /mnt/Pool2
Je ziet dat ik hier 2 ZFS pools heb met de namen ‘Pool1’ en ‘Pool2’ die je op de betreffende mountpoints (directories) kunt vinden.
Om een snapshot te maken met de naam ‘2014-12-22’ op je ZFS pool met de naam ‘Pool1’ type je het commando ‘zfs snapshot’.
zfs snapshot Pool1@2014-12-22
Om een overzicht van je gemaakte snapshots te krijgen typ je het commando ‘zfs list’.
zfs list -t snapshot NAME USED AVAIL REFER MOUNTPOINT Pool1@2014-12-22 141K - 8.45T -
Je ziet dat de snapshot zelf een minimale hoeveelheid data in beslag neemt. Deze hoeveelheid wordt meer als ik bijvoorbeeld een file verwijder op de originele ‘Pool1’. In dit voorbeeld ga ik nu een file van 7.8 MB deleten. Als ik nu kijk voor het overzicht dan zie je een toename in het gebruik.
zfs list -t snapshot NAME USED AVAIL REFER MOUNTPOINT Pool1@2014-12-22 741K - 8.45T -
De inhoud van de snapshot kun je vinden op de hidden ‘.zfs/snapshot’ directory van je Pool. Dat is in dit geval dus in de directory ‘/mnt/Pool1/.zfs/snapshot/2014-12-22’. Als je hier vervolgens kijkt dat zul je zien dat de verwijderde file nog wel aanwezig is.
Als ik nu een file toevoeg aan ‘Pool1’ dan zul je zien dat deze alleen in de originele ‘Pool1’ verschijnt en niet in de eerder gemaakte snapshot. Wel zie je een kleine toename in het snapshot gebruik daar dit natuurlijk wel ergens geadministreerd moet worden zodat ZFS weet wat er wel en niet in een snaphot zit. In dit voorbeeld heb ik een file van 867 KB gedownload in ‘Pool1’.
zfs list -t snapshot NAME USED AVAIL REFER MOUNTPOINT Pool1@2014-12-22 8.41M - 8.45T -
Bij de eerste verandering zie je een grote toename. Download ik echter nog een file van 7.8 MB dan zie je dat de toename al een stuk minder is.
zfs list -t snapshot NAME USED AVAIL REFER MOUNTPOINT Pool1@2014-12-22 8.42M - 8.45T -
Je kunt een snapshot ook eenvoudig renamen. In dit geval verander ik deze van ‘2014-12-22’ in ‘experiment’.
zfs rename Pool1@2014-12-22 Pool1@experiment zfs list -t snapshot NAME USED AVAIL REFER MOUNTPOINT Pool1@experiment 8.42M - 8.45T -
Om terug te keren naar de inhoud van je Pool zoals deze was toen de snapshot werd gemaakt gebruik je het command ‘rollback’. Let op dat dit even tijd in beslag kan nemen.
zfs rollback Pool1@experiment zfs list -t snapshot NAME USED AVAIL REFER MOUNTPOINT Pool1@experiment 141K - 8.45T -
Om een snapshot te verwijderen gebruik je het commando ‘destroy’.
zfs destroy Pool1@experiment zfs list -t snapshot no datasets available
Zoals je ziet is een snapshot een erg krachtige functie van het ZFS filesysteem. Een erg goede uitleg over nog meer zaken rondom ZFS kun je hier vinden.
Is dit te vergelijken met TimeBackup op mijn MAC of doet dit meer?
Dit is inderdaad te vergelijken met Timemachine van Apple. Je kunt echter nog veel meer. Zo kun je behalve een snapshot ook een clone maken. Dit is dan een read/write image van het filesysteem op een bepaald tijdstip. Dit doe je met het commando ‘zfs clone’. Een voorbeeld om dit te verduidelijken:
# zfs snapshot Pool1@2015-01-01
# zfs clone Pool1@2015-01-01 Pool1/clone
# zfs list -r Pool1
NAME USED AVAIL REFER MOUNTPOINT
Pool1 8.53T 2.19T 8.53T /mnt/Pool1
Pool1/clone 12.8K 2.19T 8.53T /mnt/Pool1/clone
Verwijderen gaat weer op dezelfde manier:
# zfs destroy Pool1/clone
# zfs destroy Pool1@2015-01-01
Dit alles werkt met slimme implementaties die gebruik maken van file-pointers. Zoals je ziet zijn dit erg krachtige filesystem principes.