Português do Brasil English
Devin no Facebook  Devin no Twitter  RSS do Site 
Linux    

Implementando RAID1 em um sistema sem perder dados


Comentários  7
Visualizações  
47,384

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?

1. Introdução

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. Verificações

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:

LABEL=/                 /                       ext3    defaults        1 1

Use o comando:

# 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:

# cat /sys/block/sda/size
312581808
# cat /sys/block/sdb/size
312581808

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.

3. Particionamento

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:

# fdisk /dev/sda

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:

Disk /dev/sda: 160.0 GB, 160041885696 bytes
255 heads, 63 sectors/track, 19457 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

   Device Boot      Start         End      Blocks   Id  System
/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:

# cat /proc/mdstat
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]
md1 : active raid1 sdb1[0]
      979840 blocks [2/1] [U_]

md2 : active raid1 sdb2[0]
      96320 blocks [2/1] [U_]

md0 : active raid1 sdb3[0]
      155211904 blocks [2/1] [U_]

unused devices: <none>

Caso não esteja de acordo, reinicie a máquina para o kernel reconhecer as novas configurações.

5. Sistemas de Arquivos

Primeiro crie o sistema de swap na partição /dev/md1:

# mkswap /dev/md1

Depois crie o sistema de arquivos ext3 na partição /dev/md0 (raiz):

# mke2fs -j /dev/md0

Em seguida crie o sistema de arquivos ext3 na partição /dev/md2 (/boot):

# mke2fs -j /dev/md2

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:

title           Debian GNU/Linux, kernel 2.6.24-1-686
root            (hd1,1)
kernel          /vmlinuz-2.6.24-1-686 root=/dev/md0 ro
initrd          /initrd.img-2.6.24-1-686
savedefault

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:

# cd /mnt
# 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:

proc            /proc           proc    defaults        0       0
/dev/md0        /               ext3    defaults,errors=remount-ro 0       1
/dev/md2        /boot           ext3    defaults        0       2
/dev/md1        none            swap    sw              0       0
/dev/hda        /media/cdrom0   udf,iso9660 user,noauto     0       0

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:

# mount
/dev/md/0 on / type ext3 (rw,errors=remount-ro)
tmpfs on /lib/init/rw type tmpfs (rw,nosuid,mode=0755)
proc on /proc type proc (rw,noexec,nosuid,nodev)
sysfs on /sys type sysfs (rw,noexec,nosuid,nodev)
procbususb on /proc/bus/usb type usbfs (rw)
udev on /dev type tmpfs (rw,mode=0755)
tmpfs on /dev/shm type tmpfs (rw,nosuid,nodev)
devpts on /dev/pts type devpts (rw,noexec,nosuid,gid=5,mode=620)
/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/md0 -a /dev/sda3
# 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:

Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]
md1 : active raid1 sda1[0] sdb1[1]
      979840 blocks [2/2] [UU]

md2 : active raid1 sda2[0] sdb2[1]
      96320 blocks [2/2] [UU]

md0 : active raid1 sda3[0] sdb3[1]
      155211904 blocks [2/2] [UU]

unused devices: <none>

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:

grub> device (hd0) /dev/sda
grub> root (hd0,0)
 Filesystem type is ext2fs, partition type 0xfd
grub> setup (hd0)
 Checking if "/boot/grub/stage1" exists... no
 Checking if "/grub/stage1" exists... yes
 Checking if "/grub/stage2" exists... yes
 Checking if "/grub/e2fs_stage1_5" exists... yes
 Running "embed /grub/e2fs_stage1_5 (hd0)"...  15 sectors are embedded.
succeeded
 Running "install /grub/stage1 (hd0) (hd0)1+15 p (hd0,0)/grub/stage2 /grub/grub.conf"... succeeded
Done.

Agora faça o mesmo para o segundo disco:

grub> device (hd0) /dev/sdb
grub> root (hd0,0)
 Filesystem type is ext2fs, partition type 0xfd
grub> setup (hd0)
 Checking if "/boot/grub/stage1" exists... no
 Checking if "/grub/stage1" exists... yes
 Checking if "/grub/stage2" exists... yes
 Checking if "/grub/e2fs_stage1_5" exists... yes
 Running "embed /grub/e2fs_stage1_5 (hd0)"...  15 sectors are embedded.
succeeded
 Running "install /grub/stage1 (hd0) (hd0)1+15 p (hd0,0)/grub/stage2 /grub/grub.conf"... succeeded
Done.

Por último, edite o arquivo de configuração do GRUB para deixar a entrada do sistema da seguinte forma:

title           Debian GNU/Linux, kernel 2.6.24-1-686
root            (hd0,1)
kernel          /vmlinuz-2.6.24-1-686 root=/dev/md0 ro
initrd          /initrd.img-2.6.24-1-686
savedefault

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.


Comentários  7
Visualizações  
47,384


TagsLeia também

Apaixonado por Linux e administração de sistemas. Viciado em Internet, servidores, e em passar conhecimento. Idealizador do Devin, tem como meta aprender e ensinar muito Linux, o que ele vem fazendo desde 1997 :-)


Leia também



Comentários

7 respostas para “Implementando RAID1 em um sistema sem perder dados”

  1. Olympio disse:

    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!

  2. Jeferson disse:

    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.

  3. Sergio disse:

    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?

    Gde. abc!

  4. Bruno Santos disse:

    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?

    Obrigado e parabens!

  5. Amelio disse:

    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 :

    GRUB loading, please wait…

    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.

  6. Thiago disse:

    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

  7. jorge disse:

    Obrigado pela info.
    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

Deixe uma resposta