Vor kurzem bin ich (als ich alle Jails soweit in VMs sowie Docker-Container) neu implementiert hatte, endgültig auf FreeNAS Corral umgestiegen.
Als ich dann aber meine MySQL-Datenbank wiederherstellen wollte, war mein SQL-Dump leider nicht mehr da. Unter MySQL ist es leider nicht wirklich einfach, aus den InnoDB-Datendateien die Datenbank zu rekonstruieren. Nach einigem hin und her habe ich mich dazu entschlossen, das ZFS-Dataset mit der Jail nochmals mit der "alten" FreeNAS-Version wiederzubeleben.
Ein einfacher Boot in das alte System auf dem USB-Stick war nicht ohne Downtime wichtiger Dienste möglich, also wollte ich die Jail auf einem anderen temporären FreeNAS-System wiederherstellen.
Also habe ich mir mal ein paar Gedanken im Vorfeld gemacht:
Wie kann ich das Dataset exportieren und auf einen anderen Datenträger klonen?
Mit dem Befehl
zfs send
können beliebige Snapshots eines ZFS-Datasets in eine Datei geschrieben und dann auf einem anderen System mittels
zfs receive
wiederhergestellt werden.
Wie stelle ich auf dem FreeNAS 9.10 System sicher, dass die Jail auch gestartet werden kann?
Ich erinnerte mich an einen Thread im FreeNAS-Forum (Link habe ich leider nicht mehr), in welchem diese Problematik behandelt wurde.
An sich besteht eine Jail in FreeNAS aus 2 Komponenten: Das ZFS-Dataset und ein Meta-Ordner, welcher im Stammverzeichnis des übergeordneten "jails" Datasets liegt. In diesem Ordner sind die IP-Adresse, MAC & Co. gespeichert.
Bei einem Import eines Volumes prüft FreeNAS, ob es ein Dataset namens "jails" gibt. Wenn dies der Fall ist, wird versucht über die Metainformationen im Meta-Ordner des Volumes die Jail automatisch zu importieren.
Die beiden Fragen konnten erstaunlich einfach beantwortet werden.
Also machte ich mich ans Werk:
- Ich fertigte einen Snapshot des ZFS-Datasets an, in welchem die Jail-Daten liegen mittels
zfs snapshot DATA1/jails/drupal01@CLONE02
- um dann das Dataset in eine Datei zu speichern:
zfs send DATA1/jails/drupal01@CLONE02 > /mnt/DATA1/drupal01.snap
- Der Ordner
DATA1/jails/.drupal01.meta
kopieren wir mittels WinSCP auf einen PC oder auf einen anderen externen Ort.
- FreeNAS 9.10 wird in VirtualBox mit 2 Festplatten installiert. Danach die wichtigsten Basiseinstellungen vorgenommen
- Es wird ein neuer Pool erstellt, in meinem Falle heißt dieser analog dem Quellsystem "DATA1"
- Es wird dem Dataset "DATA1" ein neuer Pool namens "jails" erstellt.
- Es werden die SSH/TFTP-Dienste aktiviert
- Eine neue SSH/WinSCP Sitzung starten
- Nun kopieren wir den Meta-Ordner mittels WinSCP unter /mnt/DATA1 auf das Dataset und kopieren die Datei "drupal01.snap" auch in das Stammverzeichnis.
Nun stellen wir das Dataset aus der Datei mit dem Befehl
cat "/mnt/DATA1/drupal01.snap" | zfs receive -F "DATA1/jails/drupal01"
wieder her.
- Da aktuell das Volume bereits in FreeNAS erstellt ist, müssen wir nun für den automatischen Import der Jail das Volume vom System entfernen (dabei NICHT als "neu" markieren!). Nun sind keine Volumes sowie Datasets mehr auf der WebGUI sichtbar.
- Nun importieren wir das entfernte Volume wieder. Wir wechseln in den Menüpunkt "Jails" > "Configuration" und geben dort als "Jail Root" den Pfad "jails" an, siehe hierzu https://doc.freenas.org/9.10/jails.html#global-jail-config-opts-tab
- Nun wechseln wir in den Menüpunkt "Jails" bzw. "gesicherte Datasets".
- Die Jail ist nun mit allen Einstellungen in der Liste sichtbar und lässt sich auch starten.
Nun war ich glücklich und konnte meine Datenbank nochmals sichern und auch tatsächlich erfolgreich auf den neuen System wiederherstellen.
Natürlich lässt sich der Aufruf von "zfs send" und "zfs receive" auch mit einem SSH-Tunnel verbinden und somit direkt den Stream des Datasets an die temp. Maschine senden und dort wiederherstellen, siehe hierzu in der Oracle ZFS-Dokumentation:
http://docs.oracle.com/cd/E19253-01/820-2313/gbchx/index.html