Substituir os discos de um sistema com RAID1 por discos de maior capacidade

Quem usa RAID1 normalmente é porque necessita manter os seus dados com mais alguma segurança. O RAID1 permite que um dos dois discos falhe sem que os dados se percam.

Hoje em dia com a demanda de multimédia que nos deparamos no nosso dia a dia sabemos que mais cedo ou mais tarde iremos encher os nossos discos. Principalmente a nível profissional onde não nos podemos dar ao luxo de destruir informação seja ela qual for. Hoje a informação é cada vez mais importante.

Então e quando o nosso RAID1 não poder guardar mais informação, devido ao facto de os discos não terem mais espaço livre para guarda-la? Neste artigo vou descrever como podemos substituir os discos do nosso RAID1, por discos de maior capacidade, sem que a informação seja destruída.

Este artigo parte do principio que já temos o nosso RAID1 em perfeito funcionamento!

Vamos lá ao trabalho!

Para sabermos informações sobre o nosso dispositivo RAID, corremos este comando que nos mostra com detalhe as informações que necessitamos:

# mdadm --detail /dev/md0
/dev/md0:
Version : 1.2
Creation Time : Sun Jul 27 18:16:13 2014
Raid Level : raid1
Array Size : 2095040 (2046.28 MiB 2145.32 MB)
Used Dev Size : 2095040 (2046.28 MiB 2145.32 MB)
Raid Devices : 2
Total Devices : 2
Persistence : Superblock is persistent

Update Time : Wed Jul 30 00:49:15 2014
State : clean
Active Devices : 2
Working Devices : 2
Failed Devices : 0
Spare Devices : 0

Name : localhost.localdomain:0
UUID : 9082e6c0:f34906bd:90e34efa:86b788d1
Events : 17

Number   Major   Minor   RaidDevice State
0       8       17        0      active sync   /dev/sdb11       8       33        1      active sync   /dev/sdc1

Como podemos ver pelas letras a vermelho que o meu RAID1 tem a capacidade de 2GB e que os discos usados são /dev/sdb e /dev/sdc.

Então e quanto ao espaço livre que este dispositivo tem? Bem neste exemplo está completamente vazio, ora vejamos:

# df -h
Sist.fichs               Tama  Ocup Livre Uso% Montado em
/dev/mapper/centos-root  6,7G  3,5G  3,3G  52% /
devtmpfs                 1,9G     0  1,9G   0% /dev
tmpfs                    1,9G   80K  1,9G   1% /dev/shm
tmpfs                    1,9G  8,7M  1,9G   1% /run
tmpfs                    1,9G     0  1,9G   0% /sys/fs/cgroup
/dev/md0                 2,0G  6,0M  1,9G   1% /data/dev/sda1                497M  118M  379M  24% /boot

Como podemos ver este dispositivo apenas está a utilizar 6M de 2GB.

Para que seja possível provar que depois de substituir os discos a informação está intacta, eu vou criar um ficheiro na directório /data que ocupe toda a partição. Depois irei criar um hash MD5 do ficheiro. Depois no final do artigo, quando já tivermos substituído os discos, irei fazer novamente um hash MD5 do ficheiro e comparar para confirmar que o ficheiro não sofreu alterações.

Para criar o ficheiro com dados aleatórios, que ocupe os 1,9GB livres em /data, eu vou usar o comando dd. Desta forma:

# dd if=/dev/urandom of=/data/ficheiro.test bs=1M count=1900
1900+0 registos dentro
1900+0 registos fora
1992294400 bytes (2,0 GB) copiados, 180,807 s, 11,0 MB/s

Agora voltamos a confirmar o espaço livre em data:

# df -h
Sist.fichs               Tama  Ocup Livre Uso% Montado em
/dev/mapper/centos-root  6,7G  3,5G  3,3G  52% /
devtmpfs                 1,9G     0  1,9G   0% /dev
tmpfs                    1,9G   92K  1,9G   1% /dev/shm
tmpfs                    1,9G  8,7M  1,9G   1% /run
tmpfs                    1,9G     0  1,9G   0% /sys/fs/cgroup
/dev/md0                 2,0G  1,9G     0 100% /data/dev/sda1                497M  118M  379M  24% /boot

