Implementação de RAID mdadm com particionamento GPT

Implementação de RAID mdadm com particionamento GPT

Minha ideia atual é criar um array de software, classe RAID-6, com unidades de 4 membros, usando mdadm.

Especificamente, as unidades seriam HDDs de 1 TB em SATA em um pequeno servidor Dell T20.

O sistema operacional éGNU/Linux Debian8.6 (atualizado posteriormente:JessieEsticarBuster)

Isso daria 2 TB de espaço em disco com 2 TB de paridade no meu caso.


Eu também gostaria de tê-lo com a tabela de partição GPT, para que isso funcione, não tenho certeza de como proceder especificamente, supondo que preferiria fazer isso apenas pelo terminal.

Como nunca criei um array RAID, você poderia me orientar sobre como devo proceder?


Notas:

  • Esta matriz servirá apenas para os dados exclusivos. Nenhuma inicialização ou sistema operacional nele.

  • Optei pelo RAID-6 devido à finalidade deste array. Duas falhas de unidade às quais o array deve ser capaz de sobreviver. Como estou limitado pelo hardware a 4 unidades, não há alternativa ao RAID-6 que eu conheça. (Por mais feia que possa parecer a desaceleração do RAID-6, isso não importa nesta matriz.)

Responder1

Nesta resposta, deixe claro que todos os dados serão destruídos em todos os membros do array (unidades), então faça backup primeiro!


Abra o terminal e torne-seroot(su); se você temsudoativado, você também pode fazer, por exemplo sudo -i; verman sudopara todas as opções):

sudo -i

Primeiro, devemos apagar as unidades, isto é, se houvesse algum dado e sistema de arquivos antes. Suponha que tenhamos 4 membros: sdi, sdj, sdk, sdl. Com a finalidade de obter feedback visual deste processo, opv(visualizador de tubos)foi usado aqui:

pv < /dev/zero > /dev/sdi
pv < /dev/zero > /dev/sdj
pv < /dev/zero > /dev/sdk
pv < /dev/zero > /dev/sdl

Alternativamente, para apenas verificar se não há nada para trás, você pode dar uma olhada com o GParted em todas as unidades, e se houver alguma partição com ou sem qualquer sistema de arquivos, limpá-la pode ser suficiente, embora eu mesmo prefira zerar tudo acima. as unidades envolvidas, lembre-se de desmontar todas as partições antes de fazer isso, isso poderia ser feito de forma semelhante a estas linhas simples:

umount /dev/sdi?; wipefs --all --force /dev/sdi?; wipefs --all --force /dev/sdi
umount /dev/sdj?; wipefs --all --force /dev/sdj?; wipefs --all --force /dev/sdj
umount /dev/sdk?; wipefs --all --force /dev/sdk?; wipefs --all --force /dev/sdk
umount /dev/sdl?; wipefs --all --force /dev/sdl?; wipefs --all --force /dev/sdl

Em seguida, inicializamos todas as unidades com tabela de partição GUID (GPT) e precisamos particionar todas as unidades, mas não faça isso com o GParted, pois isso criaria um sistema de arquivos no processo, o que não queremos, use gdiskem vez disso:

gdisk /dev/sdi
gdisk /dev/sdj
gdisk /dev/sdk
gdisk /dev/sdl

Em todos os casos, use o seguinte:

o Enterpara nova tabela de partição GUID vazia (GPT)
y Enterpara confirmar sua decisão
n Enterpara nova partição
Enterpara o padrão da primeira partição
Enterpara o padrão do primeiro setor
Enterpara o padrão do último setor
fd00 Enterpara Linux tipo RAID
w Enterpara gravar alterações
y Enterpara confirmar sua decisão


Você pode examinar as unidades agora:

mdadm --examine /dev/sdi /dev/sdj /dev/sdk /dev/sdl

Deveria dizer:

(type ee)

Se isso acontecer, agora examinamos as partições:

mdadm --examine /dev/sdi1 /dev/sdj1 /dev/sdk1 /dev/sdl1

Deveria dizer:

No md superblock detected

Se isso acontecer, podemos criar o array RAID6:

mdadm --create /dev/md0 --level=6 --raid-devices=4 /dev/sdi1 /dev/sdj1 /dev/sdk1 /dev/sdl1

Devemos esperar até que o array esteja totalmente criado, este processo podemos facilmente watch:

watch cat /proc/mdstat

