zfs benennt das Root-Dateisystem um / verschiebt es in das untergeordnete

9

Eine ähnliche Frage existiert, aber die Lösung (mit mv) ist schrecklich, weil sie in diesem Fall eher als "Kopieren, dann Entfernen" als als reines "Verschieben" funktioniert.

Also habe ich einen Pool erstellt:

zpool create tank /dev/loop0

und synchronisierte meine Daten von einem anderen Speicher dort direkt, so dass meine Daten jetzt in sind /tank.

zfs list
NAME      USED  AVAIL  REFER  MOUNTPOINT
tank      591G  2.10T   591G  /tank

Jetzt habe ich festgestellt, dass sich meine Daten in einem untergeordneten Dateisystem befinden müssen, nicht /tankdirekt im Dateisystem.

Wie verschiebe oder benenne ich das vorhandene Root-Dateisystem um, damit es zu einem untergeordneten Element im Pool wird?

Einfaches Umbenennen funktioniert nicht:

zfs rename tank tank/mydata
cannot rename to 'tank/mydata': datasets must be within same pool

(Übrigens, warum beschwert es sich, dass sich die Datensätze nicht innerhalb desselben Pools befinden, wenn ich tatsächlich nur einen Pool habe?)

Ich weiß, dass es Lösungen gibt, bei denen alle Daten kopiert werden ( mvoder der gesamte Datensatz an ein anderes Gerät und zurück gesendet wird), aber sollte es keinen einfachen, eleganten Weg geben?

Ich stelle nur fest, dass ich mich derzeit nicht um Schnappschüsse kümmere (es gibt noch keine, um die ich mich kümmern muss).

Anton
quelle

Antworten:

4

(Siehe Anmerkungen in den Kommentaren. Dies funktioniert, aber Sie können den Schnappschuss nie löschen, daher ist dies keine gute Lösung.)

Mit ZFS ist dies überraschend einfach: nur Snapshot, Klon und dann rm. Kein zusätzlicher Speicherplatz oder Kopierzeit erforderlich.

zfs snapshot tank@mydata
zfs clone tank@mydata tank/newname
zfs set mountpoint=/beep/boop tank/newname
rm -rf /tank/*

Achten Sie beim Ausführen von rm -rf darauf, dass Sie den Einhängepunkt nicht ändern, wenn Sie andere Dateisysteme in Ihrem zpool haben. Sie möchten den Inhalt des neuen Dateisystems (/ tank / newname) oder anderer untergeordneter Dateisysteme (tank / *) nicht versehentlich rekursiv entfernen. Sobald Sie bestätigt haben, dass sich Ihre Dateien nicht im Stammverzeichnis fs (/ tank /) und nur in Ihrem neuen Dateisystem befinden, können Sie auch diesen ersten Snapshot löschen.

zfs delete tank@mydata
notpeter
quelle
Scheint eine plausible Antwort zu sein (ich kann mir keine andere Möglichkeit vorstellen, die Daten in ein neues Dataset zu übertragen, ohne es zu verschieben), aber leider können Sie diesen ursprünglichen Schnappschuss nicht löschen. Klone haben einige unangenehme Nebenwirkungen. Sie können tank @ mydata nicht löschen, da der neue Datensatz davon abhängt. Sie können den neuen Datensatz heraufstufen, wodurch tank @ mydata in tank / newname @ mydata verschoben wird. Jetzt haben Sie die Abhängigkeit vertauscht und erhalten lustige Fehler, dass der Datensatz bereits vorhanden ist, wenn Sie versuchen, den neuen Datensatz zu entfernen (zumindest) unter FreeBSD, obwohl ich davon ausgehe, dass dies wahrscheinlich eher ZFS-spezifisch als OS ist).
USD Matt
@USDMatt: Du hast vollkommen recht. Dies funktioniert perfekt, wenn Sie mit Subdateisystemen arbeiten (tank / a -> tank / a @ snap -> tank / asnap-clone -> tank / umbenannt-asnap-clone), aber nicht, wenn Sie an der Wurzel des arbeiten zpool. Fühlt sich wie ein Fehler an, kreuzen Sie ihn als einen weiteren Grund an, das Root-Dateisystem Ihres Pools niemals zu füllen.
Notpeter
4

Angesichts des von @USDMatt dokumentierten Problems ist das Senden / Empfangen von ZFS wahrscheinlich der beste Weg.

zfs snapshot tank@snap
zfs send tank@snap | zfs receive tank/anotherfs
zfs set mountpoint=/beep/boop tank/anotherfs
rm -rf /tank/*
zfs destroy tank@snap

Achten Sie beim Ausführen von rm -rf darauf, dass Sie den Mount-Punkt nicht ändern, wenn Sie andere Dateisysteme in Ihrem Tank-Zpool haben. Sie möchten den Inhalt des neuen Dateisystems (/ tank / newname) oder anderer untergeordneter Dateisysteme (/ tank / *) nicht versehentlich rekursiv entfernen.

notpeter
quelle
0

Ich glaube nicht, dass es einen einfachen, eleganten Weg gibt ... obwohl Sie einfach Ihren Mountpoint ändern könnten ...

mkdir /tank
zfs set mountpoint=/tank/mydata <possibly renamed tank set>

Oder benennen Sie den Tank um und montieren Sie ihn dort, wo Sie ihn brauchen ...

Entweder das, oder erstellen Sie ein Dateisystem am richtigen Ort und senden / empfangen Sie cp, mv oder zfs ...

ewwhite
quelle