Хорошо, что-то беспокоило меня по поводу вашей проблемы, поэтому я запустил виртуальную машину, чтобы погрузиться в поведение, которое следует ожидать. Я доберусь до того, что беспокоило меня через минуту; Сначала позвольте мне сказать это:
Сделайте резервную копию этих дисков, прежде чем пытаться что-либо !!
Возможно, вы уже нанесли ущерб сверх того, что сделал ресинк; Можете ли вы уточнить, что вы имели в виду, когда сказали:
В соответствии с предложениями я очистил суперблоки и заново создал массив с опцией --assume-clean, но безуспешно.
Если ты пробежал mdadm --misc --zero-superblock
, то у тебя все будет хорошо.
В любом случае, очистите несколько новых дисков и получите их точные текущие образы, прежде чем делать что-либо, что могло бы сделать больше для записи на эти диски.
dd if=/dev/sdd of=/path/to/store/sdd.img
При этом ... похоже, что данные, хранящиеся на этих вещах, шокирующе устойчивы к своенравной повторной синхронизации. Читайте дальше, есть надежда, и это может быть день, когда я достиг предела длины ответа.
Сценарий лучшего случая
Я собрал виртуальную машину, чтобы воссоздать ваш сценарий. Диски занимают всего 100 МБ, поэтому я не буду ждать вечно при каждой повторной синхронизации, но в противном случае это должно быть довольно точное представление.
Построил массив как можно более универсально и по умолчанию - 512 тыс. Блоков, левосимметричное расположение, диски в алфавитном порядке ... ничего особенного.
root@test:~# mdadm --create /dev/md0 --chunk=512 --level=5 --raid-devices=3 /dev/sdb1 /dev/sdc1 /dev/sdd1
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md0 started.
root@test:~# cat /proc/mdstat
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]
md0 : active raid5 sdd1[3] sdc1[1] sdb1[0]
203776 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/3] [UUU]
unused devices: <none>
Все идет нормально; давайте создадим файловую систему и поместим в нее некоторые данные.
root@test:~# mkfs.ext4 /dev/md0
mke2fs 1.41.14 (22-Dec-2010)
Filesystem label=
OS type: Linux
Block size=1024 (log=0)
Fragment size=1024 (log=0)
Stride=512 blocks, Stripe width=1024 blocks
51000 inodes, 203776 blocks
10188 blocks (5.00%) reserved for the super user
First data block=1
Maximum filesystem blocks=67371008
25 block groups
8192 blocks per group, 8192 fragments per group
2040 inodes per group
Superblock backups stored on blocks:
8193, 24577, 40961, 57345, 73729
Writing inode tables: done
Creating journal (4096 blocks): done
Writing superblocks and filesystem accounting information: done
This filesystem will be automatically checked every 30 mounts or
180 days, whichever comes first. Use tune2fs -c or -i to override.
root@test:~# mkdir /mnt/raid5
root@test:~# mount /dev/md0 /mnt/raid5
root@test:~# echo "data" > /mnt/raid5/datafile
root@test:~# dd if=/dev/urandom of=/mnt/raid5/randomdata count=10000
10000+0 records in
10000+0 records out
5120000 bytes (5.1 MB) copied, 0.706526 s, 7.2 MB/s
root@test:~# sha1sum /mnt/raid5/randomdata
847685a5d42524e5b1d5484452a649e854b59064 /mnt/raid5/randomdata
Хорошо. У нас есть файловая система и некоторые данные («данные» datafile
и 5 МБ случайных данных с этим хешем SHA1 randomdata
); давайте посмотрим, что произойдет, когда мы сделаем воссоздание.
root@test:~# umount /mnt/raid5
root@test:~# mdadm --stop /dev/md0
mdadm: stopped /dev/md0
root@test:~# cat /proc/mdstat
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]
unused devices: <none>
root@test:~# mdadm --create /dev/md1 --chunk=512 --level=5 --raid-devices=3 /dev/sdb1 /dev/sdc1 /dev/sdd1
mdadm: /dev/sdb1 appears to be part of a raid array:
level=raid5 devices=3 ctime=Sat Jan 7 21:07:06 2012
mdadm: /dev/sdc1 appears to be part of a raid array:
level=raid5 devices=3 ctime=Sat Jan 7 21:07:06 2012
mdadm: /dev/sdd1 appears to be part of a raid array:
level=raid5 devices=3 ctime=Sat Jan 7 21:07:06 2012
Continue creating array? y
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md1 started.
root@test:~# cat /proc/mdstat
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]
md1 : active raid5 sdd1[2] sdc1[1] sdb1[0]
203776 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/3] [UUU]
unused devices: <none>
Ресинхронизация очень быстро закончилась с этими крошечными дисками, но это произошло. Итак, вот что беспокоило меня раньше; ваш fdisk -l
вывод. Отсутствие таблицы разделов на md
устройстве вовсе не является проблемой, как ожидается. Ваша файловая система находится непосредственно на поддельном блочном устройстве без таблицы разделов.
root@test:~# fdisk -l
...
Disk /dev/md1: 208 MB, 208666624 bytes
2 heads, 4 sectors/track, 50944 cylinders, total 407552 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 524288 bytes / 1048576 bytes
Disk identifier: 0x00000000
Disk /dev/md1 doesn't contain a valid partition table
Да, нет таблицы разделов. Но...
root@test:~# fsck.ext4 /dev/md1
e2fsck 1.41.14 (22-Dec-2010)
/dev/md1: clean, 12/51000 files, 12085/203776 blocks
Совершенно допустимая файловая система, после повторной синхронизации. Так что это хорошо; давайте проверим наши файлы данных:
root@test:~# mount /dev/md1 /mnt/raid5/
root@test:~# cat /mnt/raid5/datafile
data
root@test:~# sha1sum /mnt/raid5/randomdata
847685a5d42524e5b1d5484452a649e854b59064 /mnt/raid5/randomdata
Твердый - нет повреждения данных на всех! Но это с точно такими же настройками, поэтому ничто не было сопоставлено по-разному между двумя группами RAID. Давайте бросим эту штуку, прежде чем попытаемся ее сломать.
root@test:~# umount /mnt/raid5
root@test:~# mdadm --stop /dev/md1
Делая шаг назад
Прежде чем мы попытаемся сломать это, давайте поговорим о том, почему это трудно сломать. RAID 5 работает с использованием блока контроля четности, который защищает область того же размера, что и блок на каждом другом диске в массиве. Четность не только на одном конкретном диске, она равномерно вращается вокруг дисков, чтобы лучше распределить нагрузку чтения между дисками при нормальной работе.
Операция XOR для вычисления четности выглядит следующим образом:
DISK1 DISK2 DISK3 DISK4 PARITY
1 0 1 1 = 1
0 0 1 1 = 0
1 1 1 1 = 0
Итак, паритет распределяется по дискам.
DISK1 DISK2 DISK3 DISK4 DISK5
DATA DATA DATA DATA PARITY
PARITY DATA DATA DATA DATA
DATA PARITY DATA DATA DATA
Повторная синхронизация обычно выполняется при замене поврежденного или отсутствующего диска; это также делается mdadm create
для того, чтобы данные на дисках совпадали с тем, как должна выглядеть геометрия RAID. В этом случае последний диск в спецификации массива является тем, который «синхронизируется» - все существующие данные на других дисках используются для синхронизации.
Итак, все данные на «новом» диске стираются и восстанавливаются; либо создание свежих блоков данных из блоков четности для того, что должно было быть там, либо создание новых блоков четности.
Что здорово, так это то, что процедура для обеих этих вещей одна и та же: операция XOR для данных с остальных дисков. Процесс повторной синхронизации в этом случае может иметь в своем макете, что определенный блок должен быть блоком контроля четности, и думать, что он создает новый блок контроля четности, тогда как фактически он воссоздает старый блок данных. Так что, даже если он думает, что строит это:
DISK1 DISK2 DISK3 DISK4 DISK5
PARITY DATA DATA DATA DATA
DATA PARITY DATA DATA DATA
DATA DATA PARITY DATA DATA
... это может быть просто восстановление DISK5
из макета выше.
Таким образом, данные могут оставаться согласованными, даже если массив построен неправильно.
Бросать обезьяну в творчестве
(не гаечный ключ; вся обезьяна)
Тест 1:
Давайте сделаем массив в неправильном порядке! sdc
тогда sdd
, тогда sdb
..
root@test:~# mdadm --create /dev/md1 --chunk=512 --level=5 --raid-devices=3 /dev/sdc1 /dev/sdd1 /dev/sdb1
mdadm: /dev/sdc1 appears to be part of a raid array:
level=raid5 devices=3 ctime=Sat Jan 7 23:06:34 2012
mdadm: /dev/sdd1 appears to be part of a raid array:
level=raid5 devices=3 ctime=Sat Jan 7 23:06:34 2012
mdadm: /dev/sdb1 appears to be part of a raid array:
level=raid5 devices=3 ctime=Sat Jan 7 23:06:34 2012
Continue creating array? y
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md1 started.
root@test:~# cat /proc/mdstat
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]
md1 : active raid5 sdb1[3] sdd1[1] sdc1[0]
203776 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/3] [UUU]
unused devices: <none>
Хорошо, это все хорошо. Есть ли у нас файловая система?
root@test:~# fsck.ext4 /dev/md1
e2fsck 1.41.14 (22-Dec-2010)
fsck.ext4: Superblock invalid, trying backup blocks...
fsck.ext4: Bad magic number in super-block while trying to open /dev/md1
The superblock could not be read or does not describe a correct ext2
filesystem. If the device is valid and it really contains an ext2
filesystem (and not swap or ufs or something else), then the superblock
is corrupt, and you might try running e2fsck with an alternate superblock:
e2fsck -b 8193 <device>
Нет! Почему это? Потому что, хотя все данные там, они в неправильном порядке; то, что когда-то составляло 512 КБ A, затем 512 КБ B, A, B и т. д., теперь было перетасовано в B, A, B, A. Диск теперь выглядит как бред для проверки файловой системы, он не будет работать. Вывод mdadm --misc -D /dev/md1
дает нам больше деталей; Это выглядит так:
Number Major Minor RaidDevice State
0 8 33 0 active sync /dev/sdc1
1 8 49 1 active sync /dev/sdd1
3 8 17 2 active sync /dev/sdb1
Когда это должно выглядеть так:
Number Major Minor RaidDevice State
0 8 17 0 active sync /dev/sdb1
1 8 33 1 active sync /dev/sdc1
3 8 49 2 active sync /dev/sdd1
Итак, это все хорошо. На этот раз мы перезаписали целую кучу блоков данных новыми блоками четности. Пересоздать, с правильным заказом сейчас:
root@test:~# mdadm --stop /dev/md1
mdadm: stopped /dev/md1
root@test:~# mdadm --create /dev/md1 --chunk=512 --level=5 --raid-devices=3 /dev/sdb1 /dev/sdc1 /dev/sdd1
mdadm: /dev/sdb1 appears to be part of a raid array:
level=raid5 devices=3 ctime=Sat Jan 7 23:11:08 2012
mdadm: /dev/sdc1 appears to be part of a raid array:
level=raid5 devices=3 ctime=Sat Jan 7 23:11:08 2012
mdadm: /dev/sdd1 appears to be part of a raid array:
level=raid5 devices=3 ctime=Sat Jan 7 23:11:08 2012
Continue creating array? y
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md1 started.
root@test:~# fsck.ext4 /dev/md1
e2fsck 1.41.14 (22-Dec-2010)
/dev/md1: clean, 12/51000 files, 12085/203776 blocks
Опрятно, там все еще есть файловая система! Все еще есть данные?
root@test:~# mount /dev/md1 /mnt/raid5/
root@test:~# cat /mnt/raid5/datafile
data
root@test:~# sha1sum /mnt/raid5/randomdata
847685a5d42524e5b1d5484452a649e854b59064 /mnt/raid5/randomdata
Успех!
Тест 2
Ладно, давайте изменим размер чанка и посмотрим, не получится ли это у нас.
root@test:~# umount /mnt/raid5
root@test:~# mdadm --stop /dev/md1
mdadm: stopped /dev/md1
root@test:~# mdadm --create /dev/md1 --chunk=64 --level=5 --raid-devices=3 /dev/sdb1 /dev/sdc1 /dev/sdd1
mdadm: /dev/sdb1 appears to be part of a raid array:
level=raid5 devices=3 ctime=Sat Jan 7 23:21:19 2012
mdadm: /dev/sdc1 appears to be part of a raid array:
level=raid5 devices=3 ctime=Sat Jan 7 23:21:19 2012
mdadm: /dev/sdd1 appears to be part of a raid array:
level=raid5 devices=3 ctime=Sat Jan 7 23:21:19 2012
Continue creating array? y
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md1 started.
root@test:~# fsck.ext4 /dev/md1
e2fsck 1.41.14 (22-Dec-2010)
fsck.ext4: Superblock invalid, trying backup blocks...
fsck.ext4: Bad magic number in super-block while trying to open /dev/md1
The superblock could not be read or does not describe a correct ext2
filesystem. If the device is valid and it really contains an ext2
filesystem (and not swap or ufs or something else), then the superblock
is corrupt, and you might try running e2fsck with an alternate superblock:
e2fsck -b 8193 <device>
Да, да, это шланг, когда настроен так. Но мы можем выздороветь?
root@test:~# mdadm --stop /dev/md1
mdadm: stopped /dev/md1
root@test:~# mdadm --create /dev/md1 --chunk=512 --level=5 --raid-devices=3 /dev/sdb1 /dev/sdc1 /dev/sdd1
mdadm: /dev/sdb1 appears to be part of a raid array:
level=raid5 devices=3 ctime=Sat Jan 7 23:21:51 2012
mdadm: /dev/sdc1 appears to be part of a raid array:
level=raid5 devices=3 ctime=Sat Jan 7 23:21:51 2012
mdadm: /dev/sdd1 appears to be part of a raid array:
level=raid5 devices=3 ctime=Sat Jan 7 23:21:51 2012
Continue creating array? y
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md1 started.
root@test:~# fsck.ext4 /dev/md1
e2fsck 1.41.14 (22-Dec-2010)
/dev/md1: clean, 12/51000 files, 12085/203776 blocks
root@test:~# mount /dev/md1 /mnt/raid5/
root@test:~# cat /mnt/raid5/datafile
data
root@test:~# sha1sum /mnt/raid5/randomdata
847685a5d42524e5b1d5484452a649e854b59064 /mnt/raid5/randomdata
Снова успех!
Тест 3
Это тот, который, я думал, убьет данные наверняка - давайте сделаем другой алгоритм компоновки!
root@test:~# umount /mnt/raid5
root@test:~# mdadm --stop /dev/md1
mdadm: stopped /dev/md1
root@test:~# mdadm --create /dev/md1 --chunk=512 --level=5 --layout=right-asymmetric --raid-devices=3 /dev/sdb1 /dev/sdc1 /dev/sdd1
mdadm: /dev/sdb1 appears to be part of a raid array:
level=raid5 devices=3 ctime=Sat Jan 7 23:32:34 2012
mdadm: /dev/sdc1 appears to be part of a raid array:
level=raid5 devices=3 ctime=Sat Jan 7 23:32:34 2012
mdadm: /dev/sdd1 appears to be part of a raid array:
level=raid5 devices=3 ctime=Sat Jan 7 23:32:34 2012
Continue creating array? y
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md1 started.
root@test:~# cat /proc/mdstat
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]
md1 : active raid5 sdd1[3] sdc1[1] sdb1[0]
203776 blocks super 1.2 level 5, 512k chunk, algorithm 1 [3/3] [UUU]
unused devices: <none>
root@test:~# fsck.ext4 /dev/md1
e2fsck 1.41.14 (22-Dec-2010)
fsck.ext4: Superblock invalid, trying backup blocks...
Superblock has an invalid journal (inode 8).
Страшно и плохо - думает, что нашел что-то и хочет исправить! Ctrl+ C!
Clear<y>? cancelled!
fsck.ext4: Illegal inode number while checking ext3 journal for /dev/md1
Хорошо, кризис предотвращен. Давайте посмотрим, остались ли данные нетронутыми после повторной синхронизации с неправильным макетом:
root@test:~# mdadm --stop /dev/md1
mdadm: stopped /dev/md1
root@test:~# mdadm --create /dev/md1 --chunk=512 --level=5 --raid-devices=3 /dev/sdb1 /dev/sdc1 /dev/sdd1
mdadm: /dev/sdb1 appears to be part of a raid array:
level=raid5 devices=3 ctime=Sat Jan 7 23:33:02 2012
mdadm: /dev/sdc1 appears to be part of a raid array:
level=raid5 devices=3 ctime=Sat Jan 7 23:33:02 2012
mdadm: /dev/sdd1 appears to be part of a raid array:
level=raid5 devices=3 ctime=Sat Jan 7 23:33:02 2012
Continue creating array? y
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md1 started.
root@test:~# fsck.ext4 /dev/md1
e2fsck 1.41.14 (22-Dec-2010)
/dev/md1: clean, 12/51000 files, 12085/203776 blocks
root@test:~# mount /dev/md1 /mnt/raid5/
root@test:~# cat /mnt/raid5/datafile
data
root@test:~# sha1sum /mnt/raid5/randomdata
847685a5d42524e5b1d5484452a649e854b59064 /mnt/raid5/randomdata
Успех!
Тест 4
Давайте также докажем, что обнуление суперблока не очень быстро:
root@test:~# umount /mnt/raid5
root@test:~# mdadm --stop /dev/md1
mdadm: stopped /dev/md1
root@test:~# mdadm --misc --zero-superblock /dev/sdb1 /dev/sdc1 /dev/sdd1
root@test:~# mdadm --create /dev/md1 --chunk=512 --level=5 --raid-devices=3 /dev/sdb1 /dev/sdc1 /dev/sdd1
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md1 started.
root@test:~# fsck.ext4 /dev/md1
e2fsck 1.41.14 (22-Dec-2010)
/dev/md1: clean, 12/51000 files, 12085/203776 blocks
root@test:~# mount /dev/md1 /mnt/raid5/
root@test:~# cat /mnt/raid5/datafile
data
root@test:~# sha1sum /mnt/raid5/randomdata
847685a5d42524e5b1d5484452a649e854b59064 /mnt/raid5/randomdata
Да, ничего страшного.
Тест 5
Давайте просто бросим все, что у нас есть на это. Все 4 предыдущих теста, вместе взятые.
- Неправильный порядок устройства
- Неправильный размер куска
- Неправильный алгоритм компоновки
- Обнуленные суперблоки (мы сделаем это между обоими творениями)
Вперед!
root@test:~# umount /mnt/raid5
root@test:~# mdadm --stop /dev/md1
mdadm: stopped /dev/md1
root@test:~# mdadm --misc --zero-superblock /dev/sdb1 /dev/sdc1 /dev/sdd1
root@test:~# mdadm --create /dev/md1 --chunk=64 --level=5 --raid-devices=3 --layout=right-symmetric /dev/sdc1 /dev/sdd1 /dev/sdb1
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md1 started.
root@test:~# cat /proc/mdstat
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]
md1 : active raid5 sdb1[3] sdd1[1] sdc1[0]
204672 blocks super 1.2 level 5, 64k chunk, algorithm 3 [3/3] [UUU]
unused devices: <none>
root@test:~# fsck.ext4 /dev/md1
e2fsck 1.41.14 (22-Dec-2010)
fsck.ext4: Superblock invalid, trying backup blocks...
fsck.ext4: Bad magic number in super-block while trying to open /dev/md1
The superblock could not be read or does not describe a correct ext2
filesystem. If the device is valid and it really contains an ext2
filesystem (and not swap or ufs or something else), then the superblock
is corrupt, and you might try running e2fsck with an alternate superblock:
e2fsck -b 8193 <device>
root@test:~# mdadm --stop /dev/md1
mdadm: stopped /dev/md1
Вердикт?
root@test:~# mdadm --misc --zero-superblock /dev/sdb1 /dev/sdc1 /dev/sdd1
root@test:~# mdadm --create /dev/md1 --chunk=512 --level=5 --raid-devices=3 /dev/sdb1 /dev/sdc1 /dev/sdd1
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md1 started.
root@test:~# cat /proc/mdstat
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]
md1 : active raid5 sdd1[3] sdc1[1] sdb1[0]
203776 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/3] [UUU]
unused devices: <none>
root@test:~# fsck.ext4 /dev/md1
e2fsck 1.41.14 (22-Dec-2010)
/dev/md1: clean, 13/51000 files, 17085/203776 blocks
root@test:~# mount /dev/md1 /mnt/raid5/
root@test:~# cat /mnt/raid5/datafile
data
root@test:~# sha1sum /mnt/raid5/randomdata
847685a5d42524e5b1d5484452a649e854b59064 /mnt/raid5/randomdata
Вау.
Таким образом, похоже, что ни одно из этих действий не повредило данные в любом случае. Откровенно говоря, я был весьма удивлен этим результатом; Я ожидал умеренных шансов потери данных при изменении размера чанка и некоторой определенной потери при изменении макета. Я кое-что узнал сегодня.
Итак ... Как я могу получить свои данные ??
Любая информация о старой системе будет чрезвычайно полезна для вас. Если вы знаете тип файловой системы, если у вас есть какие-либо старые копии /proc/mdstat
с информацией о порядке дисков, алгоритме, размере чанка и версии метаданных. У вас настроены почтовые оповещения mdadm? Если так, найдите старый; если нет, проверьте /var/spool/mail/root
. Проверьте ваш, ~/.bash_history
чтобы увидеть, если ваша оригинальная сборка там.
Итак, список вещей, которые вы должны сделать:
- Сделайте резервную копию дисков,
dd
прежде чем делать что-нибудь !!
- Попробуйте
fsck
текущий активный md - возможно, вы только что построили в том же порядке, что и раньше. Если вы знаете тип файловой системы, это полезно; использовать этот конкретный fsck
инструмент. Если какой-либо из инструментов предлагает что-то исправить, не позволяйте им, если вы не уверены, что они действительно нашли действительную файловую систему! Если кто-то fsck
предлагает что-то исправить для вас, не стесняйтесь оставить комментарий, чтобы спросить, действительно ли это помогает или просто собирает данные.
- Попробуйте построить массив с другими параметрами. Если у вас есть старый
/proc/mdstat
, то вы можете просто подражать тому, что он показывает; если нет, то вы как бы в неведении - пробовать все разные порядки дисков разумно, но проверка каждого возможного размера чанка с каждым возможным порядком бесполезна. Для каждого, fsck
чтобы увидеть, если вы получаете что-то многообещающее.
Так вот и все. Извините за роман, не стесняйтесь оставлять комментарии, если у вас есть какие-либо вопросы, и удачи!
сноска: до 22 тысяч знаков; 8к + стесняется ограничения по длине