zfs renomeia / move o sistema de arquivos raiz para filho

7

Pergunta semelhante existe mas a solução (usando mv ) é horrível porque neste caso funciona como "copiar, depois remover" em vez de "mover".

Então, criei um pool:

zpool create tank /dev/loop0

e rsynced meus dados de outro armazenamento lá diretamente para que meus dados estejam em /tank .

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

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

Então, como faço para mover ou renomear o sistema de arquivos raiz existente para que ele se torne um filho dentro do pool?

A renomeação simples não funciona:

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 dentro do mesmo pool quando, se é verdade, eu só tenho um pool?)

Eu sei que há soluções que envolvem copiar todos os dados ( mv , ou enviar todo o conjunto de dados para outro dispositivo e voltar), mas não deve haver uma maneira simples e elegante?

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

    
por Anton 21.10.2012 / 07:45

3 respostas

3

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

Com o ZFS, isso é surpreendentemente direto: apenas snapshot, clone e, em seguida, rm. Sem espaço extra ou tempo de cópia necessário.

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 em seu zpool. Você não deseja remover recursivamente o conteúdo do novo sistema de arquivos (/ tank / newname) ou qualquer outro sistema de arquivos filho (tank / *) acidentalmente. Uma vez que você tenha confirmado que seus arquivos não estão no fs root (/ tank /) e somente no seu novo sistema de arquivos, você também pode deletar o instantâneo inicial.

zfs delete tank@mydata
    
por 07.12.2012 / 15:36
3

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

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 tiver outros sistemas de arquivos no zpool do seu tanque. Você não deseja remover recursivamente o conteúdo do novo sistema de arquivos (/ tank / newname) ou qualquer outro sistema de arquivos filho (/ tank / *) acidentalmente.

    
por 07.12.2012 / 16:37
0

Eu não acho que haja 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 isso, ou crie um sistema de arquivos no lugar certo e cp, mv ou zfs send / receive ...

    
por 21.10.2012 / 14:00