Reutilizando números de slots em matrizes RAID de software Linux

1

Quando uma unidade de disco rígido em uma de minhas máquinas Linux falhou, aproveitei a oportunidade para migrar do RAID5 para um array RAID6 de 6 discos.

No momento da migração eu não tinha todas as 6 unidades - mais especificamente as unidades quarta e quinta (slots 3 e 4) já estavam em uso na matriz de origem, então criei a matriz RAID6 com um par de missing devices. Agora preciso adicionar essas unidades nesses slots vazios. Usar mdadm --add faz resultar em uma configuração RAID6 adequada, com uma falha - as novas unidades são colocadas em novos slots, o que resulta neste /proc/mdstat snippet:

...
md0 : active raid6 sde1[7] sdd1[6] sda1[0] sdf1[5] sdc1[2] sdb1[1]
      25185536 blocks super 1.0 level 6, 64k chunk, algorithm 2 [6/6] [UUUUUU]
...

mdadm -E verifica se os números dos slots reais nos superblocos de dispositivos estão corretos, mas os números mostrados em /proc/mdstat ainda são estranhos .

Eu gostaria de consertar essa falha, tanto para satisfazer o meu perfeccionista interno quanto para evitar quaisquer fontes potenciais de confusão futura em uma crise. Existe uma maneira de especificar qual slot um novo dispositivo deve ocupar em uma matriz RAID?

ATUALIZAÇÃO:

Verifiquei que o número do slot persiste no superbloco do dispositivo de componente. Para os superblocos da versão 1.0 que estou usando, seria o campo dev_number , conforme definido em include/linux/raid/md_p.h da origem do kernel do Linux. Agora estou considerando a modificação direta do dito campo para mudar o número do slot - eu não suponho que haja alguma maneira padrão de manipular o superbloco RAID?

UPDATE 2:

Para modificar as atribuições de espaço no superbloco do dispositivo, eu precisaria fazer o seguinte:

  1. Modificar dev_number
  2. Modifique a matriz dev_roles para marcar o slot antigo como vazio e coloque a função adequada no novo slot
  3. Reconfigure a soma de verificação do superbloco

(1) e (2) são relativamente simples e podem ser automatizados através de um script ou programa pequeno. (3) começou a empurrar as coisas um pouco - eu teria que copiar o código de soma de verificação superblock do driver md , modificá-lo para trabalhar com um programa de espaço do usuário e esperar pelo melhor.

Em vez de gastar meu tempo depurando um aplicativo C e arriscar matar meus arrays com um erro, decidi tentar enganar md / mdadm ao fazer meu trabalho para mim, conforme mencionado em minha resposta. Isso parece ter funcionado, embora ainda possa ter um grau de risco ...

    
por thkala 11.11.2012 / 19:27

0 respostas