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.
Existem várias maneiras de configurar
mdX
dispositivos. O método seria usargdisk
(ousgdisk
se você preferir a versão apenas da linha de comando) para particionar isso como GPT. Se você deseja inicializar a partir da matriz, crie uma "Partição de inicialização do BIOS", digite o códigoef02
. Isso é necessário apenas se você deseja inicializar essa matriz, caso contrário não há necessidade de 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 especialista emgdisk
, usandox
e, em seguida,u
e especifique o dispositivo de destino). Este é um processo destrutivo.Deve ser possível - se o sistema de arquivos permitir - redimensionar uma partição existente para algo menor e usar o mesmo método para copiar os dados da GPT. No entanto, isso deixa você meio confuso. Porque agora você tem dois discos, mas ainda não possui
mdX
dispositivo. Um deles deve ser preparado comomdX
em partição (como eu impliquei acima) ou em disco) e, em seguida, os dados devem ser movidos do disco existente para esse.Então:
/dev/sda
) contém dados, dados são menores que 3001 GB, partições não são/dev/sdb
é adicionado ao sistema/dev/sdb
comgdisk
mdadm -C /dev/md2 -l 1 -n 1 /dev/sdb2
)/dev/sdb
para/dev/sda
/dev/sda
das matrizes existentes/proc/mdstat
mostrar que a sincronização está concluídaSe você seguiu todas as etapas, agora poderá inicializar o novo sistema a partir das matrizes mdX. No entanto, mantenha um CD de resgate ou uma opção de inicialização PXE à mão, apenas por precaução.
O GRUB2 não poderá reconhecer a configuração manualmente. Então você precisa de alguma "mágica". Aqui está uma frase:
Ou vamos ser mais detalhados:
Isso cria (ou substitui) o padrão
/boot/grub/devicemap
por um que diz ao GRUB2 onde encontrar cada disco respectivo. O resultado seria algo como esta lista:Se você usa o GRUB legado, também precisa criar a "Partição de inicialização do BIOS" com metadados versão 0.9, usando
mdadm -e 0 ...
e o processo será diferente. Eu não fiz isso, no entanto.fonte
mdadm
se recusaria a construir a matriz em primeiro lugar, se for incompatível. No RAID 5, você precisaria de mais discos e, no RAID 0, não se importaria com isso, e é por isso que eu assumi o RAID 1. Então, sim, faz sentido deixar espaço.mdadm
tolera uma diferença arbitrária de 1% do tamanho nos membros da matriz.