RAID (mdadm) - O que acontece se as unidades forem incompatíveis em tamanho?

13

Pergunta 1 - Antes de responder com "apenas leva o disco menor", ouça-me rapidamente. Meus 3TB WD Reds são 3001 GB. Vamos dizer que eu configurei um espelho via mdadm para sdb1 e sdc1 que abrangem 100% da unidade. Mas, de repente, uma das unidades falha. A substituição é de 3 TB, pesando 3000 GB. O que acontece quando eu coloco uma unidade menor que a existente atualmente na matriz? Eu sei que com uma nova matriz usando 3000 vs 3001, seria construir a matriz para 3000. Mas como eu disse, que tal uma matriz atual @ 3001 e eu adicionar uma unidade menor? Reestrutura-se durante a reconstrução para ter 3000 GB de tamanho?

Pergunta 2 - No caso em que eu não posso adicionar um 3000 GB para o array com um existente 3001 GB e simplesmente reduzir para 3000 ... posso redimensionar um pouco o 3001?

Pergunta 3 - Ou melhor, uma ideia. E se eu reduzir o tamanho do meu disco de 3 TB para 2999 GB? Dessa forma, se a unidade é curta por 1 MB, 1 byte, 10 KB, não importa, sempre vai pegar a unidade "menor" @ 2999 GB.

    
por JaSauders 01.02.2013 / 03:43

2 respostas

21

Eu encontrei essa resposta por engano, mas caso alguém esteja curioso, aqui está uma resposta suportada por experimentos.

A versão resumida

Pergunta de bônus: posso criar uma matriz md(4) RAID fora de dispositivos de bloco de tamanho desigual? Sim, mas a matriz RAID terá o tamanho de menor dispositivo de bloco (além de algumas despesas gerais para o seu próprio serviço de limpeza). Se os tamanhos dos dispositivos não estiverem dentro de 1% um do outro, você receberá um aviso.

Pergunta 1: posso adicionar a um array md(4) RAID existente um dispositivo menor que o menor membro atual? Não, desculpe. mdadm se recusará a fazer isso para proteger seus dados.

Pergunta 2: você pode redimensionar uma matriz md existente? Sim (leia o mdadm manpge!), mas pode não valer a pena o esforço. Você terá que fazer backup de tudo, redimensionar o conteúdo do dispositivo RAID e redimensionar o próprio dispositivo - tudo isso é bastante propenso a erros, erros de cálculo e outras coisas que lhe custarão seus dados (experiência dolorosa) .

Não vale a pena o risco e esforço. Se você tiver um novo disco em branco, veja como redimensioná-lo e também manter entre uma e duas cópias de todos os seus dados intactos o tempo todo (supondo que você tenha 2 discos RAID1):

  1. Crie uma nova matriz md(4) nela (com um disco faltando).
  2. Recrie a estrutura do conteúdo da matriz (Crypto, LVM, tabelas de partições, qualquer combinação delas, o que flutuar em seu barco).
  3. Copie os dados do disco existente para o novo.
  4. Reinicialize usando o novo disco.
  5. Limpe a tabela de partições do disco antigo (ou zere o md(4) superbloco). Se necessário, crie as partições necessárias para corresponder ao esquema no novo disco.
  6. Adicione o disco antigo ao novo array.
  7. Aguarde a sincronização dos membros da matriz. Tome um pouco de café. Voe para a América Latina e escolha seus próprios grãos de café. :) (Se você mora na América Latina, voe para a África em seu lugar).

Nota: sim, esta é a mesma técnica 0xC0000022L descrita em sua resposta.

Pergunta 3. E se a unidade tiver 1G a menos? :) Não se preocupe com isso. As chances são de sua unidade de substituição será maior. De fato, com uma estratégia como acima, paga para obter unidades maiores e mais baratas sempre que uma falha (ou para uma atualização mais barata). Você pode obter uma atualização progressiva.

Prova experimental

Configuração Experimental

Primeiro, vamos fingir alguns dispositivos de bloco. Usaremos /tmp/sdx e /tmp/sdy (cada 100M) e /tmp/sdz (99M).

cd /tmp
dd if=/dev/zero of=sdx bs=1M count=100
sudo losetup -f sdx
dd if=/dev/zero of=sdy bs=1M count=100
sudo losetup -f sdy
dd if=/dev/zero of=sdz bs=1M count=99  # Here's a smaller one!
sudo losetup -f sdz

Isso configura três arquivos como três dispositivos de bloco de loopback: /dev/loop0 , /dev/loop1 e /dev/loop2 , mapeamento para sdx , sdy e sdz , respectivamente. Vamos verificar os tamanhos:

sudo grep loop[012] /proc/partitions
   7        0     102400 loop0
   7        1     102400 loop1
   7        2     101376 loop2

Como esperado, temos dois dispositivos de loop de exatamente 100M (102400 KiB = 100 MiB) e um de 99M (exatamente 99 × 1024 blocos de 1K).

Criando uma matriz RAID a partir de dispositivos de tamanhos idênticos

Aqui vai:

sudo mdadm  --create -e 1.2 -n 2 -l 1 /dev/md100 /dev/loop0 /dev/loop1
mdadm: array /dev/md100 started.

Verifique o tamanho:

sudo grep md100 /proc/partitions
   9      100     102272 md100

Isto é precicely o que esperamos: uma olhada no manual do mdadm nos lembra que os metadados da versão 1.2 ocupam 128K: 128 + 102272 = 102400. Agora vamos destruí-lo em preparação para o segundo experimento.

