In
meinem Artikel zu ZFS bin ich auf meine ersten Schritte mit ZFS eingegangen.
Nun will ich etwas mit der Snapshot-Funktion spielen, die Backups sehr vereinfacht...
Zuerst lege ich mir natürlich erstmal ein frisches Dateisystem an. ;)
Und dann kommen da ein paar Dateien rein:
# zfs create tank/testfs
# dd if=/dev/urandom of=file1 bs=1k count=2048
# dd if=/dev/urandom of=file2 bs=1k count=2048
Gehen wir davon aus die Dateien seien mehr als Zufallsmüll, und machen einen Snapshot:
# zfs snapshot tank/testfs@firstsnapshot
# dd if=/dev/urandom of=file3 bs=1k count=2048
# zfs list
NAME USED AVAIL REFER MOUNTPOINT
tank/testfs 6.04M 423M 6.03M /tank/testfs
tank/testfs@firstsnapshot 17K - 4.02M -
Nach dem Snapshot wurde das Dateisystem natürlich weiter benutzt. Der Snapshot selber belegt nur wenig Platz für Metadaten, ZFS gibt aber an wie viele Daten REFER-enziert werden.
Nun schnell mal die Daten wegsichern:
# zfs send tank/testfs@firstsnapshot > ~/testfs-firstsnapshot
# ls -alh ~/testfs-firstsnapshot
-rw-r--r-- 1 root root 4.1M 2007-11-11 00:43 /root/testfs-firstsnapshot
Statt dem redirect könnte ich natürlich auch in netcat usw pipen, und Backups übers Netz schicken...
Übers Netz schicken? Komplette Dateisysteme mit mehreren Gigabyte? Muss nicht sein, die Snapshots entstehen ja logischerweise eh inkrementell, wir können sie auch so verschicken:
# zfs snapshot tank/testfs@20071111
# dd if=/dev/urandom of=file3 bs=1k count=1024 skip=512
# zfs snapshot tank/testfs@20071111-2
# zfs send -i 20071111 tank/testfs@20071111-2 > ~/testfs-20071111-2
# ls -alh ~/testfs-20071111-2
-rw-r--r-- 1 root root 1.1M 2007-11-11 00:47 /root/testfs-20071111-2
Zwischen dem Snapshot 20071111 und 20071111-2 wurde 1MB in file3 verändert, genau dieser wird beim inkrementellen (-i) senden des Snapshots dann auch gespeichert. file3 ist insgesamt natürlich 1,5 MB groß.
Nun habe ich einige Snapshots gesammelt:
# zfs list
NAME USED AVAIL REFER MOUNTPOINT
tank/testfs 7.06M 422M 5.03M /tank/testfs
tank/testfs@firstsnapshot 17K - 4.02M -
tank/testfs@20071111 2.02M - 6.03M -
tank/testfs@20071111-2 0 - 5.03M -
und entschieden das ich gerne meinen Ausgangszustand aus dem ersten Snapshot wieder hätte:
/tank/testfs# zfs rollback -r tank/testfs@firstsnapshot
umount: /tank/testfs: device is busy
Ja, rollback ist das erste Kommando welches ein kurzes Aushängen des Dateisystems erfordert, das mir begegnet.
Also raus aus dem Verzeichnis, und nochmal:
# zfs rollback -r tank/testfs@firstsnapshot
# zfs list
NAME USED AVAIL REFER MOUNTPOINT
tank/testfs 4.02M 425M 4.02M /tank/testfs
tank/testfs@firstsnapshot 0 - 4.02M -
Weg sind se. :)
Das reicht mir auch erstmal, mein Testfilesystem kann ich wieder loswerden:
# zfs destroy -r tank/testfs
Moment! Da waren doch noch meine kostbaren Zufallsdaten drauf!
Da will ich das Dateisystem doch lieber schnell wiederherstellen:
# cat ~/testfs-firstsnapshot | zfs receive tank/testfs@firstsnapshot
# cat ~/testfs-20071111-2 | zfs receive tank/testfs@20071111-2
cannot receive: most recent snapshot does not match incremental source
Tja, den ersten Snapshot kann ich einlesen, für meinen inkrementellen (dritten) Snapshot fehlt mir aber das Ausgangsmaterial aus @20071111, welches ich nicht gesichert habe.
Aber die Anfangsdaten wurden problemlos wiederhergestellt:
# zfs mount tank/testfs
# ls -al /tank/testfs/
total 4106
drwxr-xr-x 2 root sys 4 2007-11-11 00:39 .
drwxr-xr-x 4 chris sys 4 2007-11-11 00:56 ..
-rw-r--r-- 1 root root 2097152 2007-11-11 00:38 file1
-rw-r--r-- 1 root root 2097152 2007-11-11 00:39 file2