zfs rinomina / sposta il filesystem di root in child


9

Esiste una domanda simile ma la soluzione (usando mv) è terribile perché in questo caso funziona come "copia, quindi rimuovi" piuttosto che "mossa" pura.

Quindi, ho creato un pool:

zpool create tank /dev/loop0

e sincronizzato i miei dati da un altro archivio direttamente lì in modo che i miei dati siano ora /tank.

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

Ora ho capito che ho bisogno che i miei dati siano in un filesystem figlio, non /tankdirettamente nel filesystem.

Quindi, come posso spostare o rinominare il filesystem di root esistente in modo che diventi un bambino all'interno del pool?

La ridenominazione semplice non funzionerà:

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

(A proposito, perché si lamenta che i set di dati non si trovano nello stesso pool quando in realtà ho solo un pool?)

So che ci sono soluzioni che implicano la copia di tutti i dati ( mvo l'invio dell'intero set di dati a un altro dispositivo e viceversa), ma non dovrebbe esserci un modo semplice ed elegante?

Solo notando che in questa fase non mi interessano le istantanee (non ce ne sono ancora di cui occuparsi).

Risposte:


4

(vedi le note nei commenti, funziona, ma non sarai mai in grado di eliminare lo snapshot iniziale, quindi non è una buona soluzione)

Con ZFS questo è sorprendentemente semplice: basta un'istantanea, clonare e poi rm. Non è necessario spazio aggiuntivo o tempo di copia.

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

Fai attenzione quando esegui rm -rf se non cambi il punto di mount di se hai altri filesystem nel tuo zpool. Non si desidera rimuovere in modo ricorsivo il contenuto del nuovo filesystem (/ tank / newname) o di qualsiasi altro filesystem figlio (tank / *) accidentalmente. Dopo aver verificato che i tuoi file non sono nel root fs (/ tank /) e solo nel tuo nuovo filesystem, puoi anche cancellare quella istantanea iniziale.

zfs delete tank@mydata

Sembra una risposta plausibile (non riesco a pensare a nessun altro modo per ottenere i dati in un nuovo set di dati senza spostarli) ma sfortunatamente non è possibile eliminare questa istantanea originale. I cloni hanno alcuni effetti collaterali imbarazzanti. Non è possibile eliminare tank @ mydata poiché il nuovo set di dati dipende da questo. Puoi promuovere il nuovo set di dati, che sposta tank @ mydata in tank / newname @ mydata, ma ora hai cambiato la dipendenza e ottieni divertenti errori "set di dati già esistenti" se provi a rimuovere il nuovo set di dati (almeno su FreeBSD, anche se presumo che sia probabilmente ZFS piuttosto che OS).
USD Matt,

@USDMatt: hai perfettamente ragione. Funziona perfettamente se stai lavorando con sottofile di sistema (tank / a -> tank / a @ snap -> tank / asnap-clone -> tank / rinominato-asnap-clone) ma non se stai lavorando alla radice del zpool. Sembra un bug, calcola come un altro motivo per non riempire mai il filesystem di root del tuo pool).
notpeter

4

Dato il problema documentato da @USDMatt, l'invio / la ricezione di ZFS è probabilmente il modo migliore di procedere.

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

Fai attenzione quando esegui rm -rf se non cambi il punto di mount di se hai altri filesystem nel tuo serbatoio zpool. Non si desidera rimuovere in modo ricorsivo il contenuto del nuovo filesystem (/ tank / newname) o di qualsiasi altro filesystem figlio (/ tank / *) accidentalmente.


0

Non penso che ci sia un modo semplice ed elegante ... anche se potresti semplicemente cambiare il tuo mountpoint ...

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

O forse rinominare il serbatoio e poi montarlo dove serve ...

O quello, o crea un filesystem nel posto giusto e cp, mv o zfs invia / ricevi ...

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.