Como podemos confirmar a vermelho a partição ficou sem espaço livre disponível.

Agora iremos criar o hash MD5 para mais tarde confirmarmos que os dados não sofreram qualquer mudança, assim:

# md5sum /data/ficheiro.test 
8cfd2a1f81e21967e44181e6def4ed6d  /data/ficheiro.test

Agora que temos em mão as informações que necessitamos para realizar esta operação já podemos dar inicio à troca dos discos.

Este processo tem de ser feito seguindo todos os passos que vou descrever e pela mesma ordem. Se não se sente à vontade com estes passes treine primeiro em uma maquina virtual.

Ora continuemos!

Como sabemos pelas informações recolhidas o nosso RAID usa os discos /dev/sdb /dev/sdc este processo não pode ser feito todo de uma só vez. Para já iremos trabalhar no primeiro disco do array /dev/sdb.

Para tal temos de informar o RAID que este dispositivo falhou. Para isso corremos o comando mdadm com os seguintes parâmetros:

# mdadm --manage /dev/md0 --fail /dev/sdb1
mdadm: set /dev/sdb1 faulty in /dev/md0

Agora temos de remover o disco do RAID1. Para isso corremos o comando mdadm com os seguintes parâmetros:

# mdadm --manage /dev/md0 --remove /dev/sdb1
mdadm: hot removed /dev/sdb1 from /dev/md0

Agora podemos confirmar o estado do RAID desta forma:

# mdadm --detail /dev/md0
/dev/md0:
        Version : 1.2
  Creation Time : Sun Jul 27 18:16:13 2014
     Raid Level : raid1
     Array Size : 2095040 (2046.28 MiB 2145.32 MB)
  Used Dev Size : 2095040 (2046.28 MiB 2145.32 MB)
   Raid Devices : 2
  Total Devices : 1
    Persistence : Superblock is persistent

    Update Time : Wed Jul 30 02:07:56 2014
          State : clean, degraded 
 Active Devices : 1
Working Devices : 1
 Failed Devices : 0
  Spare Devices : 0

           Name : localhost.localdomain:0
           UUID : 9082e6c0:f34906bd:90e34efa:86b788d1
         Events : 26

    Number   Major   Minor   RaidDevice State
       0       0        0        0      removed       1       8       33        1      active sync   /dev/sdc1

Como podemos confirmar o disco foi removido.

Neste momento temos de desligar a maquina e substituir o primeiro disco fisicamente por um de maior capacidade, apenas o primeiro disco. Depois iniciamos novamente a maquina. Para desligar a maquina corremos o comando poweroff :

# poweroff

Agora que já substituímos o primeiro disco e iniciamos a máquina, vamos ter de preparar o novo disco para junta-lo ao  RAID. A primeira coisa a fazer é formatar o disco com uma partição Linux raid autodetect. Para isso usamos o fdisk:

# fdisk /dev/sdb
Welcome to fdisk (util-linux 2.23.2).

Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.

Device does not contain a recognized partition table
Building a new DOS disklabel with disk identifier 0x55f0ea11.

Command (m for help): nPartition type:
   p   primary (0 primary, 0 extended, 4 free)
   e   extended
Select (default p): pPartition number (1-4, default 1): 1First sector (2048-16777215, default 2048): 
Using default value 2048
Last sector, +sectors or +size{K,M,G} (2048-16777215, default 16777215): 
Using default value 16777215
Partition 1 of type Linux and of size 8 GiB is set

Command (m for help): tSelected partition 1
Hex code (type L to list all codes): fdChanged type of partition 'Linux' to 'Linux raid autodetect'

Command (m for help): wThe partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks.

A vermelho estão os valores que escolhi para criar a partição.

Neste momento já temos o nosso novo disco formatado e pronto, agora vamos junta-lo ao RAID. Para isso voltamos a usar o comando mdadm com os seguintes parâmetros:

# mdadm --manage /dev/md0 --add /dev/sdb1
mdadm: added /dev/sdb1

Agora temos de esperar pela reconstrução do RAID, para sabermos o estado da reconstrução corremos:

