Posso “atomicamente” trocar um drive raid5 em raid de software Linux?

2

Uma das unidades no meu array raid5 de 3 discos está começando a mostrar erros de leitura e avisos SMART. Não é suficiente para ser expulso da matriz (como defeituoso), mas afeta o desempenho e provavelmente irá piorar (pior). Eu obviamente quero substituir essa unidade.

Agora a questão é se eu rodar isso: (sdc é a unidade quebrada e sdd é a nova):

mdadm /dev/md0 -a /dev/sdd1 -f /dev/sdc1 -r /dev/sdc1

O Linux marcará primeiro o sdc1 como defeituoso, e nunca mais lerá novamente, e depois sincronizará o sdd1 de sda1 e sdb1 (os outros dois discos na matriz)?

Se sim, então estou vulnerável ao caso de haver um bloco ilegível (até mesmo um único!) em sda1 ou sdb1, e isso fará com que a reconstrução falhe.

O que eu quero fazer é que o sdd1 seja sincronizado como uma cópia do sdc1 antes de marcar o sdc1 como defeituoso. Então eu não vou estar em uma situação onde eu não tenho redundância (embora com uma faixa de redundância em um disco que muito bem possa dar erros de leitura).

Existe uma maneira de fazer isso online? Offline eu posso:

  • no array (mdadm - stop)
  • dd sdc1 para sdd1 (dd se = / dev / sdc1 de = / dev / sdd1)
  • tire sdc fisicamente
  • traz a matriz usando os dois antigos e o novo (mdadm -A -s)
  • resync

Bem, o problema com esse método é que na última etapa, se houver uma incompatibilidade, eu quero que o novo disco seja reescrito, e não a paridade (qualquer disco que esteja nessa faixa).

Portanto, "reconstrua o sdd1 como um novo sdc1, obtendo dados de sda1 e sdb1, mas se eles falharem, copie o que está no sdc1".

    
por Thomas 06.07.2009 / 23:30

4 respostas

5

Individualmente, esses comandos não farão o que você deseja.

mdadm /dev/md0 -a /dev/sdd1 
cat /proc/mdstat; #(you should now have a spare drive in raid5)
mdadm /dev/md0 -f /dev/sdc1
cat /proc/mdstat; #(you should now see a rebuild occuring to sdd1)

Um teste do comando real realmente faz com que uma reconstrução ocorra.

Infelizmente, não acredito que você possa fazer o que deseja agora.

Como um aparte, eu frequentemente faço referência ao wiki de raid linux , e experimento o que eu vejo lá usando arquivos de loopback.

dd if=/dev/zero of=loopbackfile.0 bs=1024k count=100
losetup /dev/loop0 loopbackfile.0

Isso fornece um arquivo de 100 meg que está disponível como / dev / loop0. Crie outro par deles, e você pode usar o mdadm (por exemplo, "mdadm --criar / dev / md0 --level = 5 --raid-devices = 3 / dev / loop0 / dev / loop1 / dev / loop2) sem afetar o real drives ou dados.

Nota Eu já havia dito que

mdadm /dev/md0 -a /dev/sdd1
mdadm --grow /dev/md0 --raid-disks=4

aumentaria seu array para um raid6. Isto é falso. Isto irá simplesmente adicionar um quarto disco ao seu array, o que não o coloca em uma posição melhor do que você está atualmente.

por 07.07.2009 / 01:59
5

Teste a invasão de software em uma sandbox!

Eu sugiro que você jogue dentro de um sandbox .
Como o mdadm pode trabalhar com arquivos de imagem e não apenas com arquivos de dispositivos como o Por exemplo: /dev/sda or /dev/mapper/vg00/lv_home - por que você não testa sua migração? dentro de um segundo softwarerraid em sua máquina:?)

Linux OS

Estou fazendo isso no debian / lenny e no bash:

# cat /etc/debian_version && uname -r && bash --version
5.0.2
2.6.26-2-amd64
GNU bash, version 3.2.39(1)-release (x86_64-pc-linux-gnu)
Copyright (C) 2007 Free Software Foundation, Inc.

Etapa 1

Como root crie diskimages de 4x128MB como este (você precisa de 512 MB de espaço livre em /)

sudo su 
mkdir -p ~/raidtest/{root,home} && cd ~/raidtest
for i in sd{a,b,c,d} ; do
  dd if=/dev/zero bs=128 count=1M of=$i
done

Vamos ver o que aconteceu:

# ls -hon --time-style=+
total 512M
drwxr-xr-x 2 0 4,0K  home
drwxr-xr-x 2 0 4,0K  root
-rw-r--r-- 1 0 128M  sda
-rw-r--r-- 1 0 128M  sdb
-rw-r--r-- 1 0 128M  sdc
-rw-r--r-- 1 0 128M  sdd

Etapa 2

particionando os arquivos

Eu criei 3 partições (20MB, 40MB e 56MB) para swap, / e / home em sda através de um dispositivo loop:

