como forçar o mdadm para sincronizar com o dispositivo após o reparo raid6 e como obter o número de erros?

1

A questão

Depois que um dispositivo de componente sofreu um inesperado desvio de bits, e após um raid6 repair foi executado com sucesso no dispositivo de ataque, como forçar o mdadm a sincronizar as alterações do buffer (?) de volta para o dispositivo de componentes? >

E como monitorar quando tal conserto acontece?

A configuração

Para fins de teste, fiz a seguinte configuração (usando o bash em um debian jessie):

sudo -i
mkdir testbed
cd testbed
for i in 1 2 3 4; do
    dd if=/dev/zero of=disk$i bs=1M count=4
    losetup loop$i disk$i
done
mdadm --create /dev/md/test --level=6 --raid-devices=4 /dev/loop{1,2,3,4}
mkfs.vfat /dev/md/test # Note: has easier hexdump than ext
mkdir mounted
mount /dev/md/test mounted
echo "Hello World!" > mounted/message

O inesperado bit-flip

O cenário de teste assume que alguns bit (s) em um dos dispositivos componentes mudam enquanto o dispositivo de ataque não está em execução.

umount mounted
mdadm --stop /dev/md/test
# Note: does show 'H' from 'Hello World!' at position 0x00107a00
hexdump -C /dev/loop1
# manipulate some bits in first component device at 0x00107a00
dd if=/dev/zero bs=1 count=1 seek=1079808 of=/dev/loop1
# Note: now changed to ".ello World!" at position 0x00107a00
hexdump -C /dev/loop1

O reparo

Agora inicie o dispositivo RAID novamente e tente persuadir o mdadm a detectar e reparar os bits defeituosos no dispositivo componente.

montagem e montagem

mdadm --assemble /dev/md/test /dev/loop{1,2,3,4}
mount /dev/md/test mounted
# dmesg does not show error
# hexdump still shows faulty bits

isso é esperado.

lendo os setores defeituosos

cat mounted/message # always reads the non-faulty message
# nothing in dmesg
# no raid6 related message in /var/log/syslog
# /sys/block/md127/md/mismatch_cnt == 0
# hexdump still shows faulty bits

até agora, o mdadm deve ter detectado a soma de verificação incompatível e, por maioria de votos, determinou que / dev / loop1 está com defeito. Mas não há aviso ou erro de contagem sobre isso em qualquer lugar.

iniciar reparo

echo repair > /sys/block/md127/md/sync_action
sync # should be completely unrelated for this question
# dmesg reports successful resync
# /var/log/syslog replicates the dmesg messages
# hexdump -C /dev/loop1 still shows faulty bits as 0x00107a00

O mdadm deve ter notado os bits defeituosos agora, mas por algum motivo não gravou o pedaço reparado no disco.

precisa parar o dispositivo de ataque

parece necessário parar o dispositivo de ataque (tornando assim o sistema de arquivos temporariamente indisponível!) para forçar a sincronização do pedaço reparado.

umount mounted
mdadm --stop /dev/md/test

finalmente, o hexdump finalmente mostra o correto 'H' novamente. mas nenhuma indicação de pedaço defeituoso em dmesg ou syslog nem mismatch_cnt.

    
por Max-Julian Pogner 28.05.2016 / 17:08

0 respostas