zfs renommer / déplacer le système de fichiers racine en enfant

9

Une question similaire existe mais la solution (en utilisant mv) est horrible car dans ce cas, cela fonctionne comme "copier, puis supprimer" plutôt que "déplacer" pur.

J'ai donc créé un pool:

zpool create tank /dev/loop0

et rsynced mes données d'un autre stockage là-dedans directement afin que mes données soient maintenant dedans /tank.

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

Maintenant, je me rends compte que j'ai besoin que mes données soient dans un système de fichiers enfant, pas /tankdirectement dans le système de fichiers.

Alors, comment déplacer ou renommer le système de fichiers racine existant afin qu'il devienne un enfant dans le pool?

Le renommage simple ne fonctionnera pas:

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

(Btw, pourquoi se plaint-il que les ensembles de données ne se trouvent pas dans le même pool si, en fait, je n'ai qu'un seul pool?)

Je sais qu'il existe des solutions qui impliquent la copie de toutes les données ( mvou l'envoi de l'ensemble de données vers un autre appareil et vice-versa), mais ne devrait-il pas y avoir une méthode simple et élégante?

Juste en notant que je ne me soucie pas des instantanés à ce stade (il n'y en a pas encore).

Anton
la source

Réponses:

4

(voir les notes dans les commentaires, cela fonctionne, mais vous ne pourrez jamais supprimer le snapshot initial, donc ce n'est pas une bonne solution)

Avec ZFS, cela est étonnamment simple: juste un instantané, un clone et ensuite rm. Aucun espace supplémentaire ou temps de copie requis.

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

Attention lors de l'exécution de rm -rf si vous ne changez pas le point de montage si vous avez d'autres systèmes de fichiers dans votre zpool. Vous ne voulez pas supprimer récursivement le contenu du nouveau système de fichiers (/ tank / newname) ou de tout autre système de fichiers enfant (tank / *) accidentellement. Une fois que vous avez confirmé que vos fichiers ne se trouvent pas dans le root fs (/ tank /) et uniquement dans votre nouveau système de fichiers, vous pouvez également supprimer cet instantané initial.

zfs delete tank@mydata
notpeter
la source
Cela semble être une réponse plausible (je ne peux pas penser à un autre moyen pour obtenir les données dans un nouvel ensemble de données sans le déplacer) mais malheureusement, vous ne pouvez pas supprimer cet instantané d'origine. Les clones ont quelques effets secondaires gênants. Vous ne pouvez pas supprimer tank @ mydata car le nouvel ensemble de données en dépend. Vous pouvez promouvoir le nouvel ensemble de données, ce qui déplacera tank @ mydata vers tank / newname @ mydata, mais maintenant vous avez échangé la dépendance et vous obtenez des erreurs amusantes `` l'ensemble de données existe déjà '' si vous essayez de supprimer le nouvel ensemble de données (au moins sur FreeBSD, bien que je suppose que c'est probablement ZFS spécifique plutôt que OS).
USD Matt
@USDMatt: Vous avez tout à fait raison. Cela fonctionne parfaitement si vous travaillez avec des sous-systèmes (tank / a -> tank / a @ snap -> tank / asnap-clone -> tank / renamed-asnap-clone) mais pas si vous travaillez à la racine du zpool. Se sent comme un bogue, craquez-le comme une autre raison de ne jamais remplir le système de fichiers racine de votre pool).
notpeter
4

Étant donné le problème documenté par @USDMatt, l'envoi / réception ZFS est probablement la meilleure solution.

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

Faites attention lorsque vous exécutez rm -rf si vous ne changez pas le point de montage ou si vous avez d'autres systèmes de fichiers dans votre réservoir zpool. Vous ne voulez pas supprimer récursivement le contenu du nouveau système de fichiers (/ tank / newname) ou de tout autre système de fichiers enfant (/ tank / *) accidentellement.

notpeter
la source
0

Je ne pense pas qu'il existe une méthode simple et élégante ... bien que vous puissiez simplement changer votre point de montage ...

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

Ou peut-être renommer le réservoir, puis le monter là où vous en avez besoin ...

Soit cela, soit créez un système de fichiers au bon endroit et cp, mv ou zfs envoient / reçoivent ...

ewwhite
la source