# losetup /dev/loop0 sda
# ! echo "n
p
1

+20M
t
fd
n
p
2

+40M
t
2
fd
n
p
3


t
3
fd
w" | fdisk /dev/loop0

Ok, veja o que aconteceu:

# fdisk -l /dev/loop0
    Disk /dev/loop0: 134 MB, 134217728 bytes
255 heads, 63 sectors/track, 16 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Disk identifier: 0xe90aaf21

      Device Boot      Start         End      Blocks   Id  System
/dev/loop0p1               1           3       24066   fd  Linux raid autodetect
/dev/loop0p2               4           9       48195   fd  Linux raid autodetect
/dev/loop0p3              10          16       56227+  fd  Linux raid autodetect

Copie este partitionscheme para fazer um loop {1,2,3} ^ = sd {b, c, d}

# losetup /dev/loop1 sdb
# sfdisk -d /dev/loop0 | sfdisk /dev/loop1
# losetup /dev/loop2 sdc
# sfdisk -d /dev/loop0 | sfdisk /dev/loop2
# losetup /dev/loop3 sda
# sfdisk -d /dev/loop0 | sfdisk /dev/loop3

Opcional: Se você instalou o parted, execute o partprobe nos dispositivos para atualizar a tabela de kernels

# partprobe /dev/loop0
# partprobe /dev/loop1
# partprobe /dev/loop2
# partprobe /dev/loop3

Etapa 3

Use o kpartx para criar os dispositivos por partição em /dev/mapper/

aptitude install kpartx dmsetup
# kpartx -av /dev/loop0
add map loop0p1 (254:3): 0 48132 linear /dev/loop0 63
add map loop0p2 (254:4): 0 96390 linear /dev/loop0 48195
add map loop0p3 (254:5): 0 112455 linear /dev/loop0 144585
# kpartx -av /dev/loop1
add map loop1p1 (254:6): 0 48132 linear /dev/loop1 63
add map loop1p2 (254:7): 0 96390 linear /dev/loop1 48195
add map loop1p3 (254:8): 0 112455 linear /dev/loop1 144585
# kpartx -av /dev/loop2
add map loop2p1 (254:9): 0 48132 linear /dev/loop2 63
add map loop2p2 (254:10): 0 96390 linear /dev/loop2 48195
add map loop2p3 (254:11): 0 112455 linear /dev/loop2 144585
# kpartx -av /dev/loop3
add map loop3p1 (254:12): 0 48132 linear /dev/loop3 63
add map loop3p2 (254:13): 0 96390 linear /dev/loop3 48195
add map loop3p3 (254:14): 0 112455 linear /dev/loop3 144585

Etapa 4

crie seu raid5 e assista ao status
Nós ainda somos raiz! Na minha estação de trabalho eu não uso raid, apenas LVM, então eu tem que carregar o módulo do kernel e instalar o pacote mdadm .

# modprobe raid5
# aptitude install mdadm
# cat /proc/mdstat
Personalities : [raid6] [raid5] [raid4]
unused devices: <none>

Eu uso md {10,11,12} para este teste. Cuidado, que eles não são usados em seu sistema (isso seria anormal)!
--force e -x 0 são usados, porque senão o mdadm coloca uma partição como sobressalente:

## the 20MB Partition
# mdadm --create --force -l 5 -n3 -x 0 /dev/md10 /dev/mapper/loop0p1 /dev/mapper/loop1p1 /dev/mapper/loop2p1
mdadm: array /dev/md10 started.
## the 40MB Partition
# mdadm --create --force -l 5 -n3 /dev/md11-x 0 /dev/mapper/loop0p2 /dev/mapper/loop1p2 /dev/mapper/loop2p2
mdadm: array /dev/md11 started.
## the 56MB Partition
# mdadm --create --force -l 5 -n3 /dev/md12-x 0 /dev/mapper/loop0p3 /dev/mapper/loop1p3 /dev/mapper/loop2p3
mdadm: array /dev/md12 started.

Como se parece agora:

# cat /proc/mdstat
Personalities : [raid6] [raid5] [raid4]
md12 : active raid5 dm-11[2] dm-8[1] dm-5[0]
      112256 blocks level 5, 64k chunk, algorithm 2 [3/3] [UUU]

md11 : active raid5 dm-10[2] dm-7[1] dm-4[0]
      96256 blocks level 5, 64k chunk, algorithm 2 [3/3] [UUU]

md10 : active raid5 dm-9[2] dm-6[1] dm-3[0]
      48000 blocks level 5, 64k chunk, algorithm 2 [3/3] [UUU]

unused devices: <none>

Info
a saída não é legal. mdstat mostra apenas dm-3 .. dm-11 , meaing /dev/mapper/loop*
mas ls -lsa /dev/disk/by-id mostra o mapeamento atual.

Minha saída no md10 começa com dm-9 (significando / dev / mapper / loop0p1), por causa dos testes que fiz ao escrever este artigo e meu LVM usa dm- {0,1,2}. Você também pode usar mdadm --examine --scan ou mais informações detalhadas por meio de mdadm -Q --detail /dev/md10 /dev/md11 /dev/md12

