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?
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 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
Agora inicie o dispositivo RAID novamente e tente persuadir o mdadm a detectar e reparar os bits defeituosos no dispositivo componente.
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.
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.
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.
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.