zfs zmień nazwę / przenieś główny system plików na dziecko

9

Podobne pytanie istnieje, ale rozwiązanie (użycie mv) jest okropne, ponieważ w tym przypadku działa jako „kopiuj, a następnie usuwaj”, a nie „ruch”.

Więc stworzyłem pulę:

zpool create tank /dev/loop0

i zsynchronizowałem moje dane z innego magazynu bezpośrednio tam, aby moje dane były teraz w /tank.

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

Teraz zdałem sobie sprawę, że moje dane muszą znajdować się w podrzędnym systemie plików, a nie /tankbezpośrednio w systemie plików.

Jak więc przenieść lub zmienić nazwę istniejącego głównego systemu plików, aby stał się on dzieckiem w puli?

Prosta zmiana nazwy nie działa:

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

(Przy okazji, dlaczego narzeka, że ​​zbiory danych nie znajdują się w tej samej puli, skoro w rzeczywistości mam tylko jedną pulę?)

Wiem, że istnieją rozwiązania polegające na kopiowaniu wszystkich danych ( mvlub wysyłaniu całego zestawu danych na inne urządzenie iz powrotem), ale czy nie powinien istnieć prosty elegancki sposób?

Wystarczy zauważyć, że na tym etapie nie dbam o migawki (nie ma jeszcze żadnych do załatwienia).

Anton
źródło

Odpowiedzi:

4

(patrz uwagi w komentarzach, to działa, ale nigdy nie będziesz w stanie usunąć początkowej migawki, więc nie jest to dobre rozwiązanie)

Z ZFS jest to zaskakująco proste: wystarczy migawka, klonowanie, a następnie rm. Nie wymaga dodatkowego miejsca ani czasu kopiowania.

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

Uważaj podczas uruchamiania rm -rf, jeśli nie zmienisz punktu montowania, jeśli masz inne systemy plików w zpool. Nie chcesz przypadkowo usuwać rekurencyjnie zawartości nowego systemu plików (/ tank / newname) ani innych potomnych systemów plików (tank / *). Po potwierdzeniu, że twoje pliki nie znajdują się w katalogu głównym fs (/ tank /) i tylko w nowym systemie plików, możesz również usunąć tę początkową migawkę.

zfs delete tank@mydata
notpeter
źródło
Wydaje się to wiarygodną odpowiedzią (nie mogę wymyślić innego sposobu na przeniesienie danych do nowego zestawu danych bez przeniesienia go), ale niestety nie można usunąć tej oryginalnej migawki. Klony mają kilka niezręcznych efektów ubocznych. Nie możesz usunąć tank @ mydata, ponieważ od tego zależy nowy zestaw danych. Możesz promować nowy zestaw danych, który przeniesie tank @ mydata do tank / newname @ mydata, ale teraz zmieniłeś zależność i otrzymujesz śmieszne błędy „zestaw danych już istnieje”, jeśli spróbujesz usunąć nowy zestaw danych (przynajmniej na FreeBSD, chociaż zakładam, że jest to raczej specyficzne dla ZFS niż dla systemu operacyjnego).
USD Matt
@USDMatt: Masz całkowitą rację. Działa to doskonale, jeśli pracujesz z podsystemami (tank / a -> tank / a @ snap -> tank / asnap-clone -> tank / renamed-asnap-clone), ale nie, jeśli pracujesz w katalogu głównym zpool. Czujesz się jak błąd, napisz go jako kolejny powód, aby nigdy nie zapełniać głównego systemu plików swojej puli).
nie
4

Biorąc pod uwagę problem udokumentowany przez @USDMatt, wysyłanie / odbieranie ZFS jest prawdopodobnie najlepszym sposobem.

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

Uważaj podczas uruchamiania rm -rf, jeśli nie zmienisz punktu montowania, jeśli masz inne systemy plików w swoim zbiorniku Zpool. Nie chcesz przypadkowo usuwać rekurencyjnie zawartości nowego systemu plików (/ tank / newname) ani innych potomnych systemów plików (/ tank / *).

notpeter
źródło
0

Nie sądzę, że istnieje prosty elegancki sposób ... chociaż możesz po prostu zmienić punkt montowania ...

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

A może zmień nazwę czołgu, a następnie zamontuj go tam, gdzie go potrzebujesz ...

Albo to, albo utwórz system plików we właściwym miejscu, a cp, mv lub zfs wysyłaj / odbieraj ...

ewwhite
źródło