login
Fri 09 of Jun, 2023 (04:16 UTC)

[root@madeira.eng.br ~]#

Linux - It is now safe to turn on your computer

atualizar cache imprimir

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:

[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

Reply to this comment

EXCELENTE

por , Thu 23 of Feb, 2017 (14:39 UTC)
este artigo sempre me ajudou. mas desta vez a sincronização não chega aos 100% e quando utilizo cat /proc/mdstat meu hd apare como spare. como posso coloca-lo como ativo? Muito obrigado... e-mail: lelecomb@gmail.com
Reply to this comment

Excelente

por , Mon 30 of Nov, 2015 (22:18 UTC)
Muito obrigado pela contribuição Frederico. Ajudou muito.
Reply to this comment

muito bom!

por Gleidson Galvão, Tue 26 of May, 2015 (18:34 UTC)
Parabens....excelente post.
Reply to this comment

Muito bom!!!

por Vinicius, Fri 04 of Jul, 2014 (12:22 UTC)
Muito bom!!!

Reply to this comment

Material legal

por Paulo Teodór, Fri 03 of May, 2013 (18:00 UTC)
muito bom o post
parabens
Reply to this comment

Ótimo Post

por Ronaldo Araujo, Thu 02 of May, 2013 (17:20 UTC)
Parabéns por compartilhar esse tipo de material.

Rico em detalhes e de fácil execução.
Reply to this comment

Excelente post

por Mulatinho, Wed 01 of May, 2013 (03:38 UTC)
Muita gente tem essa dúvida, quando passei por isso achei pouco material em português, valeu.