Como clonar o sistema de arquivos btrfs em diferentes mídias que preservam os dados de compartilhamento de snapshots

8

Eu decidi experimentar os recursos de raid do btrfs. Eu configurei um btrfs com

sudo mkfs.btrfs -m raid10 -d raid10 /dev/sda9 /dev/sdb9 /dev/sdc9 /dev/sdd9

Agora eu quero clonar minha partição btrfs existente (que fica no topo do linux-raid). não posso usar um simples cp -a , porque há mais de 40 backups baseados em instantâneos (que desejo preservar), e eu iria simplesmente sobrecarregar todo o armazenamento que eu posso poupar várias vezes.

Até agora, vejo duas opções:

partclone.btrfs -s /path/to/original/fs -o /dev/sda9 -b

e suponho que eu também precise btrfs balance start /dev/sda9

e

faça: copie incrementalmente com cp -a tanto quanto se encaixa no armazenamento e, em seguida, use bedup para definir arquivos duplicados e loop.

Qual é o método preferido (ou seja, melhor prática)? Eu preferiria muito mais o primeiro; Deve demorar muito menos tempo. Ou talvez haja algum mal "pegadinha" à espreita em qualquer um desses procedimentos (além do fato de que o btrfs é experimental, é claro)

A primeira pergunta está simplesmente fora de questão; no entanto ferramenta maravilhosa o partclone.btrfs é, obviamente, não suporta sistemas de arquivos multi-dispositivo. : - (

    
por Adam Ryczkowski 03.02.2013 / 09:43

4 respostas

6

Eu perguntei a uma pergunta semelhante há dois anos.

No entanto, no meu caso, eu estava planejando apenas copiar um único dispositivo para o raid0.

Eu finalmente encontrei uma solução . Na época você não podia converter de raid0 para raid10, mas parece que desde o kernel 3.3, você pode agora. Então, essa solução pode funcionar para você no final.

Um problema com essa abordagem é que copia o fsuid. O que significa que você não pode montar o FS e sua cópia na mesma máquina. Na época, não havia nenhuma ferramenta para alterar o fsuid de um FS, mas pode ter mudado agora.

A idéia é adicionar uma camada de cópia na escrita sobre o dispositivo original para que ele possa ser gravado, mas qualquer modificação é feita em algum outro lugar que você possa descartar mais tarde. Isso significa que você precisa de espaço de armazenamento adicional (por exemplo, em uma unidade externa).

Em seguida, monte o COW'd FS em vez do original, adicione os dispositivos para a cópia do FS e remova o dispositivo da COW.

Para copiar-em-escrever, você pode usar o mapeador de dispositivos.

Para a cópia descartável na área de gravação, aqui eu uso um dispositivo de loop.

Digamos que você queira clonar /dev/sda em /dev/sd[bcde] :

Crie o armazenamento de volta da COW:

truncate -s 100G /media/STORE/snap-store
losetup /dev/loop0 /media/STORE/snap-store

Agora, desmonte o FS de origem, se montado, e modprobe -r btrfs , para garantir que ele não interfira e faça com que ele esqueça a verificação do dispositivo.

Em seguida, faça o dispositivo COW'd:

echo "echo 0 $(blockdev --getsize /dev/sda) snapshot /dev/sda /dev/loop0 N 8 | dmsetup create cowed

Agora, /dev/mapper/cowed é como /dev/sda , exceto que qualquer coisa escrita em /dev/loop0 e /dev/sda não será afetada.

Agora, você pode montá-lo:

mount /dev/mapper/cowed /mnt

Adicione os outros dispositivos:

btrfs dev add /dev/sd[bcde] /mnt

E remova o antigo:

btrfs dev del /dev/mapper/cowed /mnt

Quando isso acabar, você pode querer desligar e desconectar ou fazer /dev/sda somente como porque ele tem o mesmo fsuid que os outros, btrfs ainda pode atrapalhar com isso.

Agora, se eu entendi corretamente, supondo que você tenha o btrfs-prog recente, você deve ser capaz de:

btrfs balance start -d convert=raid10 /mnt

Para converter em raid10. Em teoria, isso deve garantir que cada pedaço de dados seja copiado em pelo menos dois discos.

Eu recomendo strongmente que você faça testes em um btrfs fictício em dispositivos de loop primeiro, pois tudo isso é da memória e eu poderia ter errado (veja, por exemplo, minha resposta inicial antes da minha edição).

Note que, desde o kernel 3.6, o btrfs implementa o send / receive um pouco como no zfs. Isso pode ser uma opção para você.

    
por 03.02.2013 / 12:42
3

A ideia de Stephane pode ser feita através de ferramentas internas do btrfs (é por isso que é legal): fazer do antigo btrfs um dispositivo de propagação via btrfstune -S 1 /dev/device , adicionar dispositivos, remover o dispositivo de propagação, fazer btrfs balance start . Um dispositivo de propagação é um dispositivo somente leitura que pode fazer parte de um sistema de arquivos de leitura-gravável.

    
por 27.10.2013 / 17:07
1

Eu tentei seguir a sugestão do @ ignis para usar a semeadura, mas tive problemas com ela; o sistema jogou um erro ao tentar remover o dispositivo de semente e eu não pude superar isso. Então eu descobri que existe (now - btrfs-progs v3.19-64-g19a806f, talvez não antes) o comando:

  btrfs replace start [-Bfr] <srcdev>|<devid> <targetdev> <path>

que fez clonar meu sistema de arquivos btrfs existente (que estava em um volume lógico LVM) em uma nova partição a doddle. Observe que, em maio de 2015, não funciona para perfis RAID5 / 6 - verifique a página de manual para obter informações completas.

    
por 02.05.2015 / 20:48
0
  1. Use o venerável dd para uma cópia exata
  2. btrfstune -u <newdev> criará um novo UUID para o clone.

Você terá a garantia de corrupção se montar o sistema de arquivos rw até a etapa 2 terminar:)

    
por 21.12.2017 / 06:05

Tags