Wie richte ich ein bootfähiges inkrementelles ZFS-on-root-Backup auf einem separaten Laufwerk ein?

747
Marian

Ich habe antergos Linux mit ZFS-on-root installiert. Das System ist in Betrieb und ich bin froh, weil das allein schon ein Erfolg für mich ist. Nun, anscheinend ist ZFS hauptsächlich für NAS, RAID, Server-Konfigurationen usw. gedacht (und ich verstehe total, warum), aber ich möchte es trotzdem auf meinem Desktop versuchen, da BTRFS angeblich überlegen ist, was die Stabilität angeht (insbesondere bei Stromausfällen) [ein Hauptanliegen für mich, wo ich wohne]), Leistung und Handhabung.

Jetzt bin ich mit COW und Snapshots selbst in BTRFS völlig neu, aber ich halte sie nicht für leicht verständlich, selbst wenn es nur zwei Befehle gibt, die bei ZFS zu meistern sind.

Was ich in meiner Maschine habe:

Eine Samsung 850 Evo 250 GB- SSD, die von Antergos mit ZFS konfiguriert wurde

# lsblk NAME MOUNTPOINT sda ├─sda1 /boot/efi ├─sda2 /boot └─sda3  # zfs list NAME MOUNTPOINT antergos_6g9t / antergos_6g9t/swap 

Eine von mir konfigurierte WDC WD30EZRX 3TB- Festplatte

# lsblk NAME FSTYPE MOUNTPOINT sdb ├─sdb1 vfat ├─sdb2 ext4 /run/media/username/masstorage ├─sdb3 ext4 /home └─sdb4 ext4 /run/media/username/snapshots 

Was ich erreichen will

Wie Sie sehen, habe ich das größere Laufwerk so eingerichtet, dass es eine Partition für viele Daten (Arbeit, Filme, Musik usw.) enthält, eine für Zuhause und eine für Schnappschüsse. Die sdb1 soll ein mögliches ESP sein, weil:

  • Ich möchte den Snapshot root (antergos_6g9t) auf sdb4 inkrementieren
  • Ich möchte von diesen Momentaufnahmen booten können
  • Ich möchte in der Lage sein, diese Snapshots in sda wiederherzustellen, wenn ich meine Wurzel baue

Fragen

  • Was sind die alltäglichen Befehle, die ich verwenden muss, um das obige zu erreichen? (Fast alle Anleitungen im Web beziehen sich auf NAS und RAID oder Klone über SSH.)
  • Ist ext4 in Ordnung, um / home mit dem ZFS-Root zu kombinieren?
  • Müsste ich sdb4 als ZFS formatieren?
  • Vielleicht gibt es einen völlig anderen Ansatz dazu? (Beachten Sie, dass ich eine separate Partition für / home und Mass Storage mit einer guten Rückwärtskompatibilität verwenden möchte. Deshalb habe ich mich hier für ext4 entschieden.)

Jede Hilfe, Anmerkung oder Anregung wird sehr geschätzt.

1

1 Antwort auf die Frage

2
user121391

Was sind die alltäglichen Befehle, die ich verwenden muss, um das obige zu erreichen? (Fast alle Anleitungen im Web beziehen sich auf NAS und RAID oder Klone über SSH.)

Es gibt keinen wirklichen Unterschied, wenn Sie über das Netzwerk kopieren, anstatt lokal zu kopieren - statt zfs send | ssh zfs recvSie nur zu haben zfs send | zfs recv- oder Sie können die Sicherung sogar in gestreamter Form (ohne zfs recvund mit einigen Nachteilen) speichern und nur erweitern, wenn Sie sie benötigen.

Ist ext4 in Ordnung, um / home mit dem ZFS-Root zu kombinieren? Müsste ich sdb4 als ZFS formatieren?

Was genau ist dein Ziel mit der ext4-Partition? Sie können dies auf diese Weise tun, aber Sie werden Schnappschüsse und Integritätsprüfungen für Ihre Benutzerdaten verpassen. In meinen Augen kann jedes System kostengünstig zurückgebracht werden, aber Benutzerdaten gehen für immer verloren. Wenn ich wählen müsste, würde ich ZFS für meine Benutzerdaten und ext4 für eine (wertlose) Systempartition verwenden, nicht umgekehrt.

Vielleicht gibt es einen völlig anderen Ansatz dazu? (Beachten Sie, dass ich eine separate Partition für / home und Mass Storage mit einer guten Rückwärtskompatibilität verwenden möchte. Deshalb habe ich mich hier für ext4 entschieden.)

  • Wenn Sie die Abwärtskompatibilität als "Ich möchte ZFS testen und dann ohne Daten kopieren" zu Ext4 gehen sehen, werden Sie nichts gewinnen: Sie werden die Vorteile von ZFS nicht sehen und haben trotzdem die Nachteile von Ext4. Außerdem müssen Sie beim Erstellen eines bootfähigen ZFS-Systems unter Linux mehr tun (obwohl Sie dies in diesem Fall bereits getan haben) als beim Einrichten einer einfachen Datenpartition für Benutzerdaten mit ZFS.
  • Wenn Sie es als "Ich möchte mit anderen Systemen darauf zugreifen" sehen, würde ich NFS, SMB, AFP oder SSH (oder alle gleichzeitig) vorschlagen.
  • Wenn dies für Dualboot mit einem System, das nicht ZFS-fähig ist, ist, wäre dies eine der wenigen Konstellationen, bei denen Ihr Layout absolut sinnvoll ist.
  • Wenn Sie ZFS nicht vertrauen, Ihre Daten zu schützen, oder der Linux-Version nicht vertrauen, verwenden Sie entweder Solaris / illumos / * BSD oder behalten Sie Ihre Sicherungen auf ext4. Auf diese Weise verlieren Sie das einfache Send / Recv-Sicherungsprogramm, aber Sie wissen zumindest, dass Sie nur gute Daten sichern.

Wie aus Ihrer aktuellen Beschreibung ersichtlich, können Sie zwar alle Ihre Ziele erreichen, sind aber suboptimal und schwieriger, wie Sie es beschrieben haben.

Denken Sie stattdessen an die Verwendung von ZFS auf allen Ihren Festplatten. Fügen Sie ggf. Redundanz hinzu (dies kann auch später durch Hinzufügen einer Spiegelplatte geschehen), verwenden Sie ZFS-Dateisysteme anstelle von Partitionen (zur Trennung von Anliegen) und sichern Sie Ihre Snapshots regelmäßig verschiedene Festplatten (zur Bekämpfung möglicher Korruption durch fehlenden ECC-Speicher).


Follow-up zu Ihrem Kommentar:

Möchten Sie diese Situation in Ihrer Antwort näher erläutern und Details (wie in der Struktur) über das Snapshot-Management und wie Sie einen Start in einem von ihnen erreichen oder den Snapshot in Root wiederherstellen können? Ich würde die gesamten 3 TB als ZFS partitionieren und dann aus meinem ZFS-Betriebssystem Datenpools und Datasets hinzufügen, und zwar für meine Speicher-, Home- und Snapshot-Partitionen. Aber ab da wäre ich hilflos.

Ja, so ziemlich das. Ich kenne Ihre Hardwareoptionen nicht, aber wenn Sie über die beschriebenen Festplatten verfügen, würde ich Folgendes tun:

Setup und Layout

Hardware- und Poollayout

Normalerweise würden Sie die SSD als Lesecache verwenden, aber auf einem Desktop verlieren Sie alle Vorteile eines L2ARC-Caches (außer bei Solaris 11.3, wo es dauerhaft ist und Neustarts überlebt).

Sie können also entweder alles auf die Festplatte legen und die SSD als SLOG-Gerät verwenden (nur für Synchronisierungs-Schreibvorgänge). Sie können sie auch trennen und Ihre Systemdaten (Root-Pool) auf die SSD und den Rest auf die Festplatte legen.

Theoretisch könnten Sie mit der ersten Lösung eine bessere Leistung erzielen. In einem Desktop-Fall bezweifle ich jedoch, dass Ihr System lange genug online bleibt, um es zu bemerken. Daher ist die zweite Lösung weniger umständlich und Ihre SSD wird länger überleben.

Sie erstellen also zwei Pools - einen Root-Pool (angenommen mit Namen rpool) auf der SSD mit 250 GB und einen Datenpool ( data) auf der Festplatte mit 3000 GB. Beide sind nicht redundant, da sie jeweils nur über 1 vdev verfügen. Später können Sie jedoch eine zusätzliche Festplatte oder SSD hinzufügen, um sie mit Spiegeln zu versehen zpool attach data /dev/<old_disk> /dev/<new_disk>(damit Fehler automatisch korrigiert werden können). Dies ist optional, wird jedoch empfohlen (wenn Sie nur eine Festplatte hinzufügen können, fügen Sie die Datenspiegelung hinzu, da Ihre Daten wertvoller sind als das System, auf das dataohnehin geklont wird).

Sie benötigen keine zusätzlichen Partitionen (außer möglicherweise Swap- und / oder Boot-Partitionen, dies wird jedoch automatisch bei der Installation ausgeführt), da Ihre ZFS-Dateisysteme diese Rolle ausfüllen.

ZFS-Dateisystemlayout

Jetzt haben Sie zwei Pools - rpoolist bereits belegt (es tut mir leid, dass ich hier nicht auf Details eingehen kann, da sich Linux von illumos / Solaris unterscheidet) von Ihrer Installation - Sie müssen hier nichts ändern. Sie können überprüfen, zfs mountob die Dateisysteme korrekt eingehängt sind.

data auf der anderen Seite ist noch leer, also fügen Sie einige Dateisysteme hinzu:

# zfs create data/home # zfs create data/home/alice # zfs create data/sysbackup # zfs create data/pictures ... 

Prüfen Sie, zfs mountob sie korrekt gemountet sind, andernfalls mounten Sie sie mit zfs mount(und / oder in fstab; dies kann wiederum bei Linux anders sein). Ich finde es einfacher, wenn die Verzeichnisstruktur ähnlich der Dateisystemstruktur ist (aber nicht notwendig): /home/aliceentspricht data/home/alice.

ACLs und Netzwerkfreigabe

Nun wäre ein guter Punkt, um über Berechtigungen und Freigaben nachzudenken (da beide in zukünftigen Snapshots enthalten sind, da sie Eigenschaften des snapshotted-Dateisystems zu einem bestimmten Zeitpunkt sind).

Alle Ihre Dateien und Verzeichnisse verfügen über ACLs (Zugriffskontrolllisten). Darüber hinaus verfügen alle Ihre Windows-Netzwerkfreigaben (SMB / CIFS) über Freigabe-ACLs . Dies ist ein umfangreiches Thema, aber für ein Desktopsystem können Sie es einfach halten: Legen Sie die ACLs für Dateien so fest, wie Sie Berechtigungen vergeben möchten (verwenden Sie nur allow und keine Ablehnung ), und belassen Sie die Freigabeberechtigungen standardmäßig (alle haben Zugriff). Daher werden sie ignoriert und Sie müssen nur einen Satz von Berechtigungen verwalten, die lokal und für alle Netzwerkfreigabeprotokolle (AFP, SMB, NFS) funktionieren.

Um ACLs anzuzeigen, verwenden Sie ls -Vd /home/alicedas Verzeichnis und ls -V /home/alicealle darin enthaltenen Dateien. Je nach System ist lsmöglicherweise die falsche Version (GNU lsanstelle von Solaris ls) vorhanden, daher benötigen Sie möglicherweise den vollständigen Pfad.

Um ACLs, Verwendung zu ändern chmod(wie bei Liste), eine gute Dokumentation ist hier .

Außerdem sollten Sie ggf. ZFS-Eigenschaften in den Dateisystemen ( zfs getund zfs set) festlegen .

Schnappschüsse

Hintergrund zu Momentaufnahmen

Jeder Schnappschuss ist nur ein atomar gespeicherter Zustand des angegebenen Dateisystems zum Zeitpunkt der Erstellung. Es ist wie eine Zeitmaschine, wo Sie zurückgehen und sehen können, wie es vor einem Tag oder einem Jahr war. Sie sind schreibgeschützt. Sie können sie also nicht ändern (nur vollständig löschen) und nehmen nur für geänderte Blöcke Platz, seit sie erstellt wurden.

Dies bedeutet, dass jeder Snapshot mit einer Größe von (fast) null Byte beginnt und jeder geänderte, hinzugefügte oder entfernte Block aufgezeichnet und beibehalten wird. Dies bedeutet, dass der Snapshot zu wachsen beginnt (aufgrund der Copy-on-Write-Eigenschaft von ZFS).

