Was sind ZFS-Snapshots?
ZFS arbeitet mit Copy-on-Write — jede Änderung wird an eine neue Stelle geschrieben, die alten Blöcke bleiben erhalten. Ein Snapshot friert diesen Stand ein: Die Blöcke werden einfach nicht mehr zum Überschreiben freigegeben. Deshalb ist ein Snapshot schneller erstellt als eine Datei gespeichert — er kostet nur so viel Platz, wie sich danach ändert.
Was man damit machen kann:
- Einzelne Dateien aus dem Snapshot herauskopieren
- Das gesamte Dataset auf den Snapshot-Stand zurückrollen
- Einen beschreibbaren Clone aus dem Snapshot erstellen
- Den Snapshot (oder nur die Differenz zum nächsten) per SSH auf ein anderes System replizieren
Snapshot erstellen und nutzen
Dataset mit Testdaten vorbereiten:
zfs create rpool/testdaten dd if=/dev/zero of=/rpool/testdaten/image01.img bs=10240 count=10240 # 100 MB zfs list rpool/testdaten NAME USED AVAIL REFER MOUNTPOINT rpool/testdaten 100M 9,02G 100M /rpool/testdaten
Snapshot erstellen — der Name nach dem @ ist frei wählbar:
zfs snapshot rpool/testdaten@vor-aenderung
Auf den Snapshot zugreifen — das versteckte Verzeichnis .zfs taucht nicht in ls auf, ist aber direkt erreichbar:
ls /rpool/testdaten/.zfs/snapshot/ vor-aenderung ls /rpool/testdaten/.zfs/snapshot/vor-aenderung/ image01.img
Von hier aus lassen sich versehentlich gelöschte Dateien einfach zurückkopieren. Um das gesamte Dataset auf den Snapshot-Stand zurückzurollen:
zfs rollback rpool/testdaten@vor-aenderung
Snapshot per SSH replizieren
Mit zfs send und zfs recv lässt sich ein Snapshot auf ein anderes System schieben — ein Einzeiler:
zfs send rpool/testdaten@vor-aenderung \ | ssh root@backup-server zfs recv backup/testdaten@vor-aenderung
Danach muss nur noch die Differenz zwischen zwei Snapshots übertragen werden — bei 1 GB Änderungen auf einem 100 GB Dataset werden auch nur 1 GB übertragen. Alle ZFS-Properties (NFS-Shares, SMB-Shares, Quotas) wandern mit. Mehr dazu im Beitrag zur ZFS-Datensicherung und zur Fehlerbehebung bei zfs send/recv.
Time Slider und Boot Environments
Unter OpenIndiana/Solaris gibt es den Time Slider — ein Nautilus-Plugin, das automatisch Snapshots erstellt und eine grafische Zeitleiste bietet. Alte Snapshots werden automatisch aufgeräumt wenn die Platte voll wird.
Noch mächtiger sind Boot Environments (beadm). Vor einem Systemupdate wird automatisch ein Snapshot des Root-Pools erstellt und davon ein Clone gebootet. Geht beim Update etwas schief, bootet man einfach das alte Environment — kein Stress, kein Ausfall:
beadm list BE Active Mountpoint Space Policy Created openindiana NR / 11,6G static 2011-09-28 19:06 openindiana-1 - - 37,3M static 2011-10-27 20:04 # Neues Boot Environment anlegen beadm create vor-experiment
Für automatisierte Snapshots unter FreeBSD siehe automatische ZFS-Snapshots mit zfs-auto-snapshot. Fragen? Einfach melden.











So ging es mir mit allem was man so mal eben in die Kiste stopfen kann. Ob es nun ein USB-Stick, eine CD/DVD oder eine Wechselplatte ist. Sie wird sauber erkannt und automatisch eingebunden. Es gibt ein schönes Symbol auf dem Gnome Desktop und in dessen Dateiverwaltung. Selbst der Zugriff auf alles klappt tadellos. Aber wehe man möchte das Teil wieder los werden.
Sobald man auf „Aushängen“ klickt, springt einem das System mit der GUI-Meldung an: cannot unmount volume
Sehr nervig…. Konsole aufmachen, su, unmount…..
Dass dieses ein Problem mit irgendeiner Berechtigung sein muss ist schnell klar, aber welcher? Google konnte mir schnell helfen. Das Problem besteht seit 147 bzw. Solaris Express, soll aber inzwischen gefixt sein. Ist es auch, nur taucht es inzwischen durch eine andere Änderung wieder auf. Das ganze ist bekannt und soll gelöst werden. Bisher gibt es einen Workaround.
Einfach nachstehende Zeile in die folgende Datei packen: