So mounten Sie ein externes ZFS-Dateisystem, ohne das aktuelle oder externe Dateisystem zu beschädigen oder zu ändern

11

Ich verwende FreeBSD 10.2 mit ZFS im Stammverzeichnis als Dateisystem (zroot01) . Ich habe eine externe Festplatte mit einem ZFS-Dateisystem von einem anderen FreeBSD 10.2-System (zroot02) , die ich vorübergehend bereitstellen möchte, schreibgeschützt, damit ich einige Dateien daraus entfernen und sie anschließend trennen kann. Ich möchte nicht, dass das externe ZFS-System mein aktuelles Dateisystem blockiert oder ersetzt, und ich möchte auch nicht, dass die Daten auf dem externen System beschädigt / geändert werden.

Um zu demonstrieren, was ich erreichen möchte, würde ich mit UFS etwa Folgendes tun:

mount -t ufs -o ro /dev/ada0s2 /mnt/my-fun-mountpoint

... wo /dev/ada0s2ist die Partition auf meinem externen Laufwerk und /mnt/my-fun-mountpointbefindet sich im /mntVerzeichnis meines vorhandenen Betriebssystems.

Das gesamte Suchen und Lesen von Manpages hat hierfür keine kristallklare Methode bereitgestellt. Welche Antworten ich gefunden habe , hat letztendlich mein aktuelles Dateisystem übernommen und es irreparabel beschädigt - offensichtlich nicht das Ergebnis, das ich suche. Ich habe es vor einiger Zeit versucht, daher kann ich mich leider nicht erinnern, welche Befehle ich versucht habe.

Können Sie bitte eine klare Anleitung dazu geben? Vielen Dank im Voraus für deine Hilfe.

Will B.
quelle

Antworten:

13

Nun, es hängt wirklich davon ab, wie schreibgeschützt der Pool sein soll. Und nein, das ist kein Scherz.

Zunächst ein bisschen Terminologie: In ZFS importieren Sie einen Pool und mounten optional die (beliebigen) Dateisysteme darin. Sie können einen Pool importieren , ohne indem alle Dateisysteme Montage -Nan zpool importund hängen Sie dann später auf beliebige Dateisysteme mit zfs mount. (Dies ist ein absolut gültiges Szenario, wenn Sie beispielsweise nur auf ein einziges Dateisystem von vielen zugreifen möchten oder wenn Sie etwas tun möchten, das einem Offline-Scrub des Pools ähnelt.)

ZFS ist kein großer Fan von wirklich schreibgeschütztem Zugriff. Wenn ZFS beispielsweise einen Fehler feststellt, den es reparieren kann, wird der Fehler meines Erachtens behoben und die reparierten Daten werden auf die Festplatte geschrieben, selbst wenn Sie den Pool schreibgeschützt importiert haben. Nach meinem Verständnis gilt in ZFS-Parlace "schreibgeschützt" nur für den vom Benutzer sichtbaren Status des Pools und seiner Datensätze. Wenn Sie andererseits eine Binärkopie der Festplatte in eine Datei (oder einen Satz von Dateien) erstellen, diese Dateien wirklich schreibgeschützt machen und versuchen, den Pool von dort zu importieren, kann ZFS den nicht importieren Pool überhaupt, egal wie sehr Sie es versuchen. Wenn Sie die Dateien beschreibbar machen, funktioniert es einwandfrei. (Ich habe es tatsächlich erst vor ein paar Wochen versucht, obwohl ich ein zvol verwendet habe, und ZFS lehnte dies vehement abum den Pool zu importieren. Wenn ich das zvol auf "Lesen / Schreiben" anstatt "Nur Lesen" eingestellt habe, wurde der Pool einwandfrei importiert.) Andere Dateisysteme wie (unter Linux) ext4 und wahrscheinlich andere behandeln diese Situation etwas elegant, aber ZFS scheut sich.

Wenn Sie Pech haben und auf dem System, auf das Sie den Pool importieren , kein ECC-RAM installiert ist, kann der Versuch von ZFS, auftretende Fehler zu korrigieren, die Situation tatsächlich verschlimmern , obwohl die Meinungen darüber, ob dies tatsächlich ein echtes Risiko darstellt, unterschiedlich sind in der Praxis. Persönlich bin ich der Meinung, dass alle Daten, die mir wichtig genug sind, um sie mit ZFS und Snapshots sowie Redundanz und Backups auf Speicherebene zu schützen, und was nicht den Schutz verdient, den auch der ECC-RAM bietet, aber viele PCs haben keinen ECC-RAM.

So können Sie den Pool in Nur - Lese-Modus importieren, mit einem bestimmten alternativen Root - Verzeichnis , damit er nicht treten auf etwas anderes ist Zehen, aber Sie müssen sich bewusst sein , dass es nicht unbedingt wirklich schreibgeschützt in einer forensischen Sinne. (Es wird jedoch sicherstellen, dass Sie nicht versehentlich etwas im Pool ändern sich.) Eine Nur - Lese-Import zu tun, unter der Annahme , dass der Pool genannt wird , tankund dass die Geräteknoten (en) ist / sind in /dev, würden Sie Verwenden Sie einen Befehl wie:

# zpool import tank -d /dev -o readonly=on -R /mnt/someplace

Dies sucht /devnach allem, was einen ZFS-Pool mit dem Namen enthält tank, importiert ihn, setzt die Pool-Eigenschaft vorübergehend readonlyauf on(was bedeutet, dass alle vom Benutzer initiierten Schreibvorgänge abgelehnt werden) und setzt seine altrootEigenschaft vorübergehend auf /mnt/someplace. (Diese Eigenschaftswerte sind "temporär" in dem Sinne, dass sie nicht als aktuelle Eigenschaftswerte auf den Datenträgern gespeichert werden. Wenn Sie also den Pool ohne sie exportieren und erneut importieren, sind die Werte wieder normal Möglicherweise wird jedoch in den Poolverlauf geschrieben, den Sie nach dem Importieren des Pools anzeigen könnenzpool history tank Wenn Sie dazu neigen.) Sobald der Pool importiert wurde, sehen Sie Ihre Dateien unter / mnt / irgendwo und haben normalen schreibgeschützten Zugriff darauf, einschließlich aller Snapshots, die bereits für die Datensätze im Pool erstellt wurden.

In Anbetracht Ihres Beispiels vermute ich, dass Sie etwas in der Art von:

# zpool import zroot02 -d /dev -o readonly=on -R /mnt/my-fun-mountpoint

Wenn Sie fertig sind, denken Sie daran, den Pool sauber zu exportieren:

# zpool export tank

oder vielleicht

# zpool export zroot02

Dadurch werden alle Dateisysteme und andere Datensätze innerhalb des Pools ausgehängt, alle Puffer geleert (in dem Maße, in dem überhaupt ein Löschen erforderlich ist), der Pool als nicht auf allen Geräten der einzelnen Komponenten importiert markiert und alle anderen erforderlichen Verwaltungsaufgaben ausgeführt, um dies sicherzustellen dass der Pool sicher auf ein anderes System verschoben und später dort importiert werden kann.

ein CVn
quelle
1
Wenn Sie wirklich sicher sind, dass das, was Sie in Ihrem dritten Absatz angeben, korrekt ist, wäre dies ein Fehler bei der BSD ZFS-Implementierung. Der schreibgeschützte Import des ZFS-Pools wurde so konzipiert, dass er wirklich schreibgeschützt ist, dh er versucht niemals, Daten oder Metadaten, einschließlich des Poolverlaufs, zu schreiben oder zu korrigieren. Siehe arc.stillopensolaris.org/txt/PSARC_2010_306.txt
jlliagre
1
@jlliagre Ich bin mir ziemlich sicher, aber es könnte im Zusammenhang mit einer anderen ZFS-Implementierung gewesen sein. Ich verstehe jedoch nicht wirklich, warum sie sich in einem so grundlegenden Aspekt unterscheiden würden; Ich glaube, dass alle Open-Source-ZFS-Implementierungen eine erhebliche Menge an Code gemeinsam haben, die ihre Abstammung auf Sun zurückführt. Ich könnte eine Art Testumgebung dafür einrichten und mit einem Stock daran herumstochern und dann sehen, was passiert, aber es wird einige Zeit dauern, bis ich die Zeit dafür aufwenden kann.
Ein CVn