Instalar Linux num RAID de raiz

Para instalar o Slackware num sistema RAID logo de raiz, é necessário seguir os passos seguintes.

Na instalação, antes de fazer ‘setup’:

Criar as partições nos discos, de tamanho igual, como sendo do tipo RAID (tipo FD no fdisk, ou FD00 no gdisk).

Depois, criar o array de RAID. O exemplo seguinte é para um RAID 1.

mdadm –create /dev/md0 –level=1 –raid-devices=2 –metadata=0.90 /dev/sda2 /dev/sdb2

O parâmetro –metadata=0.90 é por causa do lilo, que precisa disto para discos RAID de arranque. Não aceita a versão metadata=1.2 (não sei se ainda tem esta limitação).

Depois, manda-se instalar o sistema em /dev/md0.


Caso surja algum erro e seja necessário parar o RAID, eis os comandos:

mdadm –stop /dev/md0


Outras operações que por vezes tenho que efetuar com os RAIDs:

Se for necessário renomear os RAIDs:
mdadm –stop /dev/md2
mdadm –assemble /dev/md0 /dev/sda3 /dev/sdc3

# Normalmente tenho que fazer o seguinte:

mdadm –stop /dev/md127
mdadm –assemble /dev/md3 /dev/sda1 /dev/sdb1

mdadm –stop /dev/md126
mdadm –assemble /dev/md2 /dev/sdg1 /dev/sdh1

# mas pode ser melhor dar um nome ao RAID passando um parâmetro –name=2 ou –name=3
# em princípio isto tem que ser feito logo na criação

# Depois de criar/modificar o RAID, deve-se reescrever o ficheiro /etc/mdadm.conf

cp /etc/mdadm.conf /etc/mdadm.conf.ori
echo ‘DEVICES /dev/sd[abcdefgh]1’ > /etc/mdadm.conf
mdadm –detail –scan >> /etc/mdadm.conf

Parar e reiniciar um RAID
mdadm –stop /dev/md3
mdadm –assemble /dev/md3 /dev/sdc1 /dev/sdd1

Substituir um disco RAID1 que falhou. Ver:
http://www.howtoforge.com/replacing_hard_disks_in_a_raid1_array

# Dizer que o disco falhou
mdadm –manage /dev/md3 –fail /dev/sdc1

# Remover o disco do RAID
mdadm –manage /dev/md3 –remove /dev/sdc1

# Adicionar disco ao RAID
mdadm –manage /dev/md3 –add /dev/sdc1

Converter o disco de sistema em RAID 1

Numa das máquinas, talvez a mais antiga, o disco de sistema (boot) não está em RAID. É a única onde isso acontece, e vou tentar convertê-lo hoje para RAID 1.

Li vários artigos na net@ – principalmente este – para ver se havia uma forma expedita de fazer isto, mas parece que tem mesmo que ser feito “à unha”. A solução que vou descrever abaixo é muito próxima da que imaginei a priori.

Arranjar um disco de tamanho igual ao do disco de boot.
Criar partições iguais.

No meu caso, o disco de boot tinha as partições seguintes:

Device Boot Start End Sectors Size Id Type
/dev/sda1 2048 4196351 4194304 2G 82 Linux swap
/dev/sda2 4196352 8390655 4194304 2G 82 Linux swap
/dev/sda3 8390656 488397167 480006512 228.9G 83 Linux

Com o fdisk, criei também duas partições de SWAP com 2GB cada e uma de Linux RAID, no disco novo:

Device Boot Start End Sectors Size Id Type
/dev/sdb1 2048 4196351 4194304 2G 82 Linux swap
/dev/sdb2 4196352 8390655 4194304 2G 82 Linux swap
/dev/sdb3 8390656 488397167 480006512 228.9G fd Linux raid autodetect

Adicionei as partições de SWAP ao fstab:

/dev/sdb1 swap swap defaults 0 0
/dev/sdb2 swap swap defaults 0 0

Para copiar a partição sda3 para a sdb3, desliguei a máquina, e arranquei com o DVD de instalação de uma versão recente do Slackware.

Depois, criei o array do RAID. De notar o atributo missing que indica que há um disco em falta, que irá ser adicionado mais tarde:

mdadm --create --metadata=0.90 /dev/md0 --level=1 --raid-devices=2 missing /dev/sdb3

O parâmetro --metadata=0.90 é necessário porque este volume vai ser um volume de arranque e o lilo precisa disso.

Para confirmar se o RAID foi bem criado, corri o comando cat /proc/mdstat

Personalities : [linear] [raid0] [raid1] [raid10] [raid6] [raid5] [raid4] [multipath]
md0 : active raid1 sdb3[1]
239871104 blocks super 1.2 [2/1] [_U]
bitmap: 0/2 pages [0KB], 65536KB chunk

Depois formatei o RAID:

mkfs.ext4 /dev/md0

E copiei os ficheiros

