Ubuntu RAID (mdadm)

RAID (Redundant Array of Independent Disks, "conjunto redundante de discos independentes") combina vários discos para ganhar segurança (o servidor continua funcionando se um disco quebrar), velocidade ou as duas coisas. No Ubuntu, o RAID por software é feito com o mdadm.

Você vai aprender
  • O que cada nível de RAID (0, 1, 5, 10) oferece e quanto espaço você perde.
  • Criar um espelho (RAID 1) com mdadm num laboratório seguro.
  • Ler o /proc/mdstat e saber se o RAID está saudável.
  • Salvar a configuração para o RAID voltar após reiniciar.
  • Simular a quebra de um disco e trocá-lo sem desligar nada.
RAID não é backup

RAID protege contra disco quebrado. Ele não protege contra arquivo apagado, vírus, erro de comando ou incêndio: um rm errado apaga nos dois discos ao mesmo tempo. Mantenha backups (veja Backup).


Conceito: os níveis de RAID

Cada nível é uma forma diferente de distribuir os dados entre os discos. Na tabela, considere discos de 1 TB:

NívelComo funcionaDiscos mín.Espaço útil (4 × 1 TB)Aguenta perderBom para
RAID 0Divide cada arquivo em pedaços, um em cada disco (striping)24 TBNenhum discoVelocidade em dados descartáveis
RAID 1Cópia idêntica em todos os discos (espelho)21 TBTodos menos umSistema e dados importantes em 2 discos
RAID 5Dados + informação de paridade espalhada33 TB1 discoArquivos grandes, muito espaço
RAID 6Como o 5, com paridade dupla42 TB2 discosMuitos discos grandes
RAID 10Espelhos (RAID 1) combinados em striping (RAID 0)42 TB1 por espelhoBancos de dados: rápido e seguro

Paridade é uma conta feita sobre os dados que permite reconstruir o pedaço de um disco que sumiu, a partir dos outros. É o mesmo princípio de saber que, se a + b = 10 e a = 3, então b = 7.

Na dúvida, RAID 1

Para quem está começando, o espelho com dois discos iguais é o mais simples de entender, de montar e de consertar. É ele que você vai montar nesta aula.


Laboratório seguro

Crie três "discos" com arquivos e losetup (explicado em LVM). Dois formam o espelho; o terceiro será o "disco novo" da troca.

$ sudo apt install mdadm
$ truncate -s 1G r1.img r2.img r3.img
$ for f in r1.img r2.img r3.img; do sudo losetup -f --show $f; done
/dev/loop20
/dev/loop21
/dev/loop22

Nos exemplos, /dev/sdb, /dev/sdc e /dev/sdd correspondem a /dev/loop20, loop21 e loop22. Use discos do mesmo tamanho: o RAID usa o tamanho do menor.


Criar um espelho (RAID 1)

sudo mdadm
"multiple device admin": administra os dispositivos RAID (/dev/md…).
--create /dev/md0
Cria um RAID novo chamado /dev/md0.
--level=1
O nível: 1 = espelho.
--raid-devices=2
Quantos discos participam.
/dev/sdb /dev/sdc
Os discos (ou partições).
$ sudo mdadm --create /dev/md0 --level=1 --raid-devices=2 /dev/sdb /dev/sdc
mdadm: Note: this array has metadata at the start and
    may not be suitable as a boot device.  If you plan to
    store '/boot' on this device please ensure that
    your boot-loader understands md/v1.x metadata, or use
    --metadata=0.90
Continue creating array? y                                  « digite y e Enter
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md0 started.

O aviso fala de usar o RAID para dar boot; para dados, pode ignorar. O RAID já está funcionando, mas os discos ainda estão sendo sincronizados em segundo plano.

Ler o estado: /proc/mdstat

O /proc/mdstat é um "arquivo" que o kernel mantém com o estado de todos os RAIDs. É o primeiro lugar a olhar.

$ cat /proc/mdstat
Personalities : [raid1] [linear] [raid0] [raid6] [raid5] [raid4] [raid10]
md0 : active raid1 sdc[1] sdb[0]                                     « nome, estado, nível e discos
      52395008 blocks super 1.2 [2/2] [UU]                           « 2 de 2 discos, os dois "Up"
      [=====>...............]  resync = 27.3% (14304128/52395008) finish=3.1min speed=203612K/sec

unused devices: <none>
TrechoSignificado
active raid1O RAID está ligado e é um espelho
sdb[0] sdc[1]Os discos e sua posição no RAID
[2/2]Discos esperados / discos funcionando
[UU]Um caractere por disco: U = funcionando (up), _ = faltando
resync / recoverySincronização inicial / reconstrução após troca de disco
(F) depois do discoDisco marcado como com defeito (failed)