sudo mdadm --stop /dev/md100
sudo mdadm --misc --zero-superblock /dev/loop0
sudo mdadm --misc --zero-superblock /dev/loop1

Criando uma matriz RAID a partir de dispositivos de tamanhos desiguais

Desta vez, vamos usar o pequeno dispositivo de bloco.

sudo mdadm  --create -e 1.2 -n 2 -l 1 /dev/md100 /dev/loop0 /dev/loop2
mdadm: largest drive (/dev/loop0) exceeds size (101248K) by more than 1%
Continue creating array? y
mdadm: array /dev/md100 started.

Bem, fomos avisados, mas a matriz foi criada. Vamos verificar o tamanho:

sudo grep md100 /proc/partitions
   9      100     101248 md100

O que temos aqui são 101.248 blocos. 101248 + 128 = 101376 = 99 × 1024. O espaço utilizável é o do menor dispositivo (mais os metadados RAID de 128K). Vamos trazer tudo de novo para o nosso último experimento:

sudo mdadm --stop /dev/md100
sudo mdadm --misc --zero-superblock /dev/loop0
sudo mdadm --misc --zero-superblock /dev/loop2

E finalmente: Adicionando um dispositivo menor a uma matriz em execução

Primeiro, vamos criar um array RAID1 com apenas um dos discos de 100M. O array será degradado, mas não nos importamos. Nós só queremos um array iniciado . As palavras-chave missing são um marcador que diz "Ainda não tenho um dispositivo para você, comece a matriz agora e adicionarei uma depois".

sudo mdadm  --create -e 1.2 -n 2 -l 1 /dev/md100 /dev/loop0 missing

Mais uma vez, vamos verificar o tamanho:

sudo grep md100 /proc/partitions
   9      100     102272 md100

De fato, é 128K com menos de 102400 blocos. Adicionando o disco menor:

sudo mdadm  --add /dev/md100 /dev/loop2
mdadm: /dev/loop2 not large enough to join array

Boom! Não nos deixará, e o erro é muito claro.

    
por Alexios 26.06.2014 / 18:03
1

Existem várias maneiras de configurar mdX devices. O método seria usar gdisk (ou sgdisk se você preferir a versão somente da linha de comando) para particioná-lo como GPT. Se você quiser inicializar a partir da matriz, crie uma "Partição de Inicialização do BIOS", digite o código ef02 . Isso é necessário apenas se você quiser inicializar esse array, caso contrário, não precisa se preocupar. Em seguida, crie uma partição do mesmo tamanho ou menor que o menor disco a ser adicionado à matriz. Por último, mas não menos importante, copie os dados da GPT para o outro disco (menu de especialistas em gdisk , usando x e, em seguida, u e especifique o dispositivo de destino). Este é um processo destrutivo.

Deverá ser possível - se o sistema de arquivos permitir - redimensionar uma partição existente para algo menor e, em seguida, usar o mesmo método para copiar os dados da GPT. No entanto, isso deixa você um pouco confuso. Porque agora você tem dois discos, mas ainda não há mdX device. Um deles deve ser preparado como mdX , tanto em termos de partição (o que eu impliquei acima) quanto de disco) e, em seguida, os dados devem ser movidos do disco existente para esse.

Então:

    O
  1. disco grande ( /dev/sda ) contém dados, os dados são menores que 3001 GB, as partições não são
  2. disco menor /dev/sdb é adicionado ao sistema
  3. você particiona /dev/sdb com gdisk
  4. você cria uma matriz de cada partição respectiva ( mdadm -C /dev/md2 -l 1 -n 1 /dev/sdb2 )
  5. você cria sistemas de arquivos nos novos arrays
  6. você copia todos os dados, certificando-se de que seu sistema estará preparado para executar um disco GPT e fazer com que o GRUB2 entenda as implicações (veja abaixo)
  7. você copia os dados de particionamento da GPT de /dev/sdb para /dev/sda
  8. você adiciona as partições "brutas" de /dev/sda nas matrizes existentes
  9. você espera que /proc/mdstat mostre que a sincronização está concluída

Se você seguiu todas as etapas, agora você deve poder inicializar o novo sistema nos arrays mdX. No entanto, mantenha um CD de recuperação ou uma opção de inicialização PXE à mão, apenas no caso.

O GRUB2 não conseguirá reconhecer a configuração. Então você precisa de alguma "mágica". Aqui está um verso:

for i in /dev/disk/by-id/md-uuid-*; do DEV=$(readlink $i); echo "(${DEV##*/}) $i"; done|sort|tee /boot/grub/devicemap

Ou vamos ser mais detalhado:

for i in /dev/disk/by-id/md-uuid-*
do
  DEV=$(readlink $i)
  echo "(${DEV##*/}) $i"
done|sort|sudo tee /boot/grub/devicemap

Isso cria (ou sobrescreve) o padrão /boot/grub/devicemap com um que informa ao GRUB2 onde encontrar cada disco respectivo. O resultado seria algo parecido com esta lista:

(md0) /dev/disk/by-id/md-uuid-...
(md2) /dev/disk/by-id/md-uuid-...
(md3) /dev/disk/by-id/md-uuid-...
(md4) /dev/disk/by-id/md-uuid-...

Se você usar o GRUB legado, também precisará criar a "Partição de inicialização do BIOS" com a versão de metadados 0.9, usando mdadm -e 0 ... e o processo será diferente. Eu ainda não fiz isso.

    
por 0xC0000022L 01.02.2013 / 04:05

Tags