mount /dev/sda3 /mnt/d1
mount /dev/md0 /mnt/d2
cp -rp /mnt/d1/* /mnt/d2

Nota: experimentei várias outras formas de copiar os ficheiros, mas esta foi a única que funcionou. Tentei copiar a partição inteira (com dd), tentei também usar o rsync, mas não estava instalado no sistema base de instalação do Slackware.

Como a cópia pode demorar muito tempo, pode verificar-se o andamento da cópia, noutra janela de consola (CTRL+ALT+F2), onde é o process ID do comando cp:

cat /proc//io

No meu caso, para 176GB, demorou 1h26m.

Depois da cópia feita, é necessário preparar o RAID para o arranque.

cp /mnt/d2/etc/mdadm.conf /mnt/d2/etc/mdadm.conf.ori
echo 'DEVICES /dev/sd[abcdefgh]3' > /mnt/d2/etc/mdadm.conf
mdadm --detail --scan >> /mnt/d2/etc/mdadm.conf

No lilo.conf, tenho que colocar, no início:

boot = /dev/md0
raid-extra-boot="/dev/sda,/dev/sdb"

e, mais abaixo:

root = /dev/md0

Para isso:

vi /mnt/d2/etc/lilo.conf

Como o ficheiro /proc/partitions não existe no disco do RAID, porque só existe no disco do sistema ativo, mas como preciso dele para correr o lilo, faço o seguinte:

cp /proc/partitions /mnt/d2/proc

Depois, corri o lilo, com a opção -H, porque um dos discos do RAID não está ainda ativo.

chroot /mnt/d2
lilo -H
exit

No ficheiro /mnt/d2/etc/fstab corrigi o caminho para o boot:

/dev/md0 / ext4 defaults 1 1

Desliguei a máquina. Retirei o DVD. No arranque, pedi para arrancar com o disco novo, aquele onde está o RAID.

Confirmei que o sistema tinha arrancado com o disco novo, com o comando cat /proc/mdstat.

Com o comando fdisk /dev/sda transformei a partição /dev/sda3 em Linux RAID.
Depois, adicionei o disco /dev/sda3 ao RAID.

mdadm --manage /dev/md0 --add /dev/sda3

E depois executei o comnando cat /proc/mdstat para verificar o estado do RAID.

Personalities : [linear] [raid0] [raid1] [raid10] [raid6] [raid5] [raid4] [multipath]
md0 : active raid1 sda3[2] sdb3[1]
240003136 blocks [2/1] [_U]
[>....................] recovery = 0.3% (810240/240003136) finish=68.8min speed=57874K/sec

Aumentar o RAID

Tive que aumentar um RAID 1, de 2TB para 3TB, em Linux.

O RAID 1 era constituído pelos dispositivos /dev/sdc1 e /dev/sdd1, cada um com 1.922.599.672 bytes.
Constituiam o dispositivo /dev/md1.

Desliguei a máquina, retirei um dos discos – o /dev/sdc – e adicionei um disco de 3TB.

No arranque, o RAID não arrancou corretamente. Ao invés, arrancou como /dev/md127, como é usual sempre que há problemas. Tive que o parar com o comando

mdadm --stop /dev/md127

Entrei no fdisk, para criar uma partição no disco, e ele queixou-se de que não podia criar uma partição maior do que 2TB.


Device does not contain a recognized partition table.
The size of this disk is 2.7 TiB (3000592982016 bytes). DOS partition table format cannot be used on drives for volumes larger than 2199023255040 bytes for 512-byte sectors. Use GUID partition table format (GPT).

Estranhei aquela coisa da partição DOS, mas como já tinha tido um problema semelhante há 4 anos atrás, decidi usar o gdisk.

Com o gdisk criei uma partição de 3TB e defini-a como Linux RAID, com o código FD00, ao invés do FD do fdisk.

Depois de ter parado o RAID incompleto (mdadm --stop /dev/md127), tentei iniciar o novo RAID:

mdadm --assemble /dev/md1 /dev/sdc1 /dev/sdd1

mas a máquina queixou-se:

mdadm: /dev/sdc1 has no superblock - assembly aborted

Tive então que aplicar os comandos seguintes:

mdadm --zero-superblock /dev/sdc
mdadm --zero-superblock /dev/sdc1
mdadm --assemble --run /dev/md1 /dev/sdd1
mdadm --add /dev/md1 /dev/sdc1

Depois, para verificar que tudo estava OK, corri o comando seguinte, que me mostrou o RAID a ser construído:

cat /proc/mdstat

Personalities : [linear] [raid0] [raid1] [raid10] [raid6] [raid5] [raid4] [multipath]
md1 : active raid1 sdc1[2] sdd1[1]
1953382336 blocks super 1.2 [2/1] [_U]
[>....................] recovery = 0.0% (707264/1953382336) finish=184.0min speed=176816K/sec

———————

Quando o mdstat chegou a 100%, parei a máquina e fiz o mesmo para o /dev/sdd.
Após terminar, montei o RAID no sistema de ficheiros, usandp a informação do /etc/fstab:

mount -a

———————

Por fim, para estender o /dev/md1 para 3TB, executei os seguintes comandos

e2fsck -f /dev/md1
mdadm --grow /dev/md1 --size=2881959520
resize2fs /dev/md1

Note-se que o parâmetro size vem em kilobytes.

Falha no disco

Durante um upgrade de uma máquina virtual, o disco principal da máquina falhou. Como as máquinas – a correr em Oracle Virtual Machine – arrancam em modo headless, só percebo a falha porque a máquina não regista, os novos serviços instalados, no meu servidor de logs.

Entrei no VirtualBox, abri uma janela dessa máquina e vi a mensagem – que me aparece de tempos a tempos – a pedir CTRL-D para reboot, ou passwrod de root para manutenção. Introduzi a password e segui os passos indicados neste site para reparar o disco e recuperar a máquina. São os seguintes:

  • Entrar em modo monoutilizador: init 1
  • Desmontar o disco: umount /dev/sda2
  • Verificar o disco: fsck /dev/sda2

Depois, e uma vez que a máquina ainda nem arrancou, fazer reboot.