Posso criar um array RAID-1 de 2 TB a partir de um disco de 2 TB e dois discos de 1 TB enquanto preservo 1 TB de dados?

3

Atualmente, tenho 1 TB de dados em uma matriz mdadm RAID-1. Essa matriz consiste em um disco de 1 TB e uma partição de 1 TB em um disco de 2 TB. Comprei agora um segundo disco de 1 TB, e gostaria de usá-lo para criar um array RAID-1 de 2 TB.

Os dados nessa matriz serão criptografados com dm-crypt, portanto, quero sobrescrever cada disco com dados de /dev/urandom antes de colocar os dados nele.

A pergunta é se posso criar esse array RAID-1 de 2 TB e substituir de forma segura cada disco com dados aleatórios enquanto preservo o 1 TB de dados que tenho em meu array RAID-1 atual de 1 TB.

Então, para recapitular: tenho discos de 2 x 1 TB e 1 x 2 de disco de TB. Eu quero criar uma matriz RAID-1 de 2 TB, em que um lado do espelho consiste em dois discos de 1 TB agrupados e o outro lado do espelho é todo o disco de 2 TB. Além disso, quero preservar 1 TB de dados usando apenas esses discos, enquanto ainda posso sobrescrever cada disco com dados aleatórios.

    
por runeks 19.08.2013 / 20:53

2 respostas

4

Como para sobrescrever cada disco com dados aleatórios, ele é redundante. Como você vai construir um novo RAID criptografado, o resync substituirá tudo de qualquer maneira.

Quanto ao método de sobrescrever, /dev/urandom é terrivelmente lento, as pessoas que tentam usá-lo para limpar terabytes geralmente cancelam na metade do caminho, porque isso leva muito tempo. Criptografar o dispositivo com uma chave aleatória e, em seguida, limpar isso com /dev/zero é mais rápido e shred -n 1 ainda é muito mais rápido. Portanto, se você precisar ter dados aleatórios em seu disco, recomendo que use esses métodos.

Agora, para o seu RAID, eu faria o seguinte: (neste exemplo, loop2 é o disco de 2 TB)

  • Adicione a nova partição de disco de 1 TB ao RAID-1. Aguarde até a sincronização terminar . Dessa forma, seu 1 TB de dados abrange três discos.

    $ mdadm /dev/md99 --grow --raid-devices=3 --add /dev/loop1p1
    mdadm: added /dev/loop1p1
    raid_disks for /dev/md99 set to 3
    $ cat /proc/mdstat
    md99 : active raid1 loop1p1[2] loop2p1[1] loop0p1[0]
          100224 blocks super 1.2 [3/3] [UUU]
    
  • remova o disco de 2 TB da matriz RAID-1. Seu 1TB ainda é preservado redundantemente nos dois discos de 1TB.

    $ mdadm /dev/md99 --fail /dev/loop2p1
    mdadm: set /dev/loop2p1 faulty in /dev/md99
    $ mdadm /dev/md99 --remove /dev/loop2p1
    mdadm: hot removed /dev/loop2p1 from /dev/md99
    $ mdadm /dev/md99 --grow --raid-devices=2
    raid_disks for /dev/md99 set to 2
    $ cat /proc/mdstat
    md99 : active raid1 loop1p1[2] loop0p1[0]
          100224 blocks super 1.2 [2/2] [UU]
    
  • limpe o disco de 2 TB

    $ shred -n 1 /dev/loop2
    
  • reparticione o disco para 2 TB. Observe que você precisará de uma partição de inicialização se não tiver outro dispositivo de inicialização, pois você não pode inicializar a partir de dispositivos criptografados.

    $ parted /dev/loop2
    
  • crie um novo array RAID-1 usando essa partição e missing para o segundo dispositivo. O segundo dispositivo será adicionado mais tarde. Além disso, o tamanho será limitado por enquanto, para ser aumentado mais tarde, já que não temos certeza do tamanho dos discos de 2x1TB neste momento. (Se tiver certeza, sinta-se à vontade para usar um tamanho diferente aqui, mas você não poderá adicionar o 2x1TB mais tarde se o fizer muito grande).

    $ mdadm /dev/md42 --create --level=1 --raid-devices=2 --size=1000G /dev/loop2p1 missing
    mdadm: largest drive (/dev/loop2p1) exceeds size (102400K) by more than 1%
    Continue creating array? yes
    mdadm: Defaulting to version 1.2 metadata
    mdadm: array /dev/md42 started.
    $ cat /proc/mdstat
    md42 : active raid1 loop2p1[0]
          102400 blocks super 1.2 [2/1] [U_]
    
    md99 : active raid1 loop1p1[2] loop0p1[0]
          100224 blocks super 1.2 [2/2] [UU]
    
  • criptografá-lo, mkfs, copiar dados (use sua codificação e configurações preferidas, LVM, sistema de arquivos, métodos de cópia, ...)

    $ cryptsetup luksFormat /dev/md42
    $ cryptsetup luksOpen /dev/md42 luksmd42
    $ mkfs.ext4 /dev/mapper/luksmd42
    $ mount /dev/md99 /mnt/old
    $ mount /dev/md42 /mnt/new
    $ rsync -aAHSX /mnt/old/. /mnt/neW/.
    $ umount /mnt/old /mnt/new
    
  • Agora, seus dados são redundantes no antigo RAID 1 (não criptografado) e no novo RAID 1 não redundante (criptografado). Mas neste ponto você tem que quebrar a redundância para adicionar os discos 2x1TB ao novo RAID 1.

    $ mdadm --stop /dev/md99
    mdadm: stopped /dev/md99
    
  • Neste ponto, você também pode limpar os discos 2x1TB se quiser perder seu tempo. Não é necessário que o RAID-1 sincronize os dados aleatórios do disco de 2 TB com os discos de 1 TB.

    $ shred -n 1 /dev/loop0 &
    $ shred -n 1 /dev/loop1 &
    $ wait # for shred
    $ parted /dev/loop0
    $ parted /dev/loop1
    
  • Combine 2x1TB usando mdadm, seja linear ou 0 , dependendo da sua preferência.

    $ mdadm /dev/md43 --create --level=0 --raid-devices=2 /dev/loop0p1 /dev/loop1p1
    $ cat /proc/mdstat
    md43 : active raid0 loop1p1[1] loop0p1[0]
          199680 blocks super 1.2 512k chunks
    
    md42 : active raid1 loop2p1[0]
          102400 blocks super 1.2 [2/1] [U_]
    
  • Adicione-o ao RAID 1 e aumente o RAID 1 ao mesmo tempo.

     $ mdadm /dev/md42 --add /dev/md43
     mdadm: added /dev/md43
     $ mdadm /dev/md42 --grow --size=max
     mdadm: component size of /dev/md42 has been set to 199616K
     $ cat /proc/mdstat
     md43 : active raid0 loop1p1[1] loop0p1[0]
           199680 blocks super 1.2 512k chunks
    
     md42 : active raid1 md43[2] loop2p1[0]
           199616 blocks super 1.2 [2/2] [UU]
    
  • Cresça o cryptsetup e o sistema de arquivos também.

     $ cryptsetup resize luksmd42
     $ resize2fs /dev/mapper/luksmd42
     resize2fs 1.42.7 (21-Jan-2013)
     Resizing the filesystem on /dev/mapper/luksmd42 to 197568 (1k) blocks.
     The filesystem on /dev/mapper/luksmd42 is now 197568 blocks long.
    

