Implementando RAID1 em um sistema sem perder dados - Devin
Quem mexe bastante com servidores de qualquer tipo sabe muito bem o que é essa palavra: RAID. Sabemos que ter um RAID em um serviço de alta-disponibilidade é essencial, como é o caso de um RAID1, onde dois HDs são espelhados um no outro em tempo real, assim se por acaso um HD falhar, o sistema vai continuar funcionando sem interrupções. Mas se você coloca em mãos um sistema em que não há RAID1, talvez seja o caso de implementar um! Compra-se um HD, instala na máquina e então vem a questão: Como implementar o RAID1 sem perder todos os dados atuais?
Para esta tarefa, estarei utilizando dois HDs idênticos, cada um com 160GB de espaço em disco. Em relação ao espaço em disco, os HDs podem ser de tamanhos diferentes ou tipos diferentes, mas para o RAID1 é necessário que as partições nos dois discos sejam iguais. Em outras palavras, você pode ter um disco de 160GB e outro de 250GB, mas tenha em mente que só vai dar para fazer RAID1 com os 160GB do segundo HD, pois o espaço não pode exceder o do primeiro HD. O resto destes 250GB você pode criar outra partição e fazer o que quiser.
Este tutorial leva em conta que você já tem alguma experiência com esses assuntos. Apesar de estar tudo explicado e mastigado, muita coisa aqui mexe com particionamento e migração de dados, e qualquer erro pode gerar perda de dados. Então tome cuidado e saiba sempre o que você vai fazer antes de fazer de verdade. Neste exemplo eu utilizei um sistema Debian, mas o método aqui serve para todas as distribuições com bem poucas diferenças, o que já foi comprovado por mim que funciona (Fedora, CentOS e RHEL).
Nesta instalação, dividimos o HD em 3 partições, que já estão no primeiro disco. Supondo que este primeiro disco seja o /dev/sda e o segundo seja o /dev/sdb, as três partições existentes atualmente são:
/dev/sda1 (swap)
/dev/sda2 (/boot)
/dev/sda3 (/)
O que faremos agora será criar um dispositivo de RAID1 no sistema. Este dispositivo inicialmente estará "incompleto", pois apenas o disco 2 estará funcionando (o 1 estará ocupado com os dados atuais). Depois copiaremos todos os dados atuais para este segundo disco (já no RAID), reiniciaremos o sistema, deixando-o funcionando só a partir do disco 2 e depois colocaremos o disco 1, agora sem uso, também no RAID1, finalizando o processo.
2.1. LABELs nas partições
Verifique os arquivos: /etc/fstab e /boot/grub/menu.lst (ou /etc/grub.conf) e veja se não há nenhuma referência às partições via LABEL, ao invés do arquivo-dispositivo (p.ex.: /dev/sda3). Por exemplo, se no /etc/fstab tiver uma linha do tipo:
# findfs LABEL=/
O comando irá mostrar qual partição tem o label /, que no nosso caso é /dev/sda3. Então vamos remover este label, com o comando:
# e2label /dev/sda2 ""
Não esqueça de fazer isso para todo e qualquer LABEL que esteja configurado nesses arquivos. Isto é necessário para que em boots futuros, o sistema não se confunda na hora de montar as partições (caso, por exemplo, se coloque o mesmo LABEL em partições do disco 1 e 2).
2.2. Tamanho em disco
Verifique se os dois discos tem exatamente o mesmo tamanho, utilize os comandos como no exemplo a seguir:
312581808
# cat /sys/block/sdb/size
Lembrando que se você tem HDs diferentes, este passo pode ser pulado, mas tenha em mente que na hora de criar as partições, você deverá tomar cuidado para criá-las com tamanhos exatamente iguais.
2.3. Pacotes necessários
O pacote do programa mdadm deve estar devidamente instalado, assim como o device-mapper suportado no kernel. Nas distribuições atuais, os dois geralmente vêm como padrão, então provavelmente você não vai ter problemas com isto. Em todo caso, em sistemas baseados no Red Hat, os pacotes vão se chamar algo como "mdadm" e "device-mapper", enquanto que em sistemas baseados em Debian, os pacotes vão se chamar "mdadm" e "dmsetup". Utilize o rpm (Red Hat) ou dpkg (Debian) para fazer essa verificação.
Uma vez verificados os tamanhos exatos nos HDs, mude os tipos das partições do primeiro disco para "Linux raid autodetect". Este tipo será utilizado para montarmos o dispositivo RAID1 posteriormente. Para mudar o tipo, utilize a ferramenta fdisk:
Depois mude o tipo das três partições para o tipo fd. O comando dentro do fdisk para fazer isto é o t seguida pelo número da partição. Mudado os três tipos, o comando p dentro do fdisk irá mostrar algo parecido com isto:
/dev/sda1               1         122      979933+  fd  Linux raid autodetect
/dev/sda2   *         123         134       96390   fd  Linux raid autodetect
/dev/sda3             135       19457   155211997+  fd  Linux raid autodetect
Salve com o comando w do fdisk. Depois reinicie a máquina.
Depois de reiniciada, copie a tabela de partições do HD primário (sda) para o HD secundário (sdb), assim os dois vão ficar com as partições exatamente na mesma ordem e do mesmo tamanho também. Para esta tarefa, use o comando "sfdisk" como no exemplo abaixo:
# sfdisk -d /dev/sda > /tmp/partitions.txt
# sfdisk /dev/sdb < /tmp/partitions.txt
O primeiro comando acima escreve no arquivo /tmp/partitions.txt a tabela exata das partições do primeiro disco. O segundo comando particiona o segundo disco exatamente de acordo com o conteúdo do arquivo /tmp/partitions.txt.
Lembre-se: O segundo comando destrói toda a tabela de partições no disco /dev/sdb. Certifique-se de que o dispositivo seja este mesmo antes de executar o comando para não perder dados.
Nota: Caso você não possua HDs idênticos, você terá que fazer o processo de particionamento manualmente. Ao invés de utilizar o comando sfdisk para copiar a tabela de partições de um HD para o outro, crie manualmente via fdisk as partições na mesma ordem e tamanho do primeiro HD.
4. Dispositivo RAID
Agora é hora de criar o dispositivo RAID, que por enquanto só terá como membro o disco 2, pois o primeiro está sendo utilizado pelo sistema. Como temos 3 partições que queremos incluir no RAID1, criaremos três dispositivos RAID1:
# mdadm --create /dev/md0 --level=1 --raid-devices=2 missing /dev/sdb3
# mdadm --create /dev/md1 --level=1 --raid-devices=2 missing /dev/sdb1
# mdadm --create /dev/md2 --level=1 --raid-devices=2 missing /dev/sdb2
Os comandos acima criam três dispositivos: /dev/md0, /dev/md1 e /dev/md2. Todos eles são do tipo RAID1 (–level=1), contendo duas partições: uma faltando ("missing", o primeiro disco) e a partição do segundo disco em si.
Para fácil memorização, aqui estão os dispositivos e a equivalência de sua função no sistema:
/dev/md0 – / (raiz)
/dev/md1 – Memória SWAP
/dev/md2 – /boot
Para verificar se os dispositivos foram criados e reconhecidos, tem que haver semelhança com a saída do comando a seguir:
96320 blocks [2/1] [U_]
md0 : active raid1 sdb3[0]
155211904 blocks [2/1] [U_]
Caso não esteja de acordo, reinicie a máquina para o kernel reconhecer as novas configurações.
Primeiro crie o sistema de swap na partição /dev/md1:
Depois crie o sistema de arquivos ext3 na partição /dev/md0 (raiz):
Em seguida crie o sistema de arquivos ext3 na partição /dev/md2 (/boot):
6. O sistema no segundo disco
Agora que o segundo disco já está pronto com os dispositivos RAID1 funcionais, é hora de copiar todo o conteúdo do primeiro HD para o segundo HD.
Antes de começar toda a cópia, modifique a configuração do GRUB para ele carregar o sistema no dispositivo RAID ao invés de diretamente do primeiro HD. Para fazer isso, edite o arquivo /boot/grub/menu.lst, deixando a entrada do sistema operacional como no exemplo a seguir:
kernel          /vmlinuz-2.6.24-1-686 root=/dev/md0 ro
initrd          /initrd.img-2.6.24-1-686
Ou seja, anteriormente a linha do kernel tinha como root uma partição como a /dev/sda3. Como queremos usar agora o RAID, mudamos para /dev/md0 (equivalente à raiz no raid).
Em seguida, é hora de fazer toda a cópia. Monte o esqueleto do segundo HD no diretório /mnt e copie via comando "cp -a" os diretórios da raiz do primeiro HD para o esqueleto.
Use o exemplo a seguir como um guia:
# mkdir novo-boot nova-raiz
# mount -t ext3 /dev/md2 novo-boot
# mount -t ext3 /dev/md0 nova-raiz
# cp -a /boot/* novo-boot
# cd nova-raiz
# mkdir boot initrd mnt proc sys
# cp -a /bin /cdrom /dev /etc /home /initrd.img /lib /media ./
# cp -a /opt /root /sbin /srv /tmp /usr /var /vmlinuz ./
Depois de copiado todos os arquivos (pode demorar um pouco), edite o arquivo /mnt/nova-raiz/etc/fstab, que fica no dispositivo RAID, para refletir as configurações da nova localização do sistema. Mude os dispositivos das partições para seus equivalentes como dispositivos RAID. Veja o exemplo a seguir:
/dev/md2        /boot           ext3    defaults        0       2
Feito isso, reinicie o sistema. O GRUB deverá carregar o sistema no segundo HD, deixando o primeiro livre. Para verificar se isto foi realmente feito, utilize o comando mount e compare com o exemplo a seguir:
/dev/md/2 on /boot type ext3 (rw)
7. Adicionando o primeiro disco no RAID1
Agora que o sistema está funcionando exclusivamente no dispositivo RAID, o primeiro HD está livre e podemos adicioná-lo ao dispositivo também. Lembrando que esta operação irá destruir todos os dados do primeiro HD. Então certifique-se que seu sistema está funcionando corretamente, agora no disco 2, e com todos os seus dados!
Para adicionar as três partições do primeiro disco no RAID, utilize os comandos:
# mdadm /dev/md1 -a /dev/sda1
# mdadm /dev/md2 -a /dev/sda2
O processo de adição do primeiro disco no RAID pode demorar bastante. Uma vez adicionada as partições, o Linux irá sincronizar todos os dados, copiando todas as informações do segundo disco no primeiro e criando os recursos de redundância (espelhamento). Para aumentar a velocidade deste processo, certifique-se que o sistema não esteja sendo muito usado e execute o comando:
# echo -n 500000 > /proc/sys/dev/raid/speed_limit_max
Isso irá aumentar a velocidade padrão de atividades de sincronismo do RAID. Se você quiser acompanhar o processo detalhadamente, abra um novo terminal e utilize o seguinte comando:
# watch --interval 1 'cat /proc/mdstat'
Este comando lhe passará o conteúdo do arquivo /proc/mdstat (que contém o status atual dos dispositivos RAID do sistema) em um intervalo de 1 segundo. Ao final do processo, o conteúdo do arquivo /proc/mdstat deverá estar semelhante ao seguinte:
96320 blocks [2/2] [UU]
155211904 blocks [2/2] [UU]
Pronto, agora o espelhamento entre HDs já está funcionando.
8. Instalando o GRUB nos dois discos
Apesar do espelhamento estar funcionando, o antigo GRUB foi destruído e precisamos agora instalá-lo nos dois discos para uma redundância verdadeira. Para fazer isso execute o comando "grub", que irá lhe colocar em uma linha de comando do próprio grub. Os três comandos a seguir irão instalar o GRUB no primeiro HD:
Running "embed /grub/e2fs_stage1_5 (hd0)"...  15 sectors are embedded.
Agora faça o mesmo para o segundo disco:
Por último, edite o arquivo de configuração do GRUB para deixar a entrada do sistema da seguinte forma:
Com este último passo, todas as configurações do espelhamento estarão feitas e o sistema inteiro (inclusive a memória swap) estará funcionando nos dois discos ao mesmo tempo. Você pode reiniciar a máquina para verificar se tudo está funcionando devidamente, lembrando que pode-se verificar o status dos dispositivos RAID no conteúdo do arquivo /proc/mdstat.
hd partições raid raid1 tutorial
Sistema de arquivos proc
Comandos de Informações do Sistema Linux
7 respostas para "Implementando RAID1 em um sistema sem perder dados"
27 de janeiro de 2009 às 3:19 am
Gostei do artigo, um detalhe que pode ser incluido é fazer um chroot em um diretorio do 1° disco do raid 1, para no 1° no boot o servidor continuar em produção até que ocorra o 100% da sincronização dos metas devices!
14 de março de 2009 às 5:07 pm
Muito bom o artigo. Utilizei na empresa onde trabalho e funcionou perfeitamente. Apenas na última etapa no que se refere aos comandos grub que utilizei "root (hd0,1)" em vez de root (hd0,0). No mais o artigo é impecável. Meus parabéns Hugo.
23 de maio de 2009 às 11:29 am
Eitch, deixe-me perguntar uma coisa, que é correlacionada com RAID, mas não diz respeito diretamente ao seu 'tuto' (mt bem feito por sinal)… Já vi q vc é fera então poderá me tirar uma dúvida que eu tenho há tempos em relação a um servidor que montei.
O S.O. é o Windows Server 2003 e eu gostaria de migrar ele para Linux mas sem ter que formatar do zero pq tem muita coisa nele. Então pensei em particioná-lo usando GParted instalar uma distro maneira e aos poucos ir migrando as coisas do SO proprietário para o livre. Bom, até aí t.b., galho fraco, já fiz isso um punhado de vzs. Só que tem uma particularidade nesse server: ele roda em cima de um RAID0 feito através do hardware de sua placa – uma Intel DQ965gf. Tem um software depois que se instala no WServer 2003 q permite vc gerenciar ele. E funciona blz, faz alguns anos.
Bom, quando fui colocar o GParted e ele detectou os dispositivos (2 Satas de 80GB), não bate o espaço físico livre q tem efetivamente pelo WServer2003 (32GB). Acusa somente 7MB livres e diz que não tem como reparticionar. E aí? Tem saída pra isso? O GParted não resolve essa? Vc pegou algum caso parecido?
20 de julho de 2009 às 10:49 am
Parabens pelo Tutorial! Funciona certinho!!!
mas como todo curioso, tenho uma duvida! Ou melhor, gostaria de pedir um sugestao!
Eu gostaria de montar um servidor de VM, com Xen ou VMware ESXi, porem tenho necessidade de fazer RAID 1, é possivel utilizando esses 2 OS?
Amelio disse:
17 de setembro de 2009 às 8:35 am
Parabens pela matéria. Muito boa.
Tô com uma duvida no raid1 :
Instalei o debian já com raid1 e lvm.
Acontece que quando tiro o hd2 ele abre normalmente, mas quando tiro o hd1 ele da a seguinte mensagem :
Error 15 e para ai.
Gostaria de saber se tem como deixar automatico, tipo tiro o hd bichado e substituo e o novo hd já pega as configurações, ou pelo menos nesse caso como colocar o grub nos dois.
9 de abril de 2010 às 10:48 am
Amigo, muitoooo bom o tutorial, porem estão faltando algumas coisas, em breve vou postar um outro, pouco mais completo e posto aqui tudo bem? Abraços
8 de agosto de 2013 às 7:38 am
Gostaria que alguém como voce fizesse um tuto sobre como recuperar os dados de um raid 1 de maneira prática e segura, já que um teste que fiz com o Debian 6 ( colocando o disco na máquina Debian) , apenas acusou esse mesmo disco como ARRAY e não acessou seus dados. Achei frustrante. . Isso é muito importante pra mim e , acredito para os outros também. Valeu