# cat /proc/mdstat
Personalities : [raid1] 
md0 : active raid1 sdb1[2] sdc1[1]
      2095040 blocks super 1.2 [2/1] [_U]
      [============>........]  recovery = 64.4% (1350784/2095040) finish=1.0min speed=11288K/sec
      
unused devices: <none>

Como podemos ver o processo ainda não terminou, neste momento vai a 64,4%, vamos ter de esperar mais um pouco e executar o comando novamente. O processo de reconstrução poderá demorar bastante em discos de 4TB.

# cat /proc/mdstat
Personalities : [raid1] 
md0 : active raid1 sdb1[2] sdc1[1]
      2095040 blocks super 1.2 [2/2] [UU]
      
unused devices: <none>

Agora como podemos ver o processo terminou como podemos ver pelas letras a vermelho.

Agora iremos obrigar o segundo disco a falhar e remove-lo do RAID para substitui-lo por outro de maior capacidade.

Para tal temos de informar o RAID que este dispositivo falhou. Para isso corremos o comando mdadm com os seguintes parâmetros:

# mdadm --manage /dev/md0 --fail /dev/sdc1
mdadm: set /dev/sdc1 faulty in /dev/md0

Agora temos de remover o disco do RAID1. Para isso corremos o comando mdadm com os seguintes parâmetros:

# mdadm --manage /dev/md0 --remove /dev/sdc1
mdadm: hot removed /dev/sdc1 from /dev/md0

Agora podemos confirmar o estado do RAID desta forma:

# mdadm --detail /dev/md0
/dev/md0:
        Version : 1.2
  Creation Time : Sun Jul 27 18:16:13 2014
     Raid Level : raid1
     Array Size : 2095040 (2046.28 MiB 2145.32 MB)
  Used Dev Size : 2095040 (2046.28 MiB 2145.32 MB)
   Raid Devices : 2
  Total Devices : 1
    Persistence : Superblock is persistent

    Update Time : Wed Jul 30 02:36:03 2014
          State : clean, degraded 
 Active Devices : 1
Working Devices : 1
 Failed Devices : 0
  Spare Devices : 0

           Name : localhost.localdomain:0
           UUID : 9082e6c0:f34906bd:90e34efa:86b788d1
         Events : 50

    Number   Major   Minor   RaidDevice State
       2       8       17        0      active sync   /dev/sdb1
       1       0        0        1      removed

Como podemos confirmar o disco foi removido.

Neste momento temos de desligar a maquina e substituir o segundo disco fisicamente por um de maior capacidade, apenas o segundo disco. Depois iniciamos novamente a maquina. Para desligar a maquina corremos o comando poweroff :

# poweroff

Agora que já substituímos o segundo disco e iniciamos a máquina, vamos ter de preparar o novo disco para junta-lo ao  RAID. Podemos formatar este disco como fizemos com o primeiro ou copiar a tabela de partições do primeiro disco para o segundo. Eu vou copiar a tabela de partições da seguinte forma:

# sfdisk -d /dev/sdb | sfdisk --force /dev/sdc

Neste momento já temos o segundo disco formatado e pronto, agora vamos junta-lo ao RAID. Para isso voltamos a usar o comando mdadm com os seguintes parâmetros:

# mdadm --manage /dev/md0 --add /dev/sdc1
mdadm: added /dev/sdc1

Agora temos de esperar pela reconstrução do RAID, para sabermos o estado da reconstrução corremos:

# cat /proc/mdstat
Personalities : [raid1] 
md0 : active raid1 sdc1[3] sdb1[2]
      2095040 blocks super 1.2 [2/1] [U_]
      [====>................]  recovery = 23.3% (490368/2095040) finish=1.6min speed=15818K/sec
      
unused devices: <none>

Como podemos ver o processo ainda não terminou, neste momento vai a 23,3%, vamos ter de esperar mais um pouco e executar o comando novamente:

# cat /proc/mdstat
Personalities : [raid1] 
md0 : active raid1 sdc1[3] sdb1[2]
      2095040 blocks super 1.2 [2/2] [UU]
      
unused devices: <none>

Agora como podemos ver o processo terminou como podemos ver pelas letras a vermelho.