e você está feito.

Editar:

Veja um exemplo de /etc/mdadm.conf para acompanhar essa configuração (use mdadm --detail --scan para obter um ponto de partida):

ARRAY /dev/md43 metadata=1.2 UUID=b9f590d7:9984dad4:cb75131b:63bca165
ARRAY /dev/md42 metadata=1.2 UUID=3a70188d:9ecacda7:ac715e16:9402fc55

Em particular:

  • no DEVICE lines (se você precisar deles, verifique se ele inclui md* devices)
  • a ordem de ARRAY linhas é importante - a matriz RAID0 deve ser criada primeiro, o que acontece se for listada primeiro no arquivo.
por 21.08.2013 / 15:02
0

Faça um backup primeiro.

Eu vou fingir pela minha resposta que sda é o disco de 2TB, e sdb e sdc são discos de 1TB. O sdc é o novo disco em branco de 1 TB. Atualmente, você tem um espelho de sda1 e sdb1. sda2 não é usado. (Altere o número conforme necessário).

Acho que você pode chegar onde quiser:

  1. Faça uma verificação / reparo de consistência de matriz completa por echo repair > /sys/block/md0/md/sync_action (ou qualquer dispositivo md que seu espelho seja). Verifique cat /proc/mdstat ; aguarde um pouco (muitas horas) para que isso seja concluído. Isso garante que você não tenha, por exemplo, ocultação de blocos inválidos.
  2. Limpe o novo disco vazio (deixe que isso seja executado ao mesmo tempo que a verificação de matriz).
  3. Solte sda1 do espelho. Confirme que você derrubou o disco correto. Confirme que você realmente fez um backup antes mesmo de ler este post. Vá em frente e limpe /dev/sda (preencha com aleatório). Re-particionar /dev/sda para ter apenas uma partição (bem, talvez duas, se você tiver /boot lá). Além disso, quando você particionar novamente, você pode querer deixar um pouco de espaço livre, você precisa ter certeza de que isso não é maior do que um RAID10 de sdb e sdc.
  4. Crie um novo espelho em sda1 e missing . Eu suponho que isso é md1 . Vá em frente e configure o LUKS (criptografia) nele e crie um sistema de arquivos em md1_crypt .
  5. Copie os arquivos do espelho antigo para o novo espelho.
  6. Desmonte o sistema de arquivos antigo e pare o md0 (a matriz antiga).
  7. Limpe / dev / sdb.
  8. Certifique-se de que o / dev / sdc esteja pronto para limpeza.
  9. Crie uma matriz RAID0 em / dev / sdb1 e / dev / sdb2. Vou chamar isso md2
  10. Adicione agora md2 (o RAID0) a md1 (o novo espelho).

A ideia básica é fazer a transição para:

                     sda
sdb                   |
    \                \|/
     ---> RAID10 -> RAID1 ---> LUKS/dmcrypt ---> filesystem
    /
sdc

Você provavelmente precisará de uma matriz adicional (espelho de 3 direções) para /boot . Você provavelmente desejará deixar espaço para swap, seja em seu próprio array colocando o LVM entre o dmcrypt e o sistema de arquivos.

    
por 19.08.2013 / 23:27