Как восстановить разбитый массив Linux md RAID5?

17

Некоторое время назад у меня дома была система RAID5. Один из 4 дисков вышел из строя, но после извлечения и установки его снова все было в порядке, поэтому я начал повторную синхронизацию. Когда он закончился, к моему ужасу я понял, что 3 из 4 дисков вышли из строя. Однако я не верю, что это возможно. На дисках имеется несколько разделов, каждый из которых представляет собой отдельный массив RAID.

  • md0 - это массив RAID1, состоящий из sda1, sdb1, sdc1 и sdd1.
  • md1 - это массив RAID5, состоящий из sda2, sdb2, sdc2 и sdd2.
  • md2 - это массив RAID0, состоящий из sda3, sdb3, sdc3 и sdd3.

md0 и md2 сообщают обо всех дисках, в то время как md1 сообщает о сбое 3 (sdb2, sdc2, sdd2). Я понимаю, что когда выходят из строя жесткие диски, все разделы должны быть потеряны, а не только средние.

В этот момент я выключил компьютер и отключил диски. С тех пор я использовал этот компьютер с новым меньшим диском.

Есть ли надежда на восстановление данных? Могу ли я как-то убедить mdadm, что мои диски действительно работают? Единственный диск, который действительно может иметь проблему, это sdc, но этот тоже сообщается другими массивами.

Обновить

Наконец-то я получил возможность подключить старые диски и загрузить эту машину из SystemRescueCd. Все выше было написано по памяти. Теперь у меня есть некоторые точные данные. Вот выводmdadm --examine /dev/sd*2

/dev/sda2:
          Magic : a92b4efc
        Version : 0.90.00
           UUID : 53eb7711:5b290125:db4a62ac:7770c5ea
  Creation Time : Sun May 30 21:48:55 2010
     Raid Level : raid5
  Used Dev Size : 625064960 (596.11 GiB 640.07 GB)
     Array Size : 1875194880 (1788.33 GiB 1920.20 GB)
   Raid Devices : 4
  Total Devices : 4
Preferred Minor : 1

    Update Time : Mon Aug 23 11:40:48 2010
          State : clean
 Active Devices : 3
Working Devices : 4
 Failed Devices : 1
  Spare Devices : 1
       Checksum : 68b48835 - correct
         Events : 53204

         Layout : left-symmetric
     Chunk Size : 64K

      Number   Major   Minor   RaidDevice State
this     0       8        2        0      active sync   /dev/sda2

   0     0       8        2        0      active sync   /dev/sda2
   1     1       8       18        1      active sync   /dev/sdb2
   2     2       8       34        2      active sync   /dev/sdc2
   3     3       0        0        3      faulty removed
   4     4       8       50        4      spare   /dev/sdd2
/dev/sdb2:
          Magic : a92b4efc
        Version : 0.90.00
           UUID : 53eb7711:5b290125:db4a62ac:7770c5ea
  Creation Time : Sun May 30 21:48:55 2010
     Raid Level : raid5
  Used Dev Size : 625064960 (596.11 GiB 640.07 GB)
     Array Size : 1875194880 (1788.33 GiB 1920.20 GB)
   Raid Devices : 4
  Total Devices : 4
Preferred Minor : 1

    Update Time : Mon Aug 23 11:44:54 2010
          State : clean
 Active Devices : 2
Working Devices : 3
 Failed Devices : 1
  Spare Devices : 1
       Checksum : 68b4894a - correct
         Events : 53205

         Layout : left-symmetric
     Chunk Size : 64K

      Number   Major   Minor   RaidDevice State
this     1       8       18        1      active sync   /dev/sdb2

   0     0       0        0        0      removed
   1     1       8       18        1      active sync   /dev/sdb2
   2     2       8       34        2      active sync   /dev/sdc2
   3     3       0        0        3      faulty removed
   4     4       8       50        4      spare   /dev/sdd2
/dev/sdc2:
          Magic : a92b4efc
        Version : 0.90.00
           UUID : 53eb7711:5b290125:db4a62ac:7770c5ea
  Creation Time : Sun May 30 21:48:55 2010
     Raid Level : raid5
  Used Dev Size : 625064960 (596.11 GiB 640.07 GB)
     Array Size : 1875194880 (1788.33 GiB 1920.20 GB)
   Raid Devices : 4
  Total Devices : 4
Preferred Minor : 1

    Update Time : Mon Aug 23 11:44:54 2010
          State : clean
 Active Devices : 1
Working Devices : 2
 Failed Devices : 2
  Spare Devices : 1
       Checksum : 68b48975 - correct
         Events : 53210

         Layout : left-symmetric
     Chunk Size : 64K

      Number   Major   Minor   RaidDevice State
this     2       8       34        2      active sync   /dev/sdc2

   0     0       0        0        0      removed
   1     1       0        0        1      faulty removed
   2     2       8       34        2      active sync   /dev/sdc2
   3     3       0        0        3      faulty removed
   4     4       8       50        4      spare   /dev/sdd2
