1

Вопрос

После того, как на компонентном устройстве произошел неожиданный переворот, и после успешного repair raid6 на устройстве raid, как заставить mdadm синхронизировать изменения из буфера (?) вернуться на компонентное устройство?

А как следить, когда происходит такой ремонт?

Настройка

Для тестирования я выполнил следующую настройку (используя bash на 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

Неожиданный переворот

Тестовый сценарий предполагает, что некоторые биты на одном из компонентных устройств изменяются, когда устройство raid не работает.

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

Ремонт

Теперь снова запустите raid-устройство и попытайтесь убедить mdadm обнаружить и исправить неисправные биты на компонентном устройстве.

сборка и монтаж

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

это ожидается.

чтение неисправных секторов

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

к настоящему времени mdadm должен был обнаружить несоответствующую контрольную сумму, и большинством голосов определил, что /dev /loop1 неисправен. Но нигде нет предупреждений или ошибок об этом.

начать ремонт

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

Mdadm наверняка уже заметил ошибочные биты, но по какой-то причине не записал восстановленный кусок обратно на диск.

нужно остановить рейд устройства

кажется, что необходимо остановить устройство raid (что делает файловую систему временно недоступной!) для принудительной синхронизации восстановленного куска.

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

наконец, hexdump, наконец, снова показывает правильное «H». но нет ни указания на неисправный блок в dmesg или syslog, ни на mismatch_cnt.

0