lost superblock in md raid

4

Problema no Red Hat Linux 5.

Devido a algumas falhas de comunicação, duas LUNs em nosso ambiente foram ampliadas de 1,2 TB para 1,7 TB.

Agora, após uma reinicialização, o mdadm não encontra os superblocos para construir o array novamente.

The common format — known as version 0.90 — has a superblock that is 4K long and is written into a 64K aligned block that starts at least 64K and less than 128K from the end of the device (i.e. to get the address of the superblock round the size of the device down to a multiple of 64K and then subtract 64K).

Encontrei alguma documentação antiga:

# mdadm -D /dev/md0
/dev/md0:
        Version : 0.90
  Creation Time : Tue Jul 10 17:45:00 2012
     Raid Level : raid1
     Array Size : 1289748416 (1230.00 GiB 1320.70 GB)
  Used Dev Size : 1289748416 (1230.00 GiB 1320.70 GB)
   Raid Devices : 2
  Total Devices : 2
Preferred Minor : 0
    Persistence : Superblock is persistent

    Update Time : Wed Apr 17 15:03:50 2013
         State : active
Active Devices : 2
Working Devices : 2
Failed Devices : 0
  Spare Devices : 0

           UUID : 2799bd51:67eb54d2:1fcd3c90:293311a1
         Events : 0.39

    Number   Major   Minor   RaidDevice State
       0     253       10        0      active sync   /dev/dm-10
       1     253       11        1      active sync   /dev/dm-11

# fdisk -l /dev/dm-10 /dev/dm-11

Disk /dev/dm-10: 1320.7 GB, 1320702443520 bytes
255 heads, 63 sectors/track, 160566 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

Disk /dev/dm-10 doesn't contain a valid partition table

Disk /dev/dm-11: 1320.7 GB, 1320702443520 bytes
255 heads, 63 sectors/track, 160566 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

Disk /dev/dm-11 doesn't contain a valid partition table
    
por ddeimeke 17.04.2013 / 17:50

3 respostas

2

A reversão dos dispositivos para o tamanho original deve apenas restaurar o dispositivo RAID.

Você pode confirmar isso fazendo:

losetup --sizelimit=$((1230*(2**30))) -r /dev/loop1 /dev/dm-10
mdadm -E /dev/loop1

mdadm deve agora encontrar o superbloco se o tamanho estiver correto. Então você pode redimensionar seus discos de volta para aquele tamanho ( -r acima é para somente leitura, então não causará nenhum dano).

Se você realmente deseja ampliar o array md0 e manter os metadados 0.9, uma coisa que você pode fazer é:

dmsetup create d1 --table "0 $((1230*(2**30)/512)) linear /dev/dm-10 0"
dmsetup create d2 --table "0 $((1230*(2**30)/512)) linear /dev/dm-11 0"

Mais uma vez,

mdadm -E /dev/mapper/d1

deve exibir o dispositivo de ataque.

Monte o array nesses dispositivos de mapeamento:

mdadm -A /dev/md0 /dev/mapper/d[12]

Em seguida, redimensione os dispositivos em toda a extensão:

dmsetup suspend d1
dmsetup suspend d2
dmsetup reload d1 --table "0 $(blockdev --getsize /dev/dm-10) linear /dev/dm-10 0"
dmsetup reload d2 --table "0 $(blockdev --getsize /dev/dm-11) linear /dev/dm-11 0"
dmsetup resume d1
dmsetup resume d2

Em seguida, você pode usar --grow para usar esse espaço extra:

mdadm /dev/md0 --grow --size max

Aguarde até que o espaço extra seja ressincronizado, pare a matriz, limpe os dispositivos extra dm e remonte nos dispositivos originais:

mdadm --stop /dev/md0
dmsetup remove d1
dmsetup remove d2
mdadm -A /dev/md0 /dev/dm-1[01]

Você pode usar dispositivos de loop para fazer testes de antemão para verificar o procedimento. Aqui está uma captura de tela do que fiz para verificar se funcionou:

