Восстановление аппаратного RAID5 с помощью «mdadm»

С подстановкой команды sed:

$ sed -En '/Zone/N; s/Zone ([A-Z]+).+ ([0-9]+).*/\1\n\2/p' file
A
500
B
600
C
400

Для покрытия случая «Имя зоны» + «Значение области»:

$ sed -En '/Zone/N;N; s/Zone ([A-Z]+).+ ([0-9]+) sq.*/\1\n\2/p' file
A
150
B
200
C
100
3
10.07.2020, 00:14
1 ответ

Обязательно проводите эксперименты в режиме -только для чтения:

Наивная попытка пере -создания макета RAID:

# mdadm --create /dev/md100 --assume-clean --metadata=0.90 --level=5 --chunk 256K --raid-devices=4 /dev/loop[0123]

Перезапись данных трассировки (данные = смещение в шестнадцатеричном формате):

# for ((i=0; 1; i+=16)); do printf "%015x\n" $i; done > /dev/md100
# hexdump -C /dev/md100
00000000  30 30 30 30 30 30 30 30  30 30 30 30 30 30 30 0a  |000000000000000.|
00000010  30 30 30 30 30 30 30 30  30 30 30 30 30 31 30 0a  |000000000000010.|
00000020  30 30 30 30 30 30 30 30  30 30 30 30 30 32 30 0a  |000000000000020.|
00000030  30 30 30 30 30 30 30 30  30 30 30 30 30 33 30 0a  |000000000000030.|

Где в этом макете расположены блоки?

# grep -ano $(printf "%015x" $((0 * 512*512))) /dev/loop[0123]
/dev/loop0:1:000000000000000 # Disk A 1
# grep -ano $(printf "%015x" $((1 * 512*512))) /dev/loop[0123]
/dev/loop1:1:000000000040000 # Disk B 2
# grep -ano $(printf "%015x" $((2 * 512*512))) /dev/loop[0123]
/dev/loop2:1:000000000080000 # Disk C 3
# grep -ano $(printf "%015x" $((3 * 512*512))) /dev/loop[0123]
/dev/loop3:16385:0000000000c0000 # Disk D 4
# grep -ano $(printf "%015x" $((4 * 512*512))) /dev/loop[0123]
/dev/loop0:16385:000000000100000 # Disk A 5

Это близко, но не совсем так, как показано на вашей картинке. Это проблема с макетами RAID, они могут быть достаточно похожими, они могут даже монтироваться, но затем показывать странные повреждения в файлах, поскольку всего несколько фрагментов в конечном итоге выходят из строя.

С mdadm, 4 -дисковой компоновкой RAID5 по умолчанию left-symmetric, если вы читаете первые 4 блока, они фактически считываются с 4 дисков. В вашем иллюстрированном макете он будет читать с 3 дисков, поскольку блок 4 снова находится на первом диске, а не на четвертом.

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

Давайте начнем с left-asymmetric.

# mdadm --create /dev/md100 --assume-clean --metadata=0.90 --level=5 --layout=left-asymmetric --chunk 256K --raid-devices=4 /dev/loop[0123]
# for ((i=0; 1; i+=16)); do printf "%015x\n" $i; done > /dev/md100
# mdadm --stop /dev/md100
# echo 3 > /proc/sys/vm/drop_caches
# for i in {0..23}; do grep -ano $(printf "%015x" $(($i * 512*512))) /dev/loop[0123]; done

Вывод (добавлены комментарии для лучшего понимания):

/dev/loop0:1:000000000000000 # Disk A 1
/dev/loop1:1:000000000040000 # Disk B 2
/dev/loop2:1:000000000080000 # Disk C 3
# skips parity loop3
/dev/loop0:16385:0000000000c0000 # Disk A 4
/dev/loop1:16385:000000000100000 # Disk B 5
# skips parity loop2
/dev/loop3:16385:000000000140000 # Disk D 6
/dev/loop0:32769:000000000180000 # Disk A 7
# skips parity loop1
/dev/loop2:32769:0000000001c0000 # Disk C 8
/dev/loop3:32769:000000000200000 # Disk D 9
# skips parity loop0
/dev/loop1:49153:000000000240000 # Disk B 10
/dev/loop2:49153:000000000280000 # Disk C 11
/dev/loop3:49153:0000000002c0000 # Disk D 12
/dev/loop0:65537:000000000300000 # Disk A 13
/dev/loop1:65537:000000000340000 # Disk B 14
/dev/loop2:65537:000000000380000 # Disc C 15
# skips parity loop3
/dev/loop0:81921:0000000003c0000 # Disk A 16
/dev/loop1:81921:000000000400000 # Disk B 17
# skips parity loop2
/dev/loop3:81921:000000000440000 # Disk D 18
/dev/loop0:98305:000000000480000 # Disk A 19
# skips parity loop1
/dev/loop2:98305:0000000004c0000 # Disk C 20
/dev/loop3:98305:000000000500000 # Disk D 21
# skips parity loop0
/dev/loop1:114689:000000000540000 # Disk B 22
/dev/loop2:114689:000000000580000 # Disk C 23
/dev/loop3:114689:0000000005c0000 # Disk D 24

Этот макет намного лучше соответствует вашей картинке. Может быть, это сработает. Удачи.

4
18.03.2021, 23:20

Теги

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