Wenn Sie sich Ihre Daten in einer Zeile von links nach rechts vorstellen (wie in einer Zeitleiste), wird ein neuer Block rechts vom letzten alten Block geschrieben. Wenn Sie nach Block 5 einen Schnappschuss setzen, ändert sich anfangs nichts. Block 6 wird dann rechts hinzugefügt, der Snapshot hat jedoch immer nur die Blöcke 0 bis 5, auf die verwiesen wird. Wenn Block 3 gelöscht wird, wird kein Speicherplatz freigegeben, bis der Snapshot zerstört ist, da er weiterhin auf die Blöcke 0 bis 5 verweist. Das Ändern des Blocks 4 ist (CoW!) Das gleiche wie das Hinzufügen von Block 6 und das Verschieben der Referenzen nach der Schreiboperation - jedoch erneut Es wird kein Speicherplatz freigegeben, da der Schnappschuss immer noch die ursprünglichen Blöcke 0 bis 5 enthalten muss. Wenn wir den Schnappschuss endgültig zerstören, nehmen wir die Blöcke 4 und 5 zurück und führen zu einem Loch (Fragmentierung), das später möglicherweise mit anderen Blöcken gefüllt wird.

Dies ist die Blockebene. Jede Datei kann aus mehreren Blöcken auf der gesamten Festplatte bestehen. Für die Dateiebene sehen Sie die Dateien zu diesem Zeitpunkt in der Vergangenheit so, als ob sich nichts geändert hätte. Es kann hilfreich sein, ein wenig mit Schnappschüssen herumzuspielen und einfache Textdateien hinzuzufügen / zu bearbeiten / zu löschen, damit Sie ein Gefühl dafür bekommen. Die Idee ist ziemlich einfach, funktioniert aber sehr effizient.

Automatische Snapshot-Drehung

IIRC, unter Linux können Sie zfs-auto-snapshot verwenden, um dies automatisch durchzuführen, oder Sie können eigene Skripts cronerstellen, die in regelmäßigen Abständen aufgerufen werden (um Snapshots zu erstellen und sie zu zerstören).

Eine gute Rotation hängt von Ihren Verwendungsmustern und Bedürfnissen ab. Ich würde mit einer großzügigen Menge beginnen, so dass Sie bei Bedarf reduzieren können. Das Löschen von Schnappschüssen ist einfach, das Erstellen nachträglich ist nicht möglich. Wenn Ihre Leistungstanks, reduzieren Sie die Intervalle.

  • Systemdaten: für "rm -rf /" Momente und unerwünschte / schlechte Updates, auch für Fehler, die später auftauchen
    • einmal pro Stunde, halte 12
    • einmal pro Tag, behalten Sie 7
    • einmal pro Monat 12 einbehalten
  • Persönliche Daten: Benutzerverzeichnisse und Netzwerkfreigaben, im Wesentlichen die wertvollsten Daten
    • alle fünf Minuten, behalte 12
    • Jede Stunde 24 behalten
    • 30 jeden Tag einbehalten
    • behalten Sie jeden Monat 12
    • behalten Sie jedes Jahr 10
  • Verschrottungsdaten: für private Dinge, die sich nicht in den Snaps verbreiten sollten, für temporäre Daten, für Arbeitsdatensätze, die sich stark ändern, aber nach einem Neustart unbrauchbar sind
    • keiner
  • Sysbackup: Sie brauchen hier keine Schnappschüsse, weil Sie sie bereits aktiviert haben rpoolund sie einfach kopiert werden
    • keiner

Sichern und Wiederherstellen

Grundsätzlich sammeln sich Ihre Schnappschüsse im Laufe der Zeit an und bieten einen verschiebbaren Blick auf Ihre Daten über einen bestimmten Zeitraum. Da Hardware möglicherweise ausfällt und wahrscheinlich fehlschlagen wird, müssen Sie diese Daten auf einer anderen Festplatte oder einem anderen System sichern. Wenn Sie zfs sendund verwenden zfs recv, bleiben Ihre zwischenzeitlichen Snapshots und ACLs und Eigenschaften erhalten. Das bedeutet, eine Sicherung ist einfach eine Kombination aus vollständigem rekursivem Snapshot und rekursivem send / recv, unabhängig vom Ziel ZFS-fähiger Cloud-Speicher oder sogar ein Tarball auf einem anderen System).

