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.