Redundância de discos (RAID1) com Debian Squeeze (para sistemas em produção)
by (C) João Eriberto Mota Filho <eriberto (a) eriberto pro br>
Artigo criado em: 13 de janeiro de 2011.
Última atualização: veja o rodapé desta página.
Tiny URL ou bit.ly: http://bit.ly/raid1_squeeze_producao
Este tutorial é destinado a quem possui algum sistema já em produção (com Debian Squeeze) e precisa implementar a redundância de dados entre dois HDs (RAID1).
O RAID1
RAID é a sigla de Redundant Array of Independent Drives ou agrupamento redundante de discos independentes. Há vários níveis de RAID, sendo que neste artigo nos interessa o nível um.
No nível um (RAID1), teremos que trabalhar com pares de disco. Neste artigo trabalharemos apenas com um par. Quando um dado é enviado para o disco, na verdade, ele é escrito, ao mesmo tempo, nos dois discos. Caso um dos dois discos falhe, o outro continuará a operar normalmente. Com isso, não teremos a perda de dados e nem da disponibilidade do sistema.
Tendo em vista o baixo custo dos HDs atualmente, é extremamente indicado o uso de RAID1 em todos os ambientes, inclusive em casa.
O cenário deste artigo e as variações possíveis
Neste artigo utilizaremos um cenário onde teremos que espelhar um HD com duas partições: uma que contém a raiz e outra que contém o /home.
A clonagem da partição raiz é um pouco complicada, pois o sistema já está em produção e ela é necessária todo o tempo. Então, procedimentos especiais deverão ser adotados. Já a partição /home será bem mais simples. Não haverá partição de swap, pois partimos do princípio que, atualmente, todos preferem trabalhar com swap em arquivo.
Outras variações que poderão ser implementadas facilmente após o entendimento deste tutorial. Três delas:
- A existência de uma única partição para todo o sistema, sendo esta espelhada.
- A existência de várias partições para todo o sistema, sendo todas espelhadas.
- O espelhamento de apenas algumas partições do sistema, como a que contém o /home, por exemplo.
É importante dizer que a partição que será espelho de outra deverá ter o exato tamanho da original (situação ideal) ou ser maior.
Procedimentos iniciais
Inicialmente, instale o pacote mdadm, que é responsável pela administração do sistema de RAID:
# apt-get install mdadm
Obs: MD é a sigla de Multiple Devices. Essa sigla será muito utilizada a partir de agora. Um exemplo disso é o dispositivo /dev/md0, que será criado adiante. |
Considerando que o HD principal seja o /dev/sda e que o segundo HD já esteja disponível como /dev/sdb e, ainda, que os dois discos sejam exatamente do mesmo tamanho, utilizando o comando dd, clone o MBR do primeiro disco para o segundo, de forma que os esquema de particionamento permaneça o mesmo. Para isso, execute o comando:
# dd if=/dev/sda of=/dev/sdb bs=512 count=1
O próximo passo será reiniciar a máquina para que os módulos RAID sejam carregados e para que o sistema operacional reconheceça o novo esquema de particionamento do segundo HD. Para isso, execute:
# reboot
Clonagem da partição raiz
A partir de agora, teremos que criar um array RAID (/dev/md0), associar a primeira partição do segundo HD (/dev/sdb1) ao primeiro dispositivo RAID (/dev/md0). Depois disso, como só poderemos escrever em /dev/md0 (e não mais em /dev/sdb1), necessitaremos formatar /dev/md0 e, depois, copiar todos os dados de /dev/sda1 para /dev/md0 (que contém /dev/sdb1).
Para criar o array /dev/md0, associando o /dev/sdb1 ao mesmo, execute:
# mdadm -C /dev/md0 -l 1 -n 2 missing /dev/sdb1
Depois de pressionar o ENTER no comando anterior, surgirá na tela:
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?
Para responder à pergunta, pressione a tecla "y" e ENTER. Como resultado, surgirá na tela:
mdadm: Defaulting to version 1.2 metadata mdadm: array /dev/md0 started.
Para ver o array criado, utilize o comando:
# cat /proc/mdstat
O resultado será:
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10] md0 : active (auto-read-only) raid1 sdb1[1] 19529656 blocks super 1.2 [2/1] [_U] unused devices: <none>
Observe que foi criado um dispositivo /dev/md0, funcionando como RAID1, e que o mesmo contém o /dev/sdb1. |
O próximo passo será formatar o /dev/md0. Usarei o filesystem Ext4 com 0.5% de espaço reservado ao superusuário.
# mkfs.ext4 -m .5 /dev/md0
A seguir, deveremos montar o /dev/md0 em /mnt e copiar o conteúdo da partição raiz (exceto o /home). Para isso, utilizaremos o comando rsync, que permite excluir arquivos e diretórios de uma cópia. Então, inicialmente, instale o rsync:
# apt-get install rsync
Monte o /dev/md0:
# mount /dev/md0 /mnt
Copie tudo, menos o conteúdo do /home (que será colocado em outro array), o conteúdo do próprio /mnt (para evitar um loop de sistema) e o conteúdo do /proc e do /sys (para evitar uma paralisação do sistema):
# rsync -av --exclude=/home/* --exclude=/mnt/* --exclude=/proc/* --exclude=/sys/* / /mnt
Observe que o conteúdo de /proc e de /sys é virtual e estará disponível quando a máquina for reinicializada. |
Terminada a cópia, verifique se tudo está ok:
# ls /mnt
Desmonte o /dev/md0:
# umount /dev/md0
Clonagem da partição que contém o /home
Deveremos realizar o mesmo procedimento feito com a partição raiz, em relação à partição que contém o /home, gerando o /dev/md1. Mas por que simplesmente não associamos o /dev/sda2, que contém o diretório /home, ao /dev/md1? Simples: porque o filesystem a ser utilizado tem que ser estabelecido em /dev/md1 e, em consequência, não podemos aproveitar o existente em /dev/sda2.
Para criar o array /dev/md1, associado a /dev/sdb2, utilize o comando:
# mdadm -C /dev/md1 -l 1 -n 2 missing /dev/sdb2
Ao ser feita a pergunta Continue creating array?, responda "y" e ENTER. Depois, verifique se o /dev/md1 foi criado corretamente:
# cat /proc/mdstat
Formate o /dev/md1:
# mkfs.ext4 -m .5 /dev/md1
O próximo passo será copiar todo o conteúdo de /home para o /dev/md1. Assim sendo, monte o /dev/md1 em /mnt e faça a cópia de conteúdo:
# mount /dev/md1 /mnt # cp -av /home/* /mnt
Verifique se a cópia foi realizada corretamente:
# ls /mnt
Desmonte o dispositivo:
# umount /dev/md1
Adequação das partições e ajuste da tabela de filesystems (/etc/fstab)
Para que o sistema RAID funcione, as partições dos discos deverão ser do tipo RAID Linux. Inicialmente, vamos alterar apenas as partições de /dev/sdb. Para tanto, emita o comando:
# fdisk /dev/sdb
Dentro do ambiente do fdisk, pressione "p" e ENTER para ver o esquema de particionamento. Se você instalou o Debian corretamente, notará a presença do "ID System" como sendo "83 Linux". Deveremos mudar isso para "RAID Linux". Para tanto, pressione "t" e ENTER. Como número da partição, pressione "1" e ENTER. Como código da partição, pressione fd e ENTER. Para conferir, pressione "p" e ENTER. Faça o mesmo procedimento para a outra partição. No fim, salve e saia, pressionando "w" e ENTER.
IMPORTANTE! Uma vez alterada a identificação das partições de /dev/sdb para RAID Linux, faça o mesmo com as partições de /dev/sda.
O próximo passo será incluir o esquema RAID no fim do seu arquivo de configuração. Para ver o esquema, utilize o seguinte comando:
# mdadm -Es
Para incluir o esquema no arquivo de configuração RAID (/etc/mdadm/mdadm.conf), utilize o comando:
# mdadm -Es >> /etc/mdadm/mdadm.conf
Verifique o resultado:
# cat /etc/mdadm/mdadm.conf
Edite o arquivo /etc/fstab e altere os discos referentes às partições para /dev/mdX. No meu caso, o arquivo original era o seguinte:
# <file system> <mount point> <type> <options> <dump> <pass> proc /proc proc defaults 0 0 # / was on /dev/sda1 during installation UUID=6bee7c7c-0287-4f11-bcf8-310aca6c1c5c / ext4 errors=remount-ro 0 1 # /home was on /dev/sda2 during installation UUID=a234e87e-64b2-4dc0-8771-0072cd824311 /home ext4 defaults 0 2 /dev/scd0 /media/cdrom0 udf,iso9660 user,noauto 0 0
O arquivo final ficou da seguinte forma:
# <file system> <mount point> <type> <options> <dump> <pass> proc /proc proc defaults 0 0 # / was on /dev/sda1 during installation /dev/md0 / ext4 errors=remount-ro 0 1 # /home was on /dev/sda2 during installation /dev/md1 /home ext4 defaults 0 2 /dev/scd0 /media/cdrom0 udf,iso9660 user,noauto 0 0
Adequação do GRUB2
Agora, vamos ajustar o GRUB2 para que o mesmo passe a bootar utilizando o RAID. Inicialmente, reconstrua o arquivo initrd:
# update-initramfs -u
Atualize a configuração do GRUB:
# update-grub
Verifique se o GRUB passou a utilizar RAID. Procure por md/ dentro de /boot/grub/grub.cfg:
# cat /boot/grub/grub.cfg | grep md/
Instale o novo GRUB no MBR dos dois HDs:
# grub-install /dev/sda # grub-install /dev/sdb
Por fim, reinicie a máquina para que a mesma passe a utilizar os dispositivos /dev/mdX. Depois de reiniciada a máquina, faça login como root e utilize o comando # df -h para verificar se tudo deu certo. No meu caso, ficou assim:
root@aquarius:~# df -h Sist. Arq. Size Used Avail Use% Montado em /dev/md0 19G 2,6G 15G 15% / tmpfs 980M 0 980M 0% /lib/init/rw udev 975M 160K 975M 1% /dev tmpfs 980M 0 980M 0% /dev/shm /dev/md1 46G 180M 46G 1% /home
Adequação e sincronização da partição raiz
Uma vez reiniciado o sistema, estaremos utilizando o /dev/md0 e o /dev/md1 que, na verdade, correspondem a /dev/sdb1 e a /dev/sdb2. Assim sendo, o disco /dev/sda não está mais em uso. Com isso, poderemos inserir as suas partições nos arrays (/dev/md0 e /dev/md1). Quando fizermos isso, todo o conteúdo das partições de /dev/sda será apagado, pois tais partições serão espelhos das existentes em /dev/sdb.
Para fazer com que as partições de /dev/sda entrem nos arrays e sejam espelhos das partições existentes em /dev/sdb, utilize os comandos:
# mdadm -a /dev/md0 /dev/sda1 # mdadm -a /dev/md1 /dev/sda2
A seguir, caso deseje acompanhar a sincronização de discos, utilize o comando:
# watch -n 1 cat /proc/mdstat
A sincronização da partição /home
Teste de funcionamento
A troca de um disco danificado
Controle de acessos
<absHTML>
</absHTML>