md raid5: преобразовать номера внутренних секторов MD в смещения

Вы можете переместить курсор на любую координату X,Y с помощью команды tput cup

например,

tput cup 10 3

переместит вас на строку 10, столбец 3 (координаты начинаются с 0,0 как левый верхний угол)

поэтому простой сценарий, такой как

clear
echo line 1
echo line 2
echo line 3
tput cup 1 5
echo another line
tput cup 10 0

приведет к выводу, подобному

line 1
line another line
line 3








$

(где $ - ваша подсказка).

Первая команда tput перемещает курсор назад к предыдущей строке, позволяя echo перезаписать то, что там уже было.

8
13.04.2017, 15:36
1 ответ

TL; DR sh-> сектор - это количество секторов на физических дисках после начала раздела данных


Настройка

Вот простая тестовая настройка, чтобы проиллюстрировать:

  • / dev / raidme / rd [0–3], устройства 2 ГБ
  • / dev / md127 создан как raid5 над этими 5, инициализирован как xfs и заполнен случайными данными

Теперь, чтобы начать, возьмите ненулевой блок и перезапишите его

# dd if=/dev/raidme/rd0 bs=1k count=1 skip=10240 | hexdump -C | head
...
# dd if=/dev/zero of=/dev/raidme/rd0 bs=1k count=1 seek=10240
...
# dd if=/dev/raidme/rd2 bs=1k count=1 skip=10240 | hexdump  -C | head
1024 bytes (1.0 kB, 1.0 KiB) copied, 8.6021e-05 s, 11.9 MB/s
00000000  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
00000400

Убедитесь, что кеш dm / md сбрасывается путем остановки / повторной сборки массива и проверяется:

# mdadm --stop /dev/md127
# mdadm --assemble /dev/md127 /dev/raidme/rd*
# echo check > /sys/class/block/md127/md/sync_action
# dmesg | tail
...
[ 1188.057900] md/raid:md127: check found mismatch at sector 16384

Блок на дисках

Хорошо, поэтому сначала давайте проверим, что 16384 совпадает с тем, что мы написали. У моего рейда есть полоса 512 КБ, поэтому я убедился, что написал что-то выровненное, чтобы было легко сопоставить, мы написали по адресу 1024 * 10240 , то есть 0xa00000 .

Ваш патч дает информацию 16384 , нужно помнить, что данные не начинаются с 0:

# mdadm -E /dev/raidme/rd0 | grep "Data Offset"
    Data Offset : 4096 sectors

Итак printf "% x \ n" $ ((( 4096 + 16384) * 512)) говорит, что это 0xa00000 . Хороший.


Блок в md

Теперь, чтобы получить, где это находится на конце md, на самом деле проще: это просто позиция, указанная в секторах, умноженных на number_of_stripes например, у меня 4 диска (3 + 1) так 3 полосы.

Здесь это означает 16384 * 3 * 512 например 0x1800000 . Я заполнил диск достаточно хорошо, так что это легко проверить, просто прочитав диск и ища 1k нулей:

# dd if=/dev/md127 bs=1M | hexdump -C | grep -C 3 '00 00 00 00 00 00'
... some false positives...
01800000  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
01800400  6b a8 9e e0 ad 88 a8 de  dd 2e 68 00 d8 7a a3 52  |k.........h..z.R|

Блок в xfs

Круто. Посмотрим, где это сейчас в xfs. 16384 * 3 равно 49152 (daddr принимает номер сектора):

# xfs_db -r /dev/md127
xfs_db> blockget -n
xfs_db> daddr 49152
xfs_db> blockuse -n
block 6144 (0/6144) type data inode 2052 d.1/f.1

Конечно, нули находятся в этом файле:

# dd if=/mnt/d.1/f.1 bs=1M | hexdump -C | grep -C 3 '00 00 00 00 00'
...
03680000  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
03680400  6b a8 9e e0 ad 88 a8 de  dd 2e 68 00 d8 7a a3 52  |k.........h..z.R|

Если мы перезапишем этот файл, нули исчезнут в / dev / raidme / rd0 также с правильным смещением (просто добавьте его в другой файл). Если вы снова напишете в / dev / raidme / rd0 (убедитесь, что вы снова остановили / запустили массив), то нули вернутся. Выглядит неплохо.

Есть еще одна проблема: если размер вашей полосы такой же большой, как у меня здесь (512 КБ), то у нас нет ни одного блока, но 1,5 МБ возможных данных повреждены ... Часто этого достаточно быть в одном файле, но вам нужно это проверить в xfs_db. Помните, что ранее индексный дескриптор был 2052.

xfs_db> inode 2052
xfs_db> bmap
data offset 0 startblock 256 (0/256) count 17536 flag 0
data offset 17536 startblock 122880 (0/122880) count 4992 flag 0
data offset 22528 startblock 91136 (0/91136) count 3072 flag 0

Размер блока здесь 4096 байт (см. xfs_info ), так что наши 1,5 МБ - это 384 блока. Наш поврежденный сегмент - это блоки с 6144 по 6528, то есть в пределах первого сегмента этого файла.

Что-то еще, на что следует обратить внимание, - это извлечь блоки вручную и проверить, где именно контрольные суммы не совпадают, что, надеюсь, даст вам 3 небольших фрагмента для просмотра.


Наконец, о вашем патче. Я сам не являюсь разработчиком MD, но как бывший пользователь mdadm raid5 мне было бы очень интересно. Я бы сказал, что определенно стоит приложить немного усилий. Упомянутая вами очистка может быть полезной, и я уверен, что у разработчиков будут некоторые комментарии после того, как вы отправите патч, но черт возьми, md должен быть более подробным об этих ошибках!

2
27.01.2020, 20:13

Теги

Похожие вопросы