Como criar uma matriz RAID 5 3x3TB sem perder dados de 2 das unidades?

1

Atualmente tenho 2 HDDs de 3 TB, um que está sempre quase cheio e outro com ~ 200 GB gratuitos. Eu gostaria de comprar uma unidade extra de 3 TB e configurar uma matriz RAID 5, mas estou preocupado com a perda dos dados existentes.

Descobri que mdadm será usado para criar a matriz, com um comando semelhante a mdadm --create --verbose /dev/md0 --level=5 --raid-devices=2 /dev/sdb2 /dev/sdc2 --spare-devices=1 /dev/sdd2 , em que /dev/sdb2 e /dev/sdc2 são minhas unidades existentes (que possuem dados) e /dev/sdd2 é uma novo drive de 3TB sem dados nele. Isso fará com que eu perca os dados em /dev/sdb2 e /dev/sdc2 ?

Minha outra ideia era criar um array RAID 5 de 2x3TB sem um dispositivo reserva, onde uma das unidades da matriz está vazia e a outra com dados. Em seguida, eu poderia copiar meus arquivos da unidade existente para a nova matriz (6 TB), limpar a unidade agora redundante e adicioná-la como a unidade sobressalente da matriz. Embora duvide que isso funcione?

Se nenhuma das opções acima funcionar, existe outra maneira de criar um array RAID 5 com 2 drives que já possuem dados e 1 que está vazio? E se eu adicionasse 2 novas unidades vazias de uma só vez, isso abriria novas opções?

Estou usando o Ubuntu Server 16.04.2 com mdadm versão 3.3.

    
por Joseph Duffy 03.03.2017 / 20:02

1 resposta

2

Você tem dois discos de 3 TB armazenando dados de 6 TB. Você deseja instalar um novo disco de 3 TB.

Isso permitirá que você converta os três discos de 3 TB em um array RAID5, armazenando dados de 6 TB. No entanto, o processo é bastante complicado e as oportunidades de perder dados em algum lugar ao longo da rota são bastante grandes.

Etapas para atingir o requisito

Vamos declarar os discos como sda (contém dados), sdb (contém dados), sdc (novo).

  1. Se for possível, faça um backup de todos os seus dados, mesmo que você precise pedir emprestado um disco de um amigo por alguns dias
  2. Crie uma matriz RAID1 no novo disco sdc . Deve ter dois membros dos quais um está faltando
  3. Crie um sistema de arquivos nesta matriz RAID1
  4. Copie os dados de sdb para a nova matriz RAID1
  5. Verifique se copiou corretamente os dados
  6. Adicione sdb à matriz RAID1
  7. Aguarde até que a sincronização seja concluída
  8. Reinicializar
  9. Cresça a matriz RAID1 para RAID5. Deve ter três membros dos quais um está faltando. Para fazer isso, você precisará de 128K de espaço temporário em um disco adicional. Você pode querer usar um thumbstick USB para isso. Não use um disco RAM.
  10. Copie os dados de sda para o novo array RAID5
  11. Verifique se copiou corretamente os dados
  12. Adicione sda à matriz RAID5
  13. Reinicializar

Exemplo trabalhado

Aqui está um exemplo trabalhado usando três arquivos como imagens de disco.

# Prepare the demonstration
#
dd if=/dev/zero bs=1M count=100 of=sda.img
dd if=/dev/zero bs=1M count=100 of=sdb.img
( echo n; echo p; echo 1; echo; echo; echo w ) | fdisk sda.img  # One primary partition
( echo n; echo p; echo 1; echo; echo; echo w ) | fdisk sdb.img  # One primary partition
losetup --show --find --partscan sda.img
losetup --show --find --partscan sdb.img
mkfs -t ext4 -L sda /dev/loop0p1
mkfs -t ext4 -L sdb /dev/loop1p1
mkdir -p /mnt/sda1 /mnt/sdb1
mount /dev/loop0p1 /mnt/sda1
mount /dev/loop1p1 /mnt/sdb1
cp -a /usr/local/man/. /mnt/sda1/u.l.man/
mkdir /mnt/sdb1/u.l.etc
cp -a /usr/local/bin/. /mnt/sdb1/u.l.bin/
df -h | grep mnt
umount /mnt/sda1
umount /mnt/sdb1


# Create the third disk
#
dd if=/dev/zero bs=1M count=100 of=sdc.img
( echo n; echo p; echo 1; echo; echo; echo w ) | fdisk sdc.img  # One primary partition
losetup --show --find --partscan sdc.img


# Create the RAID1 array and its filesystem
#
mdadm --create /dev/md1 --level=1 --raid-devices=2 --metadata=default /dev/loop2p1 missing
mkfs -t ext4 -L md1 /dev/md1
mkdir -p /mnt/md1


# Copy the data from sdb to md1
#
mount /dev/loop1p1 /mnt/sdb1
mount /dev/md1 /mnt/md1
cp -a /mnt/sdb1/. /mnt/md1/
umount /mnt/sdb1
umount /mnt/md1


# Complete the RAID1 array
#
mdadm --manage /dev/md1 --add /dev/loop1p1


# Grow the RAID1 array to RAID5
#
mdadm --grow /dev/md1 --level=5 --raid-devices=3 --backup-file=/root/workarea.dat --force
e2fsck -f /dev/md1
resize2fs /dev/md1


# Copy the data from sda to md1
#
mount /dev/loop0p1 /mnt/sda1
mount /dev/md1 /mnt/md1
cp -a /mnt/sda1/. /mnt/md1/
umount /mnt/sda1
umount /mnt/md1


# Add the remaning disk to the RAID5 array
#
mdadm --manage /dev/md1 --add /dev/loop0p1


# All done
#
mdadm --stop /dev/md1
losetup -d /dev/loop0
losetup -d /dev/loop1
losetup -d /dev/loop2
rm sda.img sdb.img sdc.img

Você realmente deve garantir que entende o exemplo trabalhado ANTES de tocar nos dados ao vivo em seus discos. Escusado será dizer que é da sua responsabilidade e eu realmente recomendo um backup antes de alterar o seu sistema ao vivo.

    
por 03.03.2017 / 21:16