/dev/sdd2:
          Magic : a92b4efc
        Version : 0.90.00
           UUID : 53eb7711:5b290125:db4a62ac:7770c5ea
  Creation Time : Sun May 30 21:48:55 2010
     Raid Level : raid5
  Used Dev Size : 625064960 (596.11 GiB 640.07 GB)
     Array Size : 1875194880 (1788.33 GiB 1920.20 GB)
   Raid Devices : 4
  Total Devices : 4
Preferred Minor : 1

    Update Time : Mon Aug 23 11:44:54 2010
          State : clean
 Active Devices : 1
Working Devices : 2
 Failed Devices : 2
  Spare Devices : 1
       Checksum : 68b48983 - correct
         Events : 53210

         Layout : left-symmetric
     Chunk Size : 64K

      Number   Major   Minor   RaidDevice State
this     4       8       50        4      spare   /dev/sdd2

   0     0       0        0        0      removed
   1     1       0        0        1      faulty removed
   2     2       8       34        2      active sync   /dev/sdc2
   3     3       0        0        3      faulty removed
   4     4       8       50        4      spare   /dev/sdd2

Похоже, что все изменилось с момента последней загрузки. Если я правильно читаю, sda2, sdb2 и sdc2 работают и содержат синхронизированные данные, а sdd2 - запасной. Я отчетливо помню, как увидел 3 неисправных диска, но это хорошая новость. Но массив все еще не работает:

Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10] 
md125 : inactive sda2[0](S) sdb2[1](S) sdc2[2](S)
      1875194880 blocks

md126 : inactive sdd2[4](S)
      625064960 blocks

md127 : active raid1 sda1[0] sdd1[3] sdc1[2] sdb1[1]
      64128 blocks [4/4] [UUUU]

unused devices: <none>

Кажется, md0 переименован в md127. md125 и md126 очень странные. Они должны быть одним массивом, а не двумя. Это раньше называлось md1. MD2 полностью ушел, но это был мой обмен, поэтому мне все равно.

Я могу понять разные имена, и это не имеет значения. Но почему массив с 3-мя «активными синхронизирующими» дисками не читается? А что случилось с sdd2 в отдельном массиве?

Обновить

Я попробовал следующее после резервного копирования суперблоков:

root@sysresccd /root % mdadm --stop /dev/md125
mdadm: stopped /dev/md125
root@sysresccd /root % mdadm --stop /dev/md126
mdadm: stopped /dev/md126

Все идет нормально. Так как sdd2 запасной, я пока не хочу его добавлять.

root@sysresccd /root % mdadm --assemble /dev/md1 /dev/sd{a,b,c}2 missing 
mdadm: cannot open device missing: No such file or directory
mdadm: missing has no superblock - assembly aborted

Видимо, я не могу этого сделать.

root@sysresccd /root % mdadm --assemble /dev/md1 /dev/sd{a,b,c}2        
mdadm: /dev/md1 assembled from 1 drive - not enough to start the array.
root@sysresccd /root % cat /proc/mdstat 
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10] 
md1 : inactive sdc2[2](S) sdb2[1](S) sda2[0](S)
      1875194880 blocks

md127 : active raid1 sda1[0] sdd1[3] sdc1[2] sdb1[1]
      64128 blocks [4/4] [UUUU]

unused devices: <none>

Это тоже не сработало. Давайте попробуем со всеми дисками.

mdadm --stop /dev/md1
mdadm: stopped /dev/md1
root@sysresccd /root % mdadm --assemble /dev/md1 /dev/sd{a,b,c,d}2
mdadm: /dev/md1 assembled from 1 drive and 1 spare - not enough to start the array.
root@sysresccd /root % cat /proc/mdstat                           
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10] 
md1 : inactive sdc2[2](S) sdd2[4](S) sdb2[1](S) sda2[0](S)
      2500259840 blocks

md127 : active raid1 sda1[0] sdd1[3] sdc1[2] sdb1[1]
      64128 blocks [4/4] [UUUU]

unused devices: <none>

Неудачно. На основании этого ответа я планирую попробовать:

mdadm --create /dev/md1 --assume-clean --metadata=0.90 --bitmap=/root/bitmapfile --level=5 --raid-devices=4 /dev/sd{a,b,c}2 missing
mdadm --add /dev/md1 /dev/sdd2

Это безопасно?

Обновить

Я публикую сценарий суперблока парсера, который использовал для создания этой таблицы в своем комментарии. Может быть, кто-то найдет это полезным. Спасибо за вашу помощь.

