zfs renomeia / move sistema de arquivos raiz para filho

9

Pergunta semelhante existe, mas a solução (usando mv) é péssima porque, neste caso, funciona como "copiar e remover" em vez de "mover" puro.

Então, eu criei um pool:

zpool create tank /dev/loop0

e sincronizamos meus dados diretamente de outro armazenamento lá, para que meus dados estejam agora /tank.

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

Agora eu percebi que preciso que meus dados estejam em um sistema de arquivos filho, não /tankdiretamente no sistema de arquivos.

Então, como movo ou renomeio o sistema de arquivos raiz existente para que ele se torne um filho dentro do pool?

Renomear simples não funcionará:

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

(Btw, por que reclama que os conjuntos de dados não estão no mesmo pool quando, se, de fato, eu tenho apenas um pool?)

Sei que existem soluções que envolvem copiar todos os dados ( mvou enviar o conjunto de dados inteiro para outro dispositivo e vice-versa), mas não deveria haver uma maneira simples e elegante?

Apenas observando que eu não ligo para instantâneos nesta fase (ainda não há nenhum para cuidar).

Anton
fonte

Respostas:

4

(veja as notas nos comentários, isso funciona, mas você nunca poderá excluir o snapshot inicial, portanto, não é uma boa solução)

Com o ZFS, isso é surpreendentemente simples: apenas snapshot, clone e depois rm. Não é necessário espaço extra ou tempo de cópia.

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

Cuidado ao executar o rm -rf se você não alterar o ponto de montagem se tiver outros sistemas de arquivos no seu zpool. Você não deseja remover recursivamente o conteúdo do novo sistema de arquivos (/ tank / newname) ou de qualquer outro sistema de arquivos filho (tank / *) acidentalmente. Depois de confirmar que seus arquivos não estão na raiz fs (/ tank /) e apenas no seu novo sistema de arquivos, você também pode excluir esse instantâneo inicial.

zfs delete tank@mydata
notpeter
fonte
Parece uma resposta plausível (não consigo pensar em outra maneira de inserir os dados em um novo conjunto de dados sem movê-los), mas infelizmente você não pode excluir este instantâneo original. Os clones têm alguns efeitos colaterais estranhos. Você não pode excluir tank @ mydata, pois o novo conjunto de dados depende dele. Você pode promover o novo conjunto de dados, que moverá tank @ mydata para tank / newname @ mydata, mas agora você trocou a dependência e obtém erros engraçados de 'conjunto de dados já existe' se tentar remover o novo conjunto de dados (pelo menos no FreeBSD, embora eu assuma que isso seja provavelmente específico do ZFS, e não do sistema operacional).
USD Matt,
@USDMatt: Você está totalmente certo. Isso funciona perfeitamente se você estiver trabalhando com sistemas de subarquivos (tank / a -> tank / a @ snap -> tank / asnap-clone -> tank / renomeado-asnap-clone), mas não se estiver trabalhando na raiz do zpool. Parece um bug, considere isso como outro motivo para nunca preencher o sistema de arquivos raiz do seu pool).
notpeter
4

Dado o problema documentado pelo @USDMatt, o envio / recebimento de ZFS é provavelmente o melhor caminho a percorrer.

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

Cuidado ao executar o rm -rf se você não alterar o ponto de montagem, se você tiver outros sistemas de arquivos no seu tanque zpool. Você não deseja remover recursivamente o conteúdo do novo sistema de arquivos (/ tank / newname) ou de qualquer outro sistema de arquivos filho (/ tank / *) acidentalmente.

notpeter
fonte
0

Eu não acho que exista uma maneira simples e elegante ... embora você possa mudar seu ponto de montagem ...

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

Ou talvez renomeie o tanque e monte-o onde você precisar ...

Ou crie um sistema de arquivos no lugar certo e os cp, mv ou zfs enviam / recebem ...

ewwhite
fonte