Me deparei com essa resposta por engano, mas caso alguém esteja curioso, aqui está uma resposta apoiada por experimentos.
A versão curta
Pergunta bônus: posso criar uma md(4)
matriz RAID a partir de dispositivos de bloco de tamanho desigual? Sim, mas a matriz RAID terá o tamanho do menor dispositivo de bloco (mais algumas despesas gerais para sua própria limpeza). Se o tamanho do dispositivo não estiver a 1% um do outro, você receberá um aviso.
Pergunta 1: posso adicionar a uma md(4)
matriz 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
manual!), Mas pode não valer a pena. 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 custarão seus dados (experiência dolorosa ao falar) .
Não vale a pena o risco e o esforço. Se você tiver um novo disco em branco, veja como redimensioná-lo e mantenha sempre uma e duas cópias de todos os seus dados intactos o tempo todo (supondo que você tenha RAID1 de 2 discos):
- Crie uma nova
md(4)
matriz nele (com um disco ausente).
- Recrie a estrutura do conteúdo do array (Crypto, LVM, tabelas de partições, qualquer combinação dos mesmos, o que flutua em seu barco).
- Copie os dados do disco existente para o novo.
- Reinicie, usando o novo disco.
- Limpe a tabela de partição 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.
- Adicione o disco antigo à nova matriz.
- Aguarde a sincronização dos membros da matriz. Tome um 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).
Nota: sim, esta é a mesma técnica 0xC0000022L descrita em sua resposta.
Pergunta 3. E se a unidade tiver 1G de comprimento? :) Não se preocupe. Provavelmente, sua unidade de substituição será maior. De fato, com uma estratégia como a acima, vale a pena obter unidades maiores e mais baratas sempre que houver uma falha (ou 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 100 milhões) e /tmp/sdz
(99 milhões).
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 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 com dispositivos de tamanho idêntico
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
É exatamente o que esperamos: uma olhada no manual 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 com dispositivos de tamanho desigual
Desta vez, usaremos 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 feita. Vamos verificar o tamanho:
sudo grep md100 /proc/partitions
9 100 101248 md100
O que chegamos aqui são 101.248 blocos. 101248 + 128 = 101376 = 99 × 1024. O espaço utilizável é o do menor dispositivo (mais os metadados de 128K RAID). Vamos resumir tudo novamente 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 uma matriz RAID1 com apenas um dos discos de 100M. A matriz será degradada, mas realmente não nos importamos. Nós apenas queremos uma matriz iniciada . As missing
palavras-chave são um espaço reservado que diz 'Ainda não tenho um dispositivo para você, inicie a matriz agora e adicionarei mais tarde'.
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
Com certeza, é 128K a menos de 102400 blocos. Adicionando o disco menor:
sudo mdadm --add /dev/md100 /dev/loop2
mdadm: /dev/loop2 not large enough to join array
Estrondo! Não vai nos deixar, e o erro é muito claro.