Criando arrays RAID e migrando dados em CentOS
Objetivo e escopo
Este documento descreve como: criar arrays RAID1 com mdadm, preparar um dos arrays para uso com LVM, atualizar a configuração do sistema para usar os novos dispositivos RAID, mover dados do disco original para os arrays redundantes e finalizar a sincronização. É destinado a administradores Linux com acesso root que trabalham em sistemas similares ao CentOS 5 (ex.: layout com /boot em partição separada e LVM para /).
Importante: execute esses passos com acesso físico à máquina ou uma sessão de console remoto confiável. Nunca remova discos ativos nem interrompa uma sincronização de RAID sem ter backups válidos.
Índice
- Criar arrays RAID
- Checar o estado do RAID
- Criar sistema de arquivos e preparar LVM
- Atualizar mdadm.conf, /etc/fstab, /etc/mtab e GRUB
- Regenerar initrd
- Mover os dados com pvmove e adicionar discos ao RAID
- Verificações, playbook resumido e listas de verificação
- Fluxograma de decisão e matriz de riscos
- Resumo
1. Criar nossos arrays RAID
Agora vamos criar os arrays RAID /dev/md0 e /dev/md1. /dev/sdb1 será adicionado a /dev/md0 e /dev/sdb2 a /dev/md1. /dev/sda1 e /dev/sda2 não podem ser adicionados neste momento porque o sistema está rodando neles; por isso usamos o placeholder missing nos comandos a seguir:
mdadm --create /dev/md0 --level=1 --raid-disks=2 missing /dev/sdb1
mdadm --create /dev/md1 --level=1 --raid-disks=2 missing /dev/sdb2
O comando a seguir mostrará o estado dos arrays:
cat /proc/mdstat
A saída deverá indicar que você tem dois arrays RAID degradados ([U] ou [U] indica array degradado; [UU] indica array OK):
[root@server1 ~]# cat /proc/mdstat
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]
md1 : active raid1 sdb2[1]
10377920 blocks [2/1] [_U]
md0 : active raid1 sdb1[1]
104320 blocks [2/1] [_U]
unused devices:
[root@server1 ~]#
Nota: o estado inicial com “missing” é normal quando o segundo disco do par ainda está ausente. O array funcionará em modo degradado até adicionarmos o segundo membro.
Criar sistema de arquivos no md0
Agora criamos um sistema de arquivos ext3 no array não-LVM /dev/md0:
mkfs.ext3 /dev/md0
Preparar md1 para LVM
Para preparar o array LVM (/dev/md1):
pvcreate /dev/md1
Em seguida, adicione /dev/md1 ao grupo de volumes VolGroup00:
vgextend VolGroup00 /dev/md1
Verifique os physical volumes:
pvdisplay
A saída deverá mostrar que /dev/md1 foi adicionado ao volume group VolGroup00:
[root@server1 ~]# pvdisplay
— Physical volume —
PV Name /dev/sda2
VG Name VolGroup00
PV Size 9.90 GB / not usable 22.76 MB
Allocatable yes (but full)
PE Size (KByte) 32768
Total PE 316
Free PE 0
Allocated PE 316
PV UUID aikFEP-FB15-nB9C-Nfq0-eGMG-hQid-GOsDuj
— Physical volume —
PV Name /dev/md1
VG Name VolGroup00
PV Size 9.90 GB / not usable 22.69 MB
Allocatable yes
PE Size (KByte) 32768
Total PE 316
Free PE 316
Allocated PE 0
PV UUID u6IZfM-5Zj8-kFaG-YN8K-kjAd-3Kfv-0oYk7J
[root@server1 ~]#
Em seguida, confira o volume group:
vgdisplay
Saída esperada (exemplo):
[root@server1 ~]# vgdisplay
— Volume group —
VG Name VolGroup00
System ID
Format lvm2
Metadata Areas 2
Metadata Sequence No 4
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 2
Open LV 2
Max PV 0
Cur PV 2
Act PV 2
VG Size 19.75 GB
PE Size 32.00 MB
Total PE 632
Alloc PE / Size 316 / 9.88 GB
Free PE / Size 316 / 9.88 GB
VG UUID ZPvC10-cN09-fI0S-Vc8l-vOuZ-wM6F-tlz0Mj
[root@server1 ~]#
2. Atualizar mdadm.conf e arquivos de montagem
Crie /etc/mdadm.conf com a varredura dos arrays:
mdadm --examine --scan > /etc/mdadm.conf
Verifique o conteúdo:
cat /etc/mdadm.conf
No arquivo você deverá ver linhas semelhantes a estas (identificadores UUID dos seus arrays):
ARRAY /dev/md0 level=raid1 num-devices=2 UUID=0a96be0f:bf0f4631:a910285b:0f337164
ARRAY /dev/md1 level=raid1 num-devices=2 UUID=f9e691e2:8d25d314:40f42444:7dbe1da1
Atualizar /etc/fstab
Edite /etc/fstab e substitua LABEL=/boot (ou /dev/sda1) por /dev/md0. O arquivo deve ficar semelhante a:
vi /etc/fstab
Conteúdo de exemplo:
/dev/VolGroup00/LogVol00 / ext3 defaults 1 1
/dev/md0 /boot ext3 defaults 1 2
tmpfs /dev/shm tmpfs defaults 0 0
devpts /dev/pts devpts gid=5,mode=620 0 0
sysfs /sys sysfs defaults 0 0
proc /proc proc defaults 0 0
/dev/VolGroup00/LogVol01 swap swap defaults 0 0
Atualizar /etc/mtab
Substitua /dev/sda1 por /dev/md0 em /etc/mtab para refletir o /boot montado no RAID:
vi /etc/mtab
Exemplo:
/dev/mapper/VolGroup00-LogVol00 / ext3 rw 0 0
proc /proc proc rw 0 0
sysfs /sys sysfs rw 0 0
devpts /dev/pts devpts rw,gid=5,mode=620 0 0
/dev/md0 /boot ext3 rw 0 0
tmpfs /dev/shm tmpfs rw 0 0
none /proc/sys/fs/binfmt_misc binfmt_misc rw 0 0
sunrpc /var/lib/nfs/rpc_pipefs rpc_pipefs rw 0 0
3. Ajustar o GRUB para fallback e adicionar entrada usando sdb
Abra /boot/grub/menu.lst e adicione fallback=1 logo após default=0:
vi /boot/grub/menu.lst
Exemplo:
[...]
default=0
fallback=1
[...]
Isso faz com que, se a primeira entrada de kernel falhar, o GRUB tente a entrada definida como fallback (contagem começa em 0).
No mesmo arquivo, copie a primeira stanza do kernel e cole-a antes da existente, alterando root (hd0,0) para root (hd1,0) — assim o GRUB tentará também inicializar a partir do disco /dev/sdb que já faz parte dos arrays RAID:
[...]
title CentOS (2.6.18-128.el5)
root (hd1,0)
kernel /vmlinuz-2.6.18-128.el5 ro root=/dev/VolGroup00/LogVol00
initrd /initrd-2.6.18-128.el5.img
title CentOS (2.6.18-128.el5)
root (hd0,0)
kernel /vmlinuz-2.6.18-128.el5 ro root=/dev/VolGroup00/LogVol00
initrd /initrd-2.6.18-128.el5.img
[...]
Observação: root (hd1,0) refere-se ao disco que hoje é /dev/sdb. Após reiniciar, o sistema tentará inicializar a partir do RAID; se falhar, usará o fallback (o disco original /dev/sda).
Atualizar o ramdisk (initrd)
Mova o initrd atual e regenere-o para garantir que os drivers necessários para RAID e LVM sejam incluídos:
mv /boot/initrd-`uname -r`.img /boot/initrd-`uname -r`.img_orig
mkinitrd /boot/initrd-`uname -r`.img `uname -r`
4. Movendo nossos dados para os arrays RAID
Com todos os arquivos de configuração atualizados, copie o conteúdo de /dev/sda para /dev/sdb (incluindo as mudanças feitas). Para mover o conteúdo do PV /dev/sda2 para o PV /dev/md1 use pvmove:
pvmove /dev/sda2 /dev/md1
Esse processo pode levar tempo dependendo do I/O e do tamanho dos volumes; seja paciente.
Após a conclusão, remova /dev/sda2 do grupo VolGroup00:
vgreduce VolGroup00 /dev/sda2
E instrua o sistema a não usar mais /dev/sda2 como physical volume:
pvremove /dev/sda2
Verifique com pvdisplay:
[root@server1 ~]# pvdisplay
— Physical volume —
PV Name /dev/md1
VG Name VolGroup00
PV Size 9.90 GB / not usable 22.69 MB
Allocatable yes (but full)
PE Size (KByte) 32768
Total PE 316
Free PE 0
Allocated PE 316
PV UUID u6IZfM-5Zj8-kFaG-YN8K-kjAd-3Kfv-0oYk7J
[root@server1 ~]#
Alterar partição de /dev/sda2 para RAID autodetect e adicioná-la ao array
Use fdisk para alterar o tipo de partição de /dev/sda2 para “fd” (Linux raid autodetect):
fdisk /dev/sda
Exemplo de sessão (insira as opções indicadas entre <–):
[root@server1 ~]# fdisk /dev/sda
The number of cylinders for this disk is set to 1305.
There is nothing wrong with that, but this is larger than 1024,
and could in certain setups cause problems with:
- software that runs at boot time (e.g., old versions of LILO)
- booting and partitioning software from other OSs
(e.g., DOS FDISK, OS/2 FDISK)
Command (m for help): <– t
Partition number (1-4): <– 2
Hex code (type L to list codes): <– fd
Changed system type of partition 2 to fd (Linux raid autodetect)
Command (m for help): <– w
The partition table has been altered!
Calling ioctl() to re-read partition table.
WARNING: Re-reading the partition table failed with error 16: Device or resource busy.
The kernel still uses the old table.
The new table will be used at the next reboot.
Syncing disks.
[root@server1 ~]#
Em seguida, adicione /dev/sda2 ao array md1:
mdadm --add /dev/md1 /dev/sda2
Acompanhe a sincronização:
cat /proc/mdstat
Exemplo de saída durante a recuperação (síncrona):
[root@server1 ~]# cat /proc/mdstat
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]
md1 : active raid1 sda2[2] sdb2[1]
10377920 blocks [2/1] [_U]
[====>…………….] recovery = 23.4% (2436544/10377920) finish=2.0min speed=64332K/sec
md0 : active raid1 sdb1[1]
104320 blocks [2/1] [_U]
unused devices:
[root@server1 ~]#
Você pode usar:
watch cat /proc/mdstat
para obter uma saída atualizada automaticamente. Para sair de watch, pressione CTRL+C.
Aguarde até que a sincronização termine. Saída final esperada:
[root@server1 ~]# cat /proc/mdstat
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]
md1 : active raid1 sda2[0] sdb2[1]
10377920 blocks [2/2] [UU]
md0 : active raid1 sdb1[1]
104320 blocks [2/1] [_U]
unused devices:
[root@server1 ~]#
5. Montar /dev/md0 e copiar /boot
Crie o diretório de montagem e monte /dev/md0:
mkdir /mnt/md0
mount /dev/md0 /mnt/md0
Verifique a montagem com:
mount
Exemplo de saída mostrando /boot no RAID e também montado em /mnt/md0:
[root@server1 ~]# mount
/dev/mapper/VolGroup00-LogVol00 on / type ext3 (rw)
proc on /proc type proc (rw)
sysfs on /sys type sysfs (rw)
devpts on /dev/pts type devpts (rw,gid=5,mode=620)
/dev/md0 on /boot type ext3 (rw)
tmpfs on /dev/shm type tmpfs (rw)
none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)
sunrpc on /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw)
/dev/md0 on /mnt/md0 type ext3 (rw)
[root@server1 ~]#
Agora copie o conteúdo de /boot para o novo array montado em /mnt/md0 (preservando atributos e links):
cd /boot
cp -dpRx . /mnt/md0
As opções cp usadas significam: -d preserva links simbólicos, -p preserva timestamps e permissões, -R recursivo, -x não atravessa sistemas de arquivos montados.
Checklists rápidos (pré-requisitos e pós-operação)
Checklist antes de começar:
- Backup completo e verificado do sistema e /boot.
- Acesso de console remoto ou físico (caso a rede caia).
- Ferramentas instaladas: mdadm, lvm2.
- Tempo reservado para migração (pvmove e sincronização podem demorar).
Checklist após cada etapa crítica:
- Depois de mdadm –create: cat /proc/mdstat mostra arrays criados.
- Após pvcreate/vgextend: pvdisplay e vgdisplay mostram dispositivos esperados.
- Após editar fstab/mtab: confirme que /boot está definido como /dev/md0.
- Após atualizar GRUB: verifique menu.lst e regenere initrd.
- Depois de pvmove: pvdisplay não deve mais listar /dev/sda2.
- Após mdadm –add e sincronização: cat /proc/mdstat deve mostrar [UU] para arrays completos.
Playbook resumido (passos executáveis)
- Criar md0 e md1 com disco secundário sdb (usar missing para par ausente).
- mkfs.ext3 /dev/md0
- pvcreate /dev/md1
- vgextend VolGroup00 /dev/md1
- mdadm –examine –scan > /etc/mdadm.conf
- Editar /etc/fstab e /etc/mtab para usar /dev/md0 em /boot
- Atualizar /boot/grub/menu.lst (fallback=1, adicionar entry com root (hd1,0))
- mv + mkinitrd para atualizar initrd
- pvmove /dev/sda2 /dev/md1
- vgreduce VolGroup00 /dev/sda2 && pvremove /dev/sda2
- Mudar parttype de /dev/sda2 para fd via fdisk e mdadm –add /dev/md1 /dev/sda2
- Acompanhar cat /proc/mdstat até sincronização terminar
- mkdir /mnt/md0; mount /dev/md0 /mnt/md0; cp -dpRx /boot . /mnt/md0
- Reiniciar e testar boot a partir do RAID (tenha console disponível)
Fluxograma de decisão (Mermaid)
flowchart TD
A[Iniciar migração RAID] --> B{Backup válido?}
B -- Não --> Z[Fazer backup e validar]
B -- Sim --> C[Criar arrays md0 e md1]
C --> D{md0 criado com sucesso?}
D -- Não --> Y[Corrigir erros de mdadm; verificar discos]
D -- Sim --> E[Preparar md1 para LVM]
E --> F[vgextend VolGroup00]
F --> G[Atualizar mdadm.conf, fstab, mtab e GRUB]
G --> H[Regenerar initrd]
H --> I[pvmove /dev/sda2 /dev/md1]
I --> J{pvmove concluído?}
J -- Não --> X[Aguardar ou investigar I/O]
J -- Sim --> K[fdisk alterar parttype /dev/sda2 -> fd]
K --> L[mdadm --add /dev/md1 /dev/sda2]
L --> M{sincronização completa?}
M -- Não --> X
M -- Sim --> N[montar /dev/md0 e copiar /boot]
N --> O[Testar boot; reiniciar]
O --> P[Fim]
Matriz de riscos e mitigação
- Perda de boot ao gravar GRUB: Mitigação — manter o disco original com fallback=1 e ter console de recuperação.
- Dados incompletos após pvmove interrompido: Mitigação — não remover PV original até confirmar pvdisplay final; ter backup.
- Sincronização RAID lenta: Mitigação — verificar carga do I/O, priorizar janela de manutenção, usar ionice se necessário.
- Erro ao reescrever tabela de partição (ioctl error 16): Mitigação — reiniciar em janela de manutenção se necessário; o kernel usará nova tabela no próximo boot.
Critérios de aceitação (verificações finais)
- Todos os arrays RAID reportam [UU] em /proc/mdstat.
- /boot está montado a partir de /dev/md0 e contém os kernels e initrds corretos.
- vgdisplay mostra apenas /dev/md1 como PV associado (ou o PV esperado).
- Sistema reinicia com sucesso a partir do array RAID (teste de reboot).
- Backups anteriores permanecem íntegros e verificáveis.
Perguntas frequentes rápidas e solução de problemas
Q: Se o sistema não inicializar após a mudança do GRUB?
A: Use o fallback do GRUB para inicializar a partir do disco original; entre em modo single-user e revise /boot, menu.lst e initrd.
Q: E se pvmove falhar por falta de espaço?
A: Verifique espaço livre no PV destino (Free PE). Expanda o VG ou reduza volumes antes de mover. Nunca prossiga sem espaço suficiente.
Q: Como monitorar a sincronização RAID em tempo real?
A: watch cat /proc/mdstat exibe progresso; verificar também /var/log/messages para erros de disco.
Boas práticas e recomendações finais
- Teste este procedimento em uma VM ou ambiente de laboratório antes de executar em produção.
- Planeje uma janela de manutenção com comunicação às partes interessadas.
- Mantenha documentação das alterações e dos comandos executados.
- Considere automatizar verificações pós-migração com scripts que validem /proc/mdstat, pvdisplay e a capacidade de reboot.
Resumo
- Criamos dois arrays RAID1, preparamos um deles para LVM e movemos volumes usando pvmove.
- Atualizamos mdadm.conf, /etc/fstab, /etc/mtab, GRUB e regeneramos initrd.
- Sincronizamos os discos, montamos /dev/md0 e copiamos /boot.
- Siga as checklists e valide todos os critérios de aceitação antes de remover os discos originais.
Importante: sempre tenha backups e acesso de recuperação antes de executar operações em discos e boot loaders.
Materiais semelhantes

Backup do Registro do Windows — Guia prático

Como ver publicações curtidas no Instagram

Digitação por voz no WhatsApp — Gboard e SwiftKey

Como usar a pesquisa comum do IMDb

Mostrar citação na área de trabalho com Rainmeter