stribika
источник
Я думаю, mdadm --re-addэто не то, что вы ищете. Вы недавно делали тест памяти? Есть ли у вас какие-либо сообщения журнала, связанные с ошибкой массива?
Жиль "ТАК - перестань быть злым"
@ Жиль: У меня нет журналов до аварии, так как они были сохранены в сбойном массиве. И я не думаю, что смогу это исправить с помощью стандартного интерфейса mdadm. Любая операция, которая включает повторную синхронизацию, невозможна с 1 из 4 дисков. Я думаю, что 3 "неисправных" диска содержат достаточно информации, чтобы восстановить все. Например, я могу прочитать их с помощью дд. «Хороший» может быть не синхронизирован. Я сделаю мем, но эта машина теперь отлично работает с новым диском.
стрибика
2
Вы пытались остановить массив и собрать новый с mdadm -A /dev/md1 /dev/sd{b,c,d}2(возможно --force)? (Если у вас нет, сначала сделайте резервную копию суперблоков.)
Жиль "ТАК - перестань быть злым"
@ Жиль: я обновил свой вопрос с актуальной информацией. Что мне нужно для резервного копирования точно? Первые несколько блоков дисков или есть специальный инструмент для этого?
стрибика
@stribika: Суперблок - это последний полный блок размером 64 КБ, выровненный по границе раздела размером 64 КБ. Я понятия не имею, как /dev/sdd2может быть в отдельном массиве, несмотря на тот же UUID, что и sd{a,b,c}2.
Жиль "ТАК - перестань быть злым"

Ответы:

12

Сначала проверьте диски, попробуйте запустить Smart Selftest

for i in a b c d; do
    smartctl -s on -t long /dev/sd$i
done

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

smartctl -l selftest /dev/sda

Если отчеты о состоянии диска не завершены из-за ошибок чтения, этот диск следует считать небезопасным для повторной сборки md1. После завершения самотестирования вы можете начать пытаться пересобрать массив. По желанию, если вы хотите быть особенно осторожным, перед продолжением переместите диски на другую машину (на случай плохого ram / controller / etc).

Недавно у меня был такой же случай. Один диск вышел из строя, я снова добавил в массив, но во время восстановления 3 из 4 дисков потерпели неудачу в целом. Содержимое / proc / mdadm было таким же, как у вас (возможно, не в том же порядке)

md1 : inactive sdc2[2](S) sdd2[4](S) sdb2[1](S) sda2[0](S)

Но мне повезло и собрал массив с этим

mdadm --assemble /dev/md1 --scan --force

Взглянув на предоставленный вами вывод --examine, я могу сказать, что произошел следующий сценарий: произошел сбой sdd2, вы удалили его и добавили заново, так что он стал резервным диском, пытающимся восстановить. Но во время восстановления sda2 не удалось, а затем sdb2 не удалось. Таким образом, счетчик событий больше в sdc2 и sdd2, которые являются последними активными дисками в массиве (хотя у sdd не было возможности восстановить, и поэтому он является наиболее устаревшим из всех). Из-за различий в счетчиках событий потребуется --force. Таким образом, вы также можете попробовать это

mdadm --assemble /dev/md1 /dev/sd[abc]2 --force

В заключение, я думаю, что если вышеприведенная команда завершится неудачно, вы должны попытаться воссоздать массив следующим образом:

mdadm --create /dev/md1 --assume-clean -l5 -n4 -c64 /dev/sd[abc]2 missing

Если вы сделаете это --create, missingчасть важна, не пытайтесь добавить четвертый диск в массив, потому что тогда начнется строительство, и вы потеряете свои данные . Создание массива с отсутствующим диском не изменит его содержимое, и у вас будет возможность получить копию в другом месте (raid5 не работает так же, как raid1).

Если это не в состоянии вывести массив, попробуйте это решение (скрипт perl) здесь Воссоздание массива

Если вам, наконец, удастся запустить массив, файловая система будет нечистой и, вероятно, поврежденной. Если во время перестроения произойдет сбой одного диска, ожидается, что массив остановится и остановится, не делая никаких записей на другие диски. В этом случае два диска вышли из строя, возможно, система выполняла запросы на запись, которые не удалось выполнить, поэтому есть небольшая вероятность того, что вы потеряли некоторые данные, но также вероятность того, что вы никогда этого не заметите :-)

редактировать: некоторые уточнения добавлены.

forcefsck
источник
mdadm --assemble /dev/md1 /dev/sd[abc]2 --forceработал. Спасибо. Вы сохранили мои данные! :) Я не буду пытаться добавить четвертый диск, потому что первые 3 не так хороши, как я думал ранее. Самотестирование показало, что у каждого есть 10-20 нечитаемых блоков. Я чувствую себя глупо, что не проверил это первым.
стрибика
Спасибо за исчерпывающий ответ. Награда 50 повторений от меня.
0xC0000022L
Permute_array.pl отлично работал для меня. Примечание для других пользователей: массив устройств, который он ожидает увидеть, включает в себя все диски, включая любые мертвые диски, которые вы могли удалить.
«Если вы выполните --create, пропущенная часть важна, не пытайтесь добавить четвертый диск в массив, потому что тогда начнется строительство, и вы потеряете ваши данные». - BS. Если вы указали --assume-clean(вы сделали), это не так.
Пой
1

Я испытывал много проблем во время использования mdadm, но никогда не терял данные. Вам следует избегать этого --forceварианта или использовать его очень осторожно, потому что вы можете потерять все свои данные. Пожалуйста, оставьте свой/etc/mdadm/mdadm.conf

Glendyr
источник