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/sdb1 1 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): n Partition type: p primary (0 primary, 0 extended, 4 free) e extended Select (default p): p Partition number (1-4, default 1): 1 First 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): t Selected partition 1 Hex code (type L to list all codes): fd Changed type of partition 'Linux' to 'Linux raid autodetect' Command (m for help): w The 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!