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):
- Crie uma nova matriz
md(4)
nela (com um disco faltando). - Recrie a estrutura do conteúdo da matriz (Crypto, LVM, tabelas de partições, qualquer combinação delas, o que flutuar em seu barco).
- Copie os dados do disco existente para o novo.
- Reinicialize usando o novo disco.
- 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. - Adicione o disco antigo ao novo array.
- 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.