Para acompanhar a sincronização ao vivo: watch cat /proc/mdstat (Ctrl+C para sair). Mais detalhes com sudo mdadm --detail /dev/md0:

$ sudo mdadm --detail /dev/md0
/dev/md0:
           Version : 1.2
        Raid Level : raid1
        Array Size : 52395008 (49.97 GiB 53.65 GB)
      Raid Devices : 2
     Total Devices : 2
             State : clean                                « clean = saudável e sincronizado
    Active Devices : 2
   Working Devices : 2
    Failed Devices : 0
              Name : servidor:0  (local to host servidor)
              UUID : 6a1c2f4e:9b3d7e10:5c8a2b6f:0d4e1a73

    Number   Major   Minor   RaidDevice State
       0       8       16        0      active sync   /dev/sdb
       1       8       32        1      active sync   /dev/sdc

Usar o RAID

O /dev/md0 se comporta como um disco único. Formate e monte normalmente:

$ sudo mkfs.ext4 -L espelho /dev/md0
$ sudo mkdir -p /srv/espelho
$ sudo mount /dev/md0 /srv/espelho
$ df -h /srv/espelho
Sist. Arq.  Tam. Usado Disp. Uso% Montado em
/dev/md0     49G   24K   47G   1% /srv/espelho          « 2 discos de 50 GB = 50 GB úteis
Combine com LVM

É comum usar o /dev/md0 como PV do LVM: o RAID cuida da segurança e o LVM da flexibilidade de tamanho.


Salvar a configuração (essencial)

Sem este passo, depois de reiniciar o RAID pode voltar com outro nome (/dev/md127) ou nem montar. Grave a descrição do RAID no arquivo de configuração e atualize o initramfs, o mini-sistema que o kernel usa no boot.

sudo mdadm --detail --scan
Gera uma linha ARRAY … para cada RAID ativo.
|
Passa essa linha para o próximo comando.
sudo tee -a /etc/mdadm/mdadm.conf
Acrescenta (-a) a linha no arquivo, com permissão de root.
$ sudo mdadm --detail --scan | sudo tee -a /etc/mdadm/mdadm.conf
ARRAY /dev/md0 metadata=1.2 UUID=6a1c2f4e:9b3d7e10:5c8a2b6f:0d4e1a73
$ sudo update-initramfs -u
update-initramfs: Generating /boot/initrd.img-7.0.0-38-generic

Depois, adicione o RAID ao /etc/fstab pelo UUID do sistema de arquivos (sudo blkid /dev/md0), como em mount e fstab, com a opção nofail.


Simular um disco com defeito e trocá-lo

Treine isso no laboratório. No dia em que um disco quebrar de verdade, você vai saber o que fazer com calma.

  1. Marque o disco como defeituoso. Num caso real, o kernel faz isso sozinho.
    $ sudo mdadm /dev/md0 --fail /dev/sdc
    mdadm: set /dev/sdc faulty in /dev/md0
    $ cat /proc/mdstat
    md0 : active raid1 sdc[1](F) sdb[0]                         « (F) = failed
          52395008 blocks super 1.2 [2/1] [U_]                  « só 1 de 2 funcionando

    Repare: o RAID continua active e os arquivos em /srv/espelho continuam acessíveis. Esse é o "modo degradado".

  2. Remova o disco do RAID.
    $ sudo mdadm /dev/md0 --remove /dev/sdc
    mdadm: hot removed /dev/sdc from /dev/md0
  3. Coloque o disco novo (no laboratório, o /dev/sdd) e adicione:
    $ sudo mdadm /dev/md0 --add /dev/sdd
    mdadm: added /dev/sdd
    $ cat /proc/mdstat
    md0 : active raid1 sdd[2] sdb[0]
          52395008 blocks super 1.2 [2/1] [U_]
          [==>..................]  recovery = 12.5% (6549376/52395008) finish=4.0min speed=187124K/sec
  4. Espere a reconstrução terminar e confira [2/2] [UU].
Identificar o disco físico certo

Num servidor real, anote o número de série antes de abrir a máquina: sudo smartctl -i /dev/sdc | grep -i serial (pacote smartmontools). A etiqueta do disco tem o mesmo número.

Ser avisado quando um disco falhar

O mdadm tem um monitor que pode mandar e-mail. Coloque MAILADDR seu@email no /etc/mdadm/mdadm.conf (exige um servidor de e-mail configurado) ou verifique periodicamente com um cron que procure _ no /proc/mdstat.