Etapa 5

Como root crie silenciosamente sistemas de arquivos e troque

# mkswap /dev/md10 > /dev/null 2>&1
# mke2fs -m0 -Lroot /dev/md11 -F > /dev/null 2>&1
# mke2fs -m0 -Lhome /dev/md12 -F > /dev/null 2>&1

Monte seus novos raids:

# swapon /dev/md10
# mount /dev/md11 root/
# mount /dev/md12 home/

Dê uma olhada na estrutura e se / dev / md10 é uma partição swap válida:
(minha estação de trabalho também usa / dev / mapper / vg00-swap, portanto, a maior prioridade)

# \tree
.
|-- home
|   '-- lost+found
|-- root
|   '-- lost+found
|-- sda
|-- sdb
|-- sdc
'-- sdd

# cat /proc/swaps
Filename                                Type            Size    Used    Priority
/dev/mapper/vg00-swap                   partition       9764856 53688   -1
/dev/md10                               partition       47992   0       -2

uau, muito trabalho para o sandbox - mas é bom quando você quer brincar com o mdadm - use-o!

Agora você tem um raid5 em execução e pode testar a migração
Eu acho que existem algumas excelentes respostas aqui - teste-as cuidadosamente em seu sistema!

Última etapa

Depois de terminar seus testes, desligue seus mds e exclua seu /dev/loop*

# mdadm --stop /dev/md10
# mdadm --stop /dev/md11
# mdadm --stop /dev/md12
# kpartx -dv /dev/loop0
# kpartx -dv /dev/loop1
# kpartx -dv /dev/loop2
# kpartx -dv /dev/loop3

trazendo-o novamente após uma reinicialização

sudo su
cd ~/raidtest
# connecting the files to /dev/loop*
losetup /dev/loop0 sda
losetup /dev/loop1 sdb
losetup /dev/loop2 sdc
losetup /dev/loop3 sdd

# access to the partions in /dev/loop*
kpartx -av /dev/loop0
kpartx -av /dev/loop1
kpartx -av /dev/loop2
kpartx -av /dev/loop3

# start the raid again
mdadm --assemble /dev/md10 /dev/mapper/loop0p1 /dev/mapper/loop1p1 /dev/mapper/loop2p1
mdadm --assemble /dev/md11 /dev/mapper/loop0p2 /dev/mapper/loop1p2 /dev/mapper/loop2p2
mdadm --assemble /dev/md12 /dev/mapper/loop0p3 /dev/mapper/loop1p3 /dev/mapper/loop2p3

# show active raids
cat /proc/mdstat

Após o teste: copie o partitiontable para / dev / sdd

Seus testes correram bem?
Ok, então você tem que copiar a partição de /dev/sda para /dev/sdd como fizemos no sandbox com nossos arquivos:

sfdisk -d /dev/sda | sfdisk /dev/sdd

Agora você pode adicionar /dev/sdd ao seu raid

Info
Se isso falhar, por causa de diferentes fornecedores / modelos de disco rígido, você tem que jogar com -uS (sectors), -uB (blocks), -uC (cylinders) or -uM (megabytes) - consulte man sfdisk !

Alguns dos meus raidcombos da vida real onde P-ATA < - > P-ATA, mas mesmo SCSCI < - > O P-ATA funciona bem, a menos que o tamanho dos novos dispositivos seja igual ou maior que os outros discos rígidos.
O Softwareraid é muito flexível!

Atualize seu /etc/mdadm/mdadm.conf

Se você tiver um /etc/mdadm/mdadm.conf , procure e atualize-o! O mdadm pode ajudá-lo a exibir a sintaxe correta:

mdadm --detail --scan

Boa sorte!

    
por 07.07.2009 / 07:06
0

Correndo o risco de afirmar o óbvio, não é o próximo passo para fazer um backup? Ou preferencialmente dois.

Minha experiência com a reconstrução do RAID5 é que há uma chance significativa de falha por qualquer motivo.

Se você estiver preocupado com o estado de sda1 ou sdb1, inicialize um CD de recuperação e verifique as unidades off-line.

    
por 06.07.2009 / 23:38
0

Não tenho certeza, mas acredito que seja possível com o Linux raid mudar de um RAID5 para um RAID6.

Se isso for possível, você poderá adicionar o dispositivo reserva e, se possível, alterná-lo para um RAID6, para que a paridade seja gerada novamente na nova unidade, além da unidade antiga. Quando a sincronização estiver concluída, puxe a unidade com falha e volte para um RAID5.

Eu sugiro strongmente que você faça um backup se você não tiver um. A questão que você precisa decidir, não é se você pode fazer um backup, a pergunta é, você será capaz de suportar a perda de seus dados, a perda do seu tempo, ou os milhares que você pode gastar em uma unidade serviço de recuperação.

    
por 07.07.2009 / 00:12

Tags