Ein Snapshot ist eine schreibgeschützte Kopie eines Dateisystems bzw. Volumes. Snapshots können sehr schnell erstellt werden und belegen anfänglich keine zusätzliche Festplattenkapazität im Pool. Mit der Änderung von Daten innerhalb des aktiven Datasets belegt der Snapshot jedoch schrittweise mehr Festplattenkapazität, da er Verweise auf die älteren Daten speichert und so ein Löschen dieser Daten verhindert
ZFS-Snapshots besitzen die folgenden Leistungsmerkmale:
Sie bleiben auch nach Systemneustarts wirksam.
Die theoretische Maximalanzahl möglicher Snapshots beträgt 264.
Snapshots verwenden keine separaten Zusatzspeicher. Snapshots belegen Festplattenkapazität direkt im gleichen Speicher-Pool, wie auch das Dateisystem oder Volume, aus dem sie erstellt wurden.
Rekursive Snapshots werden schnell in einem unteilbaren Vorgang erstellt. Snapshots werden entweder zusammen (d. h. alle auf einmal) oder gar nicht erstellt. Der Vorteil solcher unteilbarer Snapshots besteht darin, dass die Snapshot-Daten auch bei Dateisystemhierarchien zu einem einzigen konsistenten Zeitpunkt erstellt werden.
Auf Snapshots von Volumes kann nicht direkt zugegriffen werden, aber sie können geklont, als Sicherungskopie gesichert und wiederhergestellt werden. Informationen zum Erstellen von Sicherungskopien für ZFS-Snapshots finden Sie unter Senden und Empfangen von ZFS-Daten.
Snapshots werden mithilfe des Befehls zfs snapshot erstellt. Diesem wird als einziges Argument der Name des zu erstellenden Snapshots übergeben. Der Snapshot-Name ist wie folgt anzugeben:
filesystem@snapname volume@snapname |
Der Snapshot-Name muss den unter Konventionen für das Benennen von ZFS-Komponenten aufgeführten Benennungskonventionen genügen.
Im folgenden Beispiel wird ein Snapshot des Dateisystems tank/home/ahrens mit dem Namen friday erstellt.
# zfs snapshot tank/home/ahrens@friday |
Mithilfe der Option -r können Sie Snapshots für alle untergeordneten Dateisysteme erstellen. Beispiel:
# zfs snapshot -r tank/home@now # zfs list -t snapshot NAME USED AVAIL REFER MOUNTPOINT rpool/ROOT/zfs2BE@zfs2BE 78.3M - 4.53G - tank/home@now 0 - 26K - tank/home/ahrens@now 0 - 259M - tank/home/anne@now 0 - 156M - tank/home/bob@now 0 - 156M - tank/home/cindys@now 0 - 104M - |
Snapshots besitzen keine konfigurierbaren Eigenschaften, und es können für Snapshots auch keine Dataset-Eigenschaften gesetzt werden. Beispiel:
# zfs set compression=on tank/home/ahrens@now cannot set compression property for 'tank/home/ahrens@now': snapshot properties cannot be modified |
Snapshots werden mithilfe des Befehls zfs destroy gelöscht. Beispiel:
# zfs destroy tank/home/ahrens@now |
Ein Dataset kann nicht gelöscht werden, wenn Snapshots dieses Datasets vorhanden sind. Beispiel:
# zfs destroy tank/home/ahrens cannot destroy 'tank/home/ahrens': filesystem has children use '-r' to destroy the following datasets: tank/home/ahrens@tuesday tank/home/ahrens@wednesday tank/home/ahrens@thursday |
Wenn von einem Snapshot Klone erstellt wurden, müssen diese zuerst gelöscht werden, bevor das Löschen des Snapshots möglich ist.
Weitere Informationen zum Unterbefehl destroy finden Sie unter Löschen eines ZFS-Dateisystems.
Wenn Sie verschiedene automatische Snapshot-Richtlinien verwenden und dadurch ältere Snapshots durch zfs receive gelöscht werden, weil sie nicht mehr auf der Sendeseite vorhanden sind, können Sie die Snapshot-Aufbewahrungsfunktion verwenden.
Durch die Aufbewahrung eines Snapshots wird verhindert, dass er gelöscht wird. Außerdem ermöglicht diese Funktion das Löschen eines Snapshots zusammen mit Klonen in Abhängigkeit von der Entfernung des letzten Klons mithilfe des Befehls zfs destroy -d. Jeder Snapshot besitzt eine zugeordnete Benutzerreferenzzählung, die bei Null beginnt. Dieser Wert wird erhöht, wenn ein weiterer Snapshot aufbewahrt wird, und verringert, wenn eine Aufbewahrung beendet wird.
In der Vorgängerversion von Solaris konnte ein Snapshot nur dann mithilfe des Befehls zfs destroy gelöscht werden, wenn er keine Klone hatte. In dieser Solaris-Version muss zudem der Wert der Benutzerreferenzzählung des Snapshots auf Null stehen.
Sie können einen Snapshot oder eine Gruppe von Snapshots aufbewahren. Anhand der folgenden Syntax wird beispielsweise ein Aufbewahrungs-Tag, keep, für tank/home/cindys/snap@1 gesetzt.
# zfs hold keep tank/home/cindys@snap1 |
Sie können die Option -r verwenden, um die Snapshots aller untergeordneten Dateisystem rekursiv aufzubewahren. Beispiel:
# zfs snapshot -r tank/home@now # zfs hold -r keep tank/home@now |
Mithilfe dieser Syntax wird eine einzelne Referenz, keep, zu einem Snapshot oder einer Gruppe von Snapshots hinzugefügt. Jeder Snapshot besitzt einen eigenen Tag-Namensraum. Die Aufbewahrungs-Tags innerhalb dieses Namensraums müssen eindeutig sein. Wenn ein Snapshot aufbewahrt wird, kann er nicht mithilfe des Befehls zfs destroy gelöscht werden. Beispiel:
# zfs destroy tank/home/cindys@snap1 cannot destroy 'tank/home/cindys@snap1': dataset is busy |
Wenn Sie einen aufbewahrten Snapshot löschen möchten, verwenden Sie die Option -d. Beispiel:
# zfs destroy -d tank/home/cindys@snap1 |
Verwenden Sie den Befehl zfs holds, um eine Liste der aufbewahrten Snapshots anzuzeigen. Beispiel:
# zfs holds tank/home@now NAME TAG TIMESTAMP tank/home@now keep Thu Jul 15 11:25:39 2010 |
# zfs holds -r tank/home@now NAME TAG TIMESTAMP tank/home/cindys@now keep Thu Jul 15 11:25:39 2010 tank/home/mark@now keep Thu Jul 15 11:25:39 2010 tank/home@now keep Thu Jul 15 11:25:39 2010 |
Sie können den Befehl zfs release verwenden, um einen aufbewahrten Snapshot oder eine Gruppe aufbewahrter Snapshots freizugeben. Beispiel:
# zfs release -r keep tank/home@now |
Ist ein Snapshot freigegeben, kann er mithilfe des Befehls zfs destroy gelöscht werden. Beispiel:
# zfs destroy -r tank/home@now |
Zwei neue Eigenschaften liefern Informationen zur Aufbewahrung von Snapshots:
Die Eigenschaft defer_destroy ist aktiviert (on), wenn der Snapshot zur späteren Löschung mithilfe des Befehls zfs destroy -d vorgesehen ist. Anderenfalls ist die Eigenschaft deaktiviert (off).
Die Eigenschaft userrefs dient zur Angabe der Anzahl der Aufbewahrungen des Snapshots und wird auch als Benutzerreferenzzählung bezeichnet.
Sie können Snapshots umbenennen. Allerdings müssen Snapshots innerhalb des Pools und Datasets, in dem sie erstellt wurden, umbenannt werden. Beispiel:
# zfs rename tank/home/cindys@083006 tank/home/cindys@today |
Außerdem entspricht die folgende Kurzsyntax der obigen Syntax:
# zfs rename tank/home/cindys@083006 today |
Der folgende Vorgang zum Umbenennen eines Snapshots wird nicht unterstützt, da sich Ziel-Pool und -Dateisystem von dem Pool und Dateisystem unterscheiden, in denen der betreffende Snapshot erstellt wurde:
# zfs rename tank/home/cindys@today pool/home/cindys@saturday cannot rename to 'pool/home/cindys@today': snapshots must be part of same dataset |
Sie können Snapshots mithilfe des Befehls zfs rename - r rekursiv umbenennen. Beispiel:
# zfs list NAME USED AVAIL REFER MOUNTPOINT users 270K 16.5G 22K /users users/home 76K 16.5G 22K /users/home users/home@yesterday 0 - 22K - users/home/markm 18K 16.5G 18K /users/home/markm users/home/markm@yesterday 0 - 18K - users/home/marks 18K 16.5G 18K /users/home/marks users/home/marks@yesterday 0 - 18K - users/home/neil 18K 16.5G 18K /users/home/neil users/home/neil@yesterday 0 - 18K - # zfs rename -r users/home@yesterday @2daysago # zfs list -r users/home NAME USED AVAIL REFER MOUNTPOINT users/home 76K 16.5G 22K /users/home users/home@2daysago 0 - 22K - users/home/markm 18K 16.5G 18K /users/home/markm users/home/markm@2daysago 0 - 18K - users/home/marks 18K 16.5G 18K /users/home/marks users/home/marks@2daysago 0 - 18K - users/home/neil 18K 16.5G 18K /users/home/neil users/home/neil@2daysago 0 - 18K - |
Sie können das Anzeigen von Snapshot-Listen in der zfs list-Ausgabe durch Verwenden der Pool-Eigenschaft listsnapshots aktivieren oder deaktivieren. Diese Eigenschaft ist standardmäßig aktiviert.
Wenn Sie diese Eigenschaft deaktivieren, können Sie Snapshot-Informationen mit dem Befehl zfs list -t snapshot anzeigen. Oder aktivieren Sie die Pool-Eigenschaft listsnapshots. Beispiel:
# zpool get listsnapshots tank NAME PROPERTY VALUE SOURCE tank listsnapshots on default # zpool set listsnapshots=off tank # zpool get listsnapshots tank NAME PROPERTY VALUE SOURCE tank listsnapshots off local |
Snapshots befinden sich im Verzeichnis .zfs/snapshot des Stammverzeichnisses des Dateisystems. Wenn das Dateisystem tank/home/ahrens beispielsweise in /home/ahrens eingehängt ist, befinden sich die Daten des Snapshots tank/home/ahrens@thursday im Verzeichnis /home/ahrens/.zfs/snapshot/thursday .
# ls /tank/home/ahrens/.zfs/snapshot tuesday wednesday thursday |
Snapshots können wie folgt angezeigt werden:
# zfs list -t snapshot NAME USED AVAIL REFER MOUNTPOINT pool/home/anne@monday 0 - 780K - pool/home/bob@monday 0 - 1.01M - tank/home/ahrens@tuesday 8.50K - 780K - tank/home/ahrens@wednesday 8.50K - 1.01M - tank/home/ahrens@thursday 0 - 1.77M - tank/home/cindys@today 8.50K - 524K - |
Snapshots, die für ein bestimmtes Dateisystem erstellt wurden, können wie folgt angezeigt werden:
# zfs list -r -t snapshot -o name,creation tank/home NAME CREATION tank/home@now Wed Jun 30 16:16 2010 tank/home/ahrens@now Wed Jun 30 16:16 2010 tank/home/anne@now Wed Jun 30 16:16 2010 tank/home/bob@now Wed Jun 30 16:16 2010 tank/home/cindys@now Wed Jun 30 16:16 2010 |
Nach der Erstellung eines Snapshots wird dessen Festplattenkapazität anfänglich vom Snapshot und vom Dateisystem (sowie eventuell von früheren Snapshots) gemeinsam genutzt. Wenn sich ein Dateisystem mit der Zeit ändert, wird gemeinsam genutzte Festplattenkapazität dann nur noch vom Snapshot belegt und in die Berechnung des vom Snapshot belegten Speicherplatzes (Eigenschaft used) einbezogen. Darüber hinaus kann durch das Löschen von Snapshots die Festplattenkapazität, die Snapshots eindeutig zugewiesen ist (und deswegen in der Eigenschaft used angegeben ist und somit belegt wird), größer werden.
Der Eigenschaftswert referenced des Speicherlatzes eines Snapshots entspricht dem des Dateisystems zum Zeitpunkt der Erstellung dieses Snapshots.
Sie können zusätzliche Informationen darüber erhalten, wie die Werte der Eigenschaft used belegt werden. Neue schreibgeschützte Dateisystem-Eigenschaften beschreiben die Belegung von Festplattenkapazität für Klone, Dateisysteme und Volumes. Beispiel:
$ zfs list -o space # zfs list -ro space tank/home NAME AVAIL USED USEDSNAP USEDDS USEDREFRESERV USEDCHILD tank/home 66.3G 675M 0 26K 0 675M tank/home@now - 0 - - - - tank/home/ahrens 66.3G 259M 0 259M 0 0 tank/home/ahrens@now - 0 - - - - tank/home/anne 66.3G 156M 0 156M 0 0 tank/home/anne@now - 0 - - - - tank/home/bob 66.3G 156M 0 156M 0 0 tank/home/bob@now - 0 - - - - tank/home/cindys 66.3G 104M 0 104M 0 0 tank/home/cindys@now - 0 - - - - |
Eine Beschreibung dieser Eigenschaften können Sie Tabelle 6–1 entnehmen.
Mit dem Befehl zfs rollback können Sie alle Änderungen rückgängig machen, die seit der Erstellung eines bestimmten Snapshots an einem Dateisystem vorgenommen wurden. Im Dateisystem wird der Zustand zum Zeitpunkt der Erstellung des betreffenden Snapshots wiederhergestellt. Standardmäßig stellt dieser Befehl stets den Zustand des zuletzt gemachten Snapshots wieder her.
Damit das Dateisystem im Zustand eines früheren Snapshots wiederhergestellt werden kann, müssen alle dazwischen liegenden Snapshots gelöscht werden. Frühere Snapshots können mithilfe der Option -r gelöscht werden.
Wenn Klone dazwischen liegender Snapshots vorhanden sind, müssen auch diese Klone mithilfe der Option -R gelöscht werden.
Das Dateisystem, dessen früherer Zustand wiederhergestellt werden soll, wird aus- und wieder eingehängt, wenn es gerade eingehängt ist. Wenn das betreffende Dateisystem nicht ausgehängt werden kann, schlägt die Wiederherstellung des früheren Zustands fehl. Die Option -f erzwingt bei Bedarf das Aushängen des Dateisystems.
Im folgenden Beispiel wird das Dateisystem tank/home/ahrens auf den Snapshot mit dem Namen tuesday zurückgesetzt:
# zfs rollback tank/home/ahrens@tuesday cannot rollback to 'tank/home/ahrens@tuesday': more recent snapshots exist use '-r' to force deletion of the following snapshots: tank/home/ahrens@wednesday tank/home/ahrens@thursday # zfs rollback -r tank/home/ahrens@tuesday |
In diesem Beispiel wurden die Snapshots wednesday und thursday gelöscht, da Sie den Zustand des davor liegenden Snapshots tuesday wiederhergestellt haben.
# zfs list -r -t snapshot -o name,creation tank/home/ahrens NAME CREATION tank/home/ahrens@now Wed Jun 30 16:16 2010 |