Substituindo um disco em falha em um array RAID1 via software em Linux
Criada por: Frederico Madeira, última modificação em: Wed 01 of May, 2013 (03:11 UTC)
Para garantir a disponibilidade dos arquivos armazenados em meu servidor, fiz a implementação de um array em RAID 1 com dois discos de 2Tb. O RAID 1 garante espelhamento dos dados gravados nos discos. Desta forma, se um dos discos sofrer algum problema, os dados continuam íntegros pois possuem uma réplica no segundo disco.
Recentemente ocorreu uma falha em um dos discos do meu servidor e decidi escrever este artigo mostrando como recuperar um disco em falha e reconstruir o array, garantindo assim a disponibilidade dos seus dados.
Primeiramente vamos confirmar que o disco está apresentando falha:
Observe as linhas abaixo:
- md0 : active raid1 sdb1[1] : Indica que no device md0 consta apenas um disco que neste caso é o sdb1
- [_U]: indica que o primeiro disco está e falha
Mais algumas verificações:
Observe a indicação abaixo indicando que existe um disco em falha:
Array State : .A ('A' == active, '.' == missing)
Uma vez identificado que o disco está em falha, podemos substituí-lo. No meu caso, o disco que do array que apresentou falha foi o /dev/sda.
Caso seu hard disk seja hot swap, devemos proceder conforme abaixo:
Proceda com a substituição do disco em falha. Após a substituição do mesmo, vamos confirmar através do comando abaixo:
O quadro acima foi alterado para refletir apenas os discos utilizados no array
Para que possamos iniciar a reconstrução do array utilizando o novo disco, é necessário que a tabela de partição do novo disco, seja igual a primeira pois os discos espelhados precisam ser iguais. Para gerenciar a tabela de partições podemos usar o comando sfdisk da seguinte forma:
Fazendo backup da tabela de partições (partition table)
Para restaurar a tabela de partições
Para clonar a tabela de partições.
Isso clonará a tabela de partições do disco sda no disco sdb. Neste processo não é feita nenhuma alteração no disco que está servindo como modelo (sda)
No meu caso, o disco em falha é o sda, então teremos que clonar o a tabela de partições do disco sdb no disco sda.
Caso receba o erro abaixo:
use --force no comando de escrita da tabela de partições no disco de destino
Verificando se a estrutura das partições estão iguais:
Observe que o disco sda agora está com as partições sda1 que será espelho a sdb1 no array /dev/md0 e a sda2 que será espelho da sdb2 no array em /dev/md1
Vamos adicionar as duas partições do novo disco aos dois arrays md0 e md1.
Após esta etapa, o array iniciará a sincronização do novo disco/partições conforme abaixo:
Observe que o array md0 já está sincronizado [UU] e o array md1 está sincronizando.
Após o tempo indicado obtemos os dois arrays sincronizados e os dados novamente estão protegidos.
Por último, caso os arrays pertençam a discos botaveis, será necessário reinstalar o grub no novo disco, para que ele posso ser iniciado em caso de falha no outro disco.
Desta forma, voltamos a obter um nível satisfatório de segurança dos nossos dados, visto que estão armazenados em um array RAID 1. Vale ressaltar que todos os procedimentos acima foram testados e validados a fim de garantir que não haverá perca de dados do seu array durante o processo de substituição do disco em falha.
Não foi escopo deste artigo descrever o processo de configuração do array que merece um artigo dedicado para este tópico.
Referências:
Replacing A Failed Hard Drive In A Software RAID1 Array
mdadm: A New Tool For Linux Software RAID Management
https://www.sharktooth.de/doku.php/linux:clone_disc_partition
RAID
Recentemente ocorreu uma falha em um dos discos do meu servidor e decidi escrever este artigo mostrando como recuperar um disco em falha e reconstruir o array, garantindo assim a disponibilidade dos seus dados.
Primeiramente vamos confirmar que o disco está apresentando falha:
[root@matheus ~]# cat /proc/mdstat
Personalities : [raid1]
md0 : active raid1 sdb1[1]
511988 blocks super 1.0 [2/1] [_U]
md1 : active raid1 sdb2[1]
1953000316 blocks super 1.1 [2/1] [_U]
bitmap: 12/15 pages [48KB], 65536KB chunk
unused devices: <none>
Observe as linhas abaixo:
- md0 : active raid1 sdb1[1] : Indica que no device md0 consta apenas um disco que neste caso é o sdb1
- [_U]: indica que o primeiro disco está e falha
Mais algumas verificações:
[root@matheus ~]# mdadm --detail --scan
ARRAY /dev/md1 metadata=1.1 name=matheus:1 UUID=f06b9a90:9db3d324:1a57b3e5:43787f74
ARRAY /dev/md0 metadata=1.0 name=matheus:0 UUID=811a7ba7:90d91291:51670c8e:5d9cd124
[root@matheus ~]# mdadm -E /dev/sdb1
/dev/sdb1:
Magic : a92b4efc
Version : 1.0
Feature Map : 0x0
Array UUID : 811a7ba7:90d91291:51670c8e:5d9cd124
Name : matheus:0 (local to host matheus)
Creation Time : Mon Apr 30 10:11:50 2012
Raid Level : raid1
Raid Devices : 2
Avail Dev Size : 1023976 (500.07 MiB 524.28 MB)
Array Size : 511988 (500.07 MiB 524.28 MB)
Super Offset : 1023984 sectors
State : clean
Device UUID : 4706038e:51ec1645:372b8d1b:33cda9ee
Update Time : Thu Apr 18 23:18:37 2013
Checksum : b5512377 - correct
Events : 284
Device Role : Active device 1
Array State : .A ('A' == active, '.' == missing)
[root@matheus ~]# mdadm -E /dev/sdb2
/dev/sdb2:
Magic : a92b4efc
Version : 1.1
Feature Map : 0x1
Array UUID : f06b9a90:9db3d324:1a57b3e5:43787f74
Name : matheus:1 (local to host matheus)
Creation Time : Mon Apr 30 10:11:52 2012
Raid Level : raid1
Raid Devices : 2
Avail Dev Size : 3906000896 (1862.53 GiB 1999.87 GB)
Array Size : 1953000316 (1862.53 GiB 1999.87 GB)
Used Dev Size : 3906000632 (1862.53 GiB 1999.87 GB)
Data Offset : 2048 sectors
Super Offset : 0 sectors
State : active
Device UUID : 3ccc999c:d55dfbd9:9c586a47:a4204773
Internal Bitmap : 8 sectors from superblock
Update Time : Thu Apr 18 23:20:37 2013
Checksum : fef85fc1 - correct
Events : 636462
Device Role : Active device 1
Array State : .A ('A' == active, '.' == missing)
Observe a indicação abaixo indicando que existe um disco em falha:
Array State : .A ('A' == active, '.' == missing)
Uma vez identificado que o disco está em falha, podemos substituí-lo. No meu caso, o disco que do array que apresentou falha foi o /dev/sda.
Caso seu hard disk seja hot swap, devemos proceder conforme abaixo:
mdadm --manage /dev/md0 --fail /dev/sda1
mdadm --manage /dev/md0 --remove /dev/sda1
Proceda com a substituição do disco em falha. Após a substituição do mesmo, vamos confirmar através do comando abaixo:
[root@matheus ~]# fdisk -l
Disk /dev/sdb: 2000.4 GB, 2000398934016 bytes
255 heads, 63 sectors/track, 243201 cylinders
Units = cilindros of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disk identifier: 0x000dc87e
Dispositivo Boot Start End Blocks Id System
/dev/sdb1 * 1 64 512000 fd Detecção automática de RAID Linux
Partition 1 does not end on cylinder boundary.
/dev/sdb2 64 243202 1953001472 fd Detecção automática de RAID Linux
Disk /dev/sda: 2000.4 GB, 2000397852160 bytes
255 heads, 63 sectors/track, 243201 cylinders
Units = cilindros of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disk identifier: 0x00000000
O quadro acima foi alterado para refletir apenas os discos utilizados no array
Para que possamos iniciar a reconstrução do array utilizando o novo disco, é necessário que a tabela de partição do novo disco, seja igual a primeira pois os discos espelhados precisam ser iguais. Para gerenciar a tabela de partições podemos usar o comando sfdisk da seguinte forma:
Fazendo backup da tabela de partições (partition table)
sfdisk -d /dev/sda > sda.table
Para restaurar a tabela de partições
sfdisk /dev/sda < sda.table
Para clonar a tabela de partições.
Isso clonará a tabela de partições do disco sda no disco sdb. Neste processo não é feita nenhuma alteração no disco que está servindo como modelo (sda)
sfdisk -d /dev/sda | sfdisk /dev/sdb
No meu caso, o disco em falha é o sda, então teremos que clonar o a tabela de partições do disco sdb no disco sda.
Caso receba o erro abaixo:
[root@matheus ~]# sfdisk /dev/sda < sdb.table
Verificando se ninguém está usando este disco no momento...
OK
Disco /dev/sda: 243201 cilindros, 255 cabeças, 63 setores/trilha
/dev/sda: unrecognized partition table type
Situação antiga:
Nenhuma partição encontrada
Aviso: tamanho dado (3906002944) excede o tamanho máximo permitido (3906001007)
sfdisk: entrada inválida
[root@matheus ~]#
use --force no comando de escrita da tabela de partições no disco de destino
[root@matheus ~]# sfdisk -d /dev/sdb | sfdisk --force /dev/sda
Verificando se ninguém está usando este disco no momento...
OK
Disco /dev/sda: 243201 cilindros, 255 cabeças, 63 setores/trilha
/dev/sda: unrecognized partition table type
Situação antiga:
Nenhuma partição encontrada
Aviso: tamanho dado (3906002944) excede o tamanho máximo permitido (3906001007)
Situação nova:
Unidades = setores de 512 bytes, contando a partir de 0
Device Boot Start End #sectors Id System
/dev/sda1 * 2048 1026047 1024000 fd Detecção automática de RAID Linux
/dev/sda2 1026048 3907028991 3906002944 fd Detecção automática de RAID Linux
/dev/sda3 0 - 0 0 Vazia
/dev/sda4 0 - 0 0 Vazia
Aviso: a partição 2 se estende além do fim do disco
Nova tabela de partições gravada com sucesso
Relendo a tabela de partições...
Se você criou ou alterou uma partição DOS, por exemplo, /dev/foo7, use dd(1)
para zerar os primeiros 512 bytes: dd if=/dev/zero of=/dev/foo7 bs=512 count=1
(consulte fdisk(8)).
Verificando se a estrutura das partições estão iguais:
[root@matheus ~]# fdisk -l
Disk /dev/sdb: 2000.4 GB, 2000398934016 bytes
255 heads, 63 sectors/track, 243201 cylinders
Units = cilindros of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disk identifier: 0x000dc87e
Dispositivo Boot Start End Blocks Id System
/dev/sdb1 * 1 64 512000 fd Detecção automática de RAID Linux
Partition 1 does not end on cylinder boundary.
/dev/sdb2 64 243202 1953001472 fd Detecção automática de RAID Linux
Disk /dev/sda: 2000.4 GB, 2000397852160 bytes
255 heads, 63 sectors/track, 243201 cylinders
Units = cilindros of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disk identifier: 0x00000000
Dispositivo Boot Start End Blocks Id System
/dev/sda1 * 1 64 512000 fd Detecção automática de RAID Linux
Partition 1 does not end on cylinder boundary.
/dev/sda2 64 243202 1953001472 fd Detecção automática de RAID Linux
Observe que o disco sda agora está com as partições sda1 que será espelho a sdb1 no array /dev/md0 e a sda2 que será espelho da sdb2 no array em /dev/md1
Vamos adicionar as duas partições do novo disco aos dois arrays md0 e md1.
[root@matheus ~]# mdadm --manage /dev/md0 --add /dev/sda1
mdadm: added /dev/sda1
[root@matheus ~]# mdadm --manage /dev/md1 --add /dev/sda2
mdadm: added /dev/sda2
Após esta etapa, o array iniciará a sincronização do novo disco/partições conforme abaixo:
[root@matheus ~]# cat /proc/mdstat
Personalities : [raid1]
md0 : active raid1 sda1[2] sdb1[1]
511988 blocks super 1.0 [2/2] [UU]
md1 : active raid1 sda2[2] sdb2[1]
1953000316 blocks super 1.1 [2/1] [_U]
[>....................] recovery = 0.1% (2090048/1953000316) finish=420.0min speed=77409K/sec
bitmap: 12/15 pages [48KB], 65536KB chunk
unused devices: <none>
Observe que o array md0 já está sincronizado [UU] e o array md1 está sincronizando.
Após o tempo indicado obtemos os dois arrays sincronizados e os dados novamente estão protegidos.
[root@matheus ~]# cat /proc/mdstat
Personalities : [raid1]
md0 : active raid1 sda1[2] sdb1[1]
511988 blocks super 1.0 [2/2] [UU]
md1 : active raid1 sda2[2] sdb2[1]
1953000316 blocks super 1.1 [2/2] [UU]
bitmap: 1/15 pages [4KB], 65536KB chunk
unused devices: <none>
Por último, caso os arrays pertençam a discos botaveis, será necessário reinstalar o grub no novo disco, para que ele posso ser iniciado em caso de falha no outro disco.
[root@matheus ~]# grub-install /dev/sda
Installation finished. No error reported.
This is the contents of the device map /boot/grub/device.map.
Check if this is correct or not. If any of the lines is incorrect,
fix it and re-run the script `grub-install'.
# this device map was generated by anaconda
(hd0) /dev/sda
(hd1) /dev/sdb
Desta forma, voltamos a obter um nível satisfatório de segurança dos nossos dados, visto que estão armazenados em um array RAID 1. Vale ressaltar que todos os procedimentos acima foram testados e validados a fim de garantir que não haverá perca de dados do seu array durante o processo de substituição do disco em falha.
Não foi escopo deste artigo descrever o processo de configuração do array que merece um artigo dedicado para este tópico.
Referências:
Replacing A Failed Hard Drive In A Software RAID1 Array
mdadm: A New Tool For Linux Software RAID Management
https://www.sharktooth.de/doku.php/linux:clone_disc_partition
RAID
Comentários
EXCELENTE
Excelente
muito bom!
Muito bom!!!
Material legal
parabens
Ótimo Post
Rico em detalhes e de fácil execução.
Excelente post