Вы можете переместить курсор на любую координату 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
перезаписать то, что там уже было.
TL; DR sh-> сектор - это количество секторов на физических дисках после начала раздела данных
Вот простая тестовая настройка, чтобы проиллюстрировать:
Теперь, чтобы начать, возьмите ненулевой блок и перезапишите его
# 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, на самом деле проще: это просто позиция, указанная в секторах, умноженных на 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. 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 должен быть более подробным об этих ошибках!