~# truncate -s 1230G a
~# truncate -s 1230G b
~# losetup /dev/loop1 a
~# losetup /dev/loop2 b
~# lsblk /dev/loop[12]
NAME  MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
loop1   7:32   0   1.2T  0 loop
loop2   7:64   0   1.2T  0 loop
~# mdadm --create /dev/md0 --metadata 0.9 --level 1 --raid-devices 2 --assume-clean /dev/loop[12]
mdadm: array /dev/md0 started.
~# lsblk /dev/md0
NAME MAJ:MIN RM   SIZE RO TYPE  MOUNTPOINT
md0    9:0    0   1.2T  0 raid1
~# truncate -s 1700G a
~# truncate -s 1700G b
~# losetup -c /dev/loop1
~# losetup -c /dev/loop2
~# lsblk /dev/loop[12]
NAME  MAJ:MIN RM   SIZE RO TYPE  MOUNTPOINT
loop1   7:32   0   1.7T  0 loop
└─md0   9:0    0   1.2T  0 raid1
loop2   7:64   0   1.7T  0 loop
└─md0   9:0    0   1.2T  0 raid1
~# mdadm -E /dev/loop1
mdadm: No md superblock detected on /dev/loop1.
(1)~# mdadm --stop /dev/md0
mdadm: stopped /dev/md0
~# dmsetup create d1 --table "0 $((1230*(2**30)/512)) linear /dev/loop1 0"
~# dmsetup create d2 --table "0 $((1230*(2**30)/512)) linear /dev/loop2 0"
~# mdadm -A /dev/md0 /dev/mapper/d[12]
mdadm: /dev/md0 has been started with 2 drives.
~# lsblk /dev/mapper/d[12]
NAME       MAJ:MIN RM   SIZE RO TYPE  MOUNTPOINT
d1 (dm-19) 253:19   0   1.2T  0 dm
└─md0        9:0    0   1.2T  0 raid1
d2 (dm-20) 253:20   0   1.2T  0 dm
└─md0        9:0    0   1.2T  0 raid1
~# dmsetup suspend d1
~# dmsetup suspend d2
~# dmsetup reload d1 --table "0 $(blockdev --getsize /dev/loop1) linear /dev/loop1 0"
~# dmsetup reload d2 --table "0 $(blockdev --getsize /dev/loop2) linear /dev/loop2 0"
~# dmsetup resume d1
~# dmsetup resume d2
~# lsblk /dev/mapper/d[12]
NAME       MAJ:MIN RM   SIZE RO TYPE  MOUNTPOINT
d1 (dm-19) 253:19   0   1.7T  0 dm
└─md0        9:0    0   1.2T  0 raid1
d2 (dm-20) 253:20   0   1.7T  0 dm
└─md0        9:0    0   1.2T  0 raid1
~# mdadm /dev/md0 --grow --assume-clean --size max
mdadm: component size of /dev/md0 has been set to 1782579136K
~# lsblk /dev/md0
NAME MAJ:MIN RM   SIZE RO TYPE  MOUNTPOINT
md0    9:0    0   1.7T  0 raid1
~# cat /proc/mdstat
Personalities : [raid1]
md0 : active raid1 dm-19[0] dm-20[1]
      1782579136 blocks [2/2] [UU]

unused devices: <none>
~# mdadm --stop /dev/md0
mdadm: stopped /dev/md0
~# dmsetup remove d1
~# dmsetup remove d2
~# mdadm -A /dev/md0 /dev/loop[12]
mdadm: /dev/md0 has been started with 2 drives.
~# lsblk /dev/md0
NAME MAJ:MIN RM   SIZE RO TYPE  MOUNTPOINT
md0    9:0    0   1.7T  0 raid1
~# uname -rs
Linux 3.7-trunk-amd64
    
por 18.04.2013 / 00:04
6

Basta executar mdadm --build -l1 -n2 /dev/md0 /dev/dm-10 /dev/dm11 para recuperar seus dados.

Verifique se os dispositivos estão corretos (ou use os aliases do / dev / mapper) antes de fazer isso!

Além disso, se o seu kernel já usou (ou está usando) um desses dispositivos, os dados serão inconsistentes. Você deve configurar o segundo dispositivo como um array 1.2 degenerado, copiar os dados, começar a usar o novo RAID degenerado e adicionar o primeiro disco a ele. Se você não tiver um backup atual, faça um você saber o que fazer antes de tentar isso.

(De qualquer forma, mudar para o 1.2 é uma boa ideia, já que os superblocos de 1.2 RAID protegem contra esse tipo de problema.)

    
por 17.04.2013 / 18:34
4

Se for o RAID 1 com superbloco 0.90, você poderá montar diretamente sem usar a camada RAID. Os dados iniciam sem deslocamento no início do disco, portanto não deve haver nenhum problema. Use a opção de montagem somente leitura ou um dispositivo de loop somente leitura para o experimento por precaução.

Se isso funcionar, o método mais simples seria usar o outro disco para criar um novo RAID do zero (de preferência 1.2 metadados, o que evitaria esse problema e não sofreria um limite de 2 TB), copiar os dados, e, uma vez feito isso, adicione o disco do qual você copiou no novo RAID.

    
por 17.04.2013 / 19:14