Após a criação do array, devemos observar seus detalhes:

mdadm --detail /dev/md0

Deveria dizer:

          State : clean
 Active Devices : 4
Working Devices : 4
 Failed Devices : 0
  Spare Devices : 0

Agora criamos um sistema de arquivos no array, se você usar ext4, o abaixoescondidoÉ melhor evitar o comando, pois ext4lazyinitlevaria uma quantidade considerável de tempo no caso de uma matriz grande, daí o nome, "preguiçoso", portanto recomendo que você evite este:

mkfs.ext4 /dev/md0

Em vez disso, você deve forçar uma inicialização instantânea completa (com 0% reservado, rootpois é uma matriz de dados):

mkfs.ext4 -m 0 -E lazy_itable_init=0,lazy_journal_init=0 /dev/md0

Ao especificar essas opções, os inodes e o diário serão inicializados imediatamente durante a criação, o que é útil para arrays maiores.

Se você optou por usar um atalho e criou o ext4sistema de arquivos com o "comando melhor evitado", observe que ext4lazyinitlevará um tempo considerável para inicializar todos os inodes, você pode assisti-lo até terminar, por exemplo, com iotopou nmon.

De qualquer maneira que você escolher fazer a inicialização do sistema de arquivos, você deverá montá-lo após terminar sua inicialização.


Agora criamos algum diretório para este array RAID6:

mkdir -p /mnt/raid6

E simplesmente monte-o:

mount /dev/md0 /mnt/raid6

Como basicamente terminamos, podemos usar o GParted novamente para verificar rapidamente se ele mostra linux-raido sistema de arquivos, junto com o raidsinalizador em todas as unidades.

Nesse caso, criamos corretamente o array RAID6 com partições GPT e agora podemos copiar arquivos nele.

Veja qual UUID o mdsistema de arquivos possui:

blkid /dev/md0

Copie o UUID para a área de transferência.

Agora precisamos editar fstab, com seu editor de texto favorito, useinano, no entantosudoeditpode ser melhor usado:

nano /etc/fstab

E adicione uma entrada a ele:

UUID=<the UUID you have in the clipboard>    /mnt/raid6    ext4    defaults    0 0

Eu mesmo não recomendo o uso de defaultsum conjunto de sinalizadores, apenas queria que a linha não fosse excessivamente complexa.

Aqui estão os sinalizadores de montagem que eu uso em um RAID de dados de backup do UPS (em vez de defaults): nofail,nosuid,nodev,noexec,nouser,noatime,auto,async,rw,data=journal,errors=remount-ro


Você pode verificar se está correto depois de salvar as alterações:

mount -av | grep raid6

Deveria dizer:

already mounted

Se isso acontecer, salvamos a configuração do array; caso você mdainda não tenha nenhum dispositivo criado, basta fazer:

mdadm --detail --scan >> /etc/mdadm/mdadm.conf

Caso já existam arrays, basta executar o comando anterior sem redirecionar para o arquivo de configuração:

mdadm --detail --scan

e adicione o novo array ao arquivo de configuração manualmente.

No final, não se esqueça de atualizar seu initramfs, porque caso contrário seu novo array só será montado automaticamente somente leitura, provavelmente como /dev/md127ou similar:

update-initramfs -u -k all

Verifique se você fez tudo conforme o planejado e, em caso afirmativo, reinicie:

reboot

Responder2

Se você criar matrizes RAID em 4 dispositivos de bloco brutos em vez de 2 x 4 partições, isso significa que todas as operações de recuperação RAID poderão necessariamente operar em todos os dispositivos e vice-versa.

Então, por exemplo, se você espera que os discos eventualmente comecem a desenvolver erros de E/S na última metade deles, com os arrays sobre partições, isso significaria que apenas um dos arrays notaria, enquanto o outro continuaria intocado, pelo menos até o dano se espalha pela metade. Isso pode fornecer alguma flexibilidade temporária ou ausência de lentidão de E/S.

Por outro lado, assim que você começar a intervir, será necessário retirar todo o disco físico para substituição, portanto, necessariamente será necessário degradar os dois arrays em algum momento. Além disso, com SSDs, aparentemente tornou-se mais comum que todo o disco falhe, portanto, ambos os arrays podem ser afetados por tais eventos de qualquer maneira.

Não há nada a ser dito sobre os detalhes do processo que não possa ser encontrado no particionamento típico e na documentação do mdadm.

informação relacionada