Diese Rotation unterscheidet sich von Ihren normalen Schnappschüssen und sollte eindeutig benannt werden, z. B. mit einem Präfix, kombiniert mit einem Datum oder einer zunehmenden Nummer, z data@offsitebackup_217. Die Namen spielen keine Rolle, aber wenn Sie ein Skript erstellen, müssen Sie schnell das letzte vorhandene Backup finden (oder sich den Namen anderswo merken), da Sie das Delta zwischen dem zuletzt übertragenen und dem neu erstellten Schnappschuss benötigen:

# full initial send, destroy all filesystems on the destination # which are not present on the source zfs snapshot -r data@offsite_backup_1 zfs send -R data@offsite_backup_1 | ssh user@host zfs recv -Fdu data  # incremental send, destroy all filesystems on the destination # which are not present on the source zfs snapshot -r data@offsite_backup_2 zfs send -R -I data@offsite_backup_1 data@offsite_backup_2 | ssh user@host zfs recv -Fdu data zfs destroy data@offsite_backup_1 

Der Root-Pool unterscheidet sich nur geringfügig: Wenn Sie die Festplatte ersetzen müssen, müssen Sie zunächst boot / swap erstellen und den Bootloader wie üblich schreiben. Anschließend stellen Sie die Snapshots und optional auch die Einhängepunkte wieder her. Ich denke beadmauf Solaris macht im Wesentlichen dasselbe. Natürlich lässt man die ssh user@hostPortion lokal aus . Zunächst einmal mit einer kleinen Datenmenge testen (echte Tests sind erforderlich, das -nFlag funktioniert hier nicht).

Daten kopieren

Jetzt können Sie alle Ihre Daten kopieren oder verschieben (wie üblich cpoder rsync).

Ich erwäge in der Tat Ihren Rat, beide als ZFS zu formatieren, da ich hier in keinem besonderen Fall bin. Möchten Sie diese Situation in Ihrer Antwort näher erläutern und Details (wie in der Struktur) über das Snapshot-Management und wie Sie einen Start in einem von ihnen erreichen oder den Snapshot in Root wiederherstellen können? Ich würde die gesamten 3 TB als ZFS partitionieren und dann aus meinem ZFS-Betriebssystem Datenpools und Datasets hinzufügen, und zwar für meine Speicher-, Home- und Snapshot-Partitionen. Aber ab da wäre ich hilflos. Marian vor 6 Jahren 0
@Marian Bitte siehe meinen aktualisierten Beitrag. Ich hoffe, es ist nicht zu verwirrend - ich habe einige Teile hinzugefügt, die Sie bereits richtig verstanden haben, sodass andere das vollständige Teil in der Zukunft finden. Das hört sich viel komplizierter an, ist aber im Grunde einfach. Sie können auch Pools aus Dateien erstellen (mit mkfile Platten erstellen und dann die vollständigen Pfade angeben, um zpool create zu erstellen) und mit ihnen spielen, als wären sie real - es ist dieselbe und eine gute Möglichkeit, Ihre Aktionen zu simulieren, ohne Ihre realen Daten zu beschädigen. user121391 vor 6 Jahren 1
Ich sollte Kommentare wie "Danke" vermeiden, aber ich schätze es sehr, dass Sie Menschen wie mir die Grundlagen des ZFS näher erläutert haben und sich die Zeit nehmen. Es ist an manchen Stellen immer noch verwirrend, aber wie beim Schwimmen oder irgendetwas muss man einfach an einem Punkt beginnen :) Marian vor 6 Jahren 1
@Marian Kein Problem und vielen Dank für das Dankeschön :) Ich denke, diese Regel gilt nur für Posts, bei denen Sie nach einer einfachen Antwort 200 "Thx" finden - ZFS ist hier eher eine Nische, also keine Sorge! Wenn Sie einige sehr gute Erklärungen mit Beispielen sehen möchten, empfehle ich den Blog von Constantin Gonzalez (ehemaliger Mitarbeiter von Sun) sowie die Beiträge von gea (Schöpfer von Napp-it) in verschiedenen Foren, die sich auf ZFS beziehen. Beide haben mir sehr geholfen, als ich mit ZFS anfing. Ansonsten viel Spaß beim Erkunden und immer ein Backup bereit halten, wenn etwas schief geht;) user121391 vor 6 Jahren 0