Neste momento já temos os nossos discos de maior capacidade no sistema, no meu caso tinha discos de 2GB e troquei por discos de 8GB. Mas vamos ver os detalhes do nosso RAID novamente:

# mdadm --detail /dev/md0
/dev/md0:
        Version : 1.2
  Creation Time : Sun Jul 27 18:16:13 2014
     Raid Level : raid1
     Array Size : 2095040 (2046.28 MiB 2145.32 MB)
  Used Dev Size : 2095040 (2046.28 MiB 2145.32 MB)
   Raid Devices : 2
  Total Devices : 2
    Persistence : Superblock is persistent

    Update Time : Wed Jul 30 02:49:13 2014
          State : clean 
 Active Devices : 2
Working Devices : 2
 Failed Devices : 0
  Spare Devices : 0

           Name : localhost.localdomain:0
           UUID : 9082e6c0:f34906bd:90e34efa:86b788d1
         Events : 83

    Number   Major   Minor   RaidDevice State
       2       8       17        0      active sync   /dev/sdb1
       3       8       33        1      active sync   /dev/sdc1

Como podemos ver a vermelho, o RAID apenas reconhece os 2GB que reconhecia antes da troca dos discos. Para este processo perigoso é necessário desmontar o RAID. Para isso usamos o seguinte comando:

# unmount /dev/md0

Agora vamos ter de informar o RAID para usar todo o espaço disponível nos discos. Para isso usamos o comando mdadm com os seguintes parâmetros:

# mdadm --grow /dev/md0 --size=max
mdadm: component size of /dev/md0 has been set to 8386560K

Como podemos ver a vermelho, o tamanho do dispositivo aumentou para 8386560K que são 8GB o tamanho dos meus novos discos.

Agora vamos verificar o sistema de ficheiros do dispositivo /dev/md0. Para isso usamos o comando fsck.ext4

# fsck.ext4 -f /dev/md0
e2fsck 1.42.9 (28-Dec-2013)
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information
/dev/md0: 12/131072 files (0.0% non-contiguous), 504365/523760 blocks

Agora vamos aumentar o sistema de ficheiros para ocupar os 8GB, toda a capacidade dos dispositivo md0. Para isso usamos o comando resize2fs:

# resize2fs /dev/md0
resize2fs 1.42.9 (28-Dec-2013)
Resizing the filesystem on /dev/md0 to 2096640 (4k) blocks.
The filesystem on /dev/md0 is now 2096640 blocks long.

Neste momento já finalizamos todo o processo de substituição dos discos bem como a sua reconfiguração.

Vamos então agora montar o dispositivo novamente. Para isso corremos o comando:

# mount /dev/md0 /data

Neste momento vamos confirmar a capacidade do dispositivo e o seu espaço livre. Para isso corremos o comando df novamente:

# df -h
Sist.fichs               Tama  Ocup Livre Uso% Montado em
/dev/mapper/centos-root  6,7G  3,5G  3,3G  52% /
devtmpfs                 1,9G     0  1,9G   0% /dev
tmpfs                    1,9G   80K  1,9G   1% /dev/shm
tmpfs                    1,9G  8,7M  1,9G   1% /run
tmpfs                    1,9G     0  1,9G   0% /sys/fs/cgroup
/dev/sda1                497M  118M  379M  24% /boot
/dev/md0                 7,9G  1,9G  5,6G  26% /data

E como podemos ver já faz uso da capacidade dos novos discos. O espaço ocupado é de 1,9GB, que é o ficheiro que criamos para provar que os dados não são corrompidos neste processo. Bem agora só nos falta mesmo verificar o ficheiro para ver se realmente não foi alterado. Para isso corremos novamente o comando md5sum:

# md5sum /data/ficheiro.test
8cfd2a1f81e21967e44181e6def4ed6d  /data/ficheiro.test

E como podemos confirmar o hash MD5 é igual ao primeiro que fizemos antes de todo o processo de substituição dos discos. Portanto prova que este processo realizado de forma correta, não afecta os dados já existentes no dispositivo RAID.

Espero que este artigo possa ajudar alguém. Pelo menos para mim servirá como apontamentos. Comentem, partilhem e dêem ideias para novos artigos!

 

Artigos Relacionados:

Deixe uma resposta