Outros níveis

A sintaxe é a mesma; mudam o --level e a quantidade de discos:

# RAID 5 com 3 discos
$ sudo mdadm --create /dev/md1 --level=5 --raid-devices=3 /dev/sdb /dev/sdc /dev/sdd
# RAID 10 com 4 discos
$ sudo mdadm --create /dev/md2 --level=10 --raid-devices=4 /dev/sd[b-e]
# RAID 1 com um disco reserva (spare), que entra sozinho se outro falhar
$ sudo mdadm --create /dev/md3 --level=1 --raid-devices=2 --spare-devices=1 /dev/sdb /dev/sdc /dev/sdd

No último exemplo, /dev/sd[b-e] é um curinga que vira /dev/sdb /dev/sdc /dev/sdd /dev/sde.


Desmontar o laboratório

$ sudo umount /srv/espelho
$ sudo mdadm --stop /dev/md0
mdadm: stopped /dev/md0
$ sudo mdadm --zero-superblock /dev/loop20 /dev/loop21 /dev/loop22
$ sudo losetup -d /dev/loop20 /dev/loop21 /dev/loop22
$ rm r1.img r2.img r3.img

--zero-superblock apaga a marca de RAID dos discos, para que não sejam reconhecidos como RAID no futuro. Lembre de tirar a linha ARRAY do mdadm.conf se ela foi gravada.


Quando não funciona

Depois de reiniciar, o RAID virou /dev/md127
$ cat /proc/mdstat
md127 : active (auto-read-only) raid1 sdb[0] sdc[1]

O que aconteceu: o RAID não estava no mdadm.conf (ou o initramfs não foi atualizado). O sistema montou mesmo assim, com um nome automático.

Como resolver: faça a seção "Salvar a configuração". Montar pelo UUID no fstab evita depender do nome md0.

"Device or resource busy" ao criar
$ sudo mdadm --create /dev/md0 --level=1 --raid-devices=2 /dev/sdb /dev/sdc
mdadm: cannot open /dev/sdb: Device or resource busy

O que aconteceu: o disco está em uso: montado, fazendo parte de outro RAID ou de um VG do LVM.

Como confirmar: lsblk /dev/sdb e cat /proc/mdstat.

Como resolver: desmonte, pare o RAID antigo (mdadm --stop) e limpe as marcas (mdadm --zero-superblock ou wipefs -a).

O status mostra [U_] e ninguém percebeu

O que aconteceu: um disco falhou e o RAID está degradado. Funciona, mas sem proteção: se o segundo disco falhar, os dados se perdem.

Como resolver: troque o disco o quanto antes (seção acima) e configure um aviso. Verifique o estado dos discos com sudo smartctl -H /dev/sdb.


Referência rápida

ComandoO que faz
cat /proc/mdstatEstado de todos os RAIDs
sudo mdadm --create /dev/md0 --level=N --raid-devices=N DISCOSCria um RAID
sudo mdadm --detail /dev/md0Detalhes de um RAID
sudo mdadm --detail --scanLinhas para o mdadm.conf
sudo update-initramfs -uAtualiza o boot com a nova configuração
sudo mdadm /dev/md0 --fail DISCOMarca um disco como defeituoso
sudo mdadm /dev/md0 --remove DISCOTira o disco do RAID
sudo mdadm /dev/md0 --add DISCOAdiciona disco (reconstrução automática)
sudo mdadm --stop /dev/md0Para o RAID
sudo mdadm --zero-superblock DISCOApaga a marca de RAID do disco

Exercícios

1. Criar um espelho

Complete para criar um RAID 1 com dois discos:

sudo mdadm --create /dev/md0 --level= --raid-devices= /dev/sdb /dev/sdc

2. Trocar o disco

O /dev/sdc foi removido. Complete para colocar o /dev/sdd no lugar:

sudo mdadm /dev/md0 /dev/sdd

3. Onde olhar primeiro

Complete o comando que mostra o estado de todos os RAIDs:

cat

4. O /proc/mdstat mostra [2/1] [U_]. O que significa?

5. Quatro discos de 2 TB em RAID 5. Quanto espaço útil?


Resumo

  • RAID 1 espelha, RAID 0 só acelera (sem proteção), RAID 5/6 economizam espaço com paridade, RAID 10 é rápido e seguro.
  • mdadm --create cria; /proc/mdstat mostra a saúde: [UU] bom, [U_] degradado.
  • Salve sempre: mdadm --detail --scan no mdadm.conf + update-initramfs -u.
  • Troca de disco: --fail → --remove → --add → esperar a reconstrução.
  • RAID não substitui backup.