Как восстановить поврежденный массив IMSM raid5

nologinигнорируется для пользователя root. Таким образом, вы можете использовать SSH для подключения с правами root, но у вас, вероятно, есть дистрибутив, который по умолчанию не разрешает вход в систему root. Вы можете создать ключ SSH и поместить его в ~root/.ssh/authorized_keys, после чего вы сможете войти с этим ключом как root.

0
31.05.2021, 21:56
1 ответ

Эврика -Введение

Итак, я узнал, как снова получить доступ к своим данным. К сожалению, мне не удалось воссоздать массив с помощью mdadm. Проблема в том, что с IMSM я должен сначала создать контейнер. Но контейнер не принимает недостающие устройства. Мне понадобятся все мои оригинальные 6 жестких дисков, но на данный момент у меня только 5. Я также не могу использовать виртуальные жесткие диски, так как они должны быть подключены к RAID-контроллеру. Кроме того, я не уверен, что mdadmначнет синхронизировать диски, как только я создам том. Однако я нашел способ, который включает dmsetup. Я снова могу получить доступ ко всем своим файлам.

Выполняя несколько резервных копий дисков для работы с ними, я также понял, что один диск, который больше не является частью массива, иногда выходит из строя из-за ошибок ввода-вывода. Я все еще мог делать резервные копии, так как эти ошибки возникали только примерно при каждом третьем вызове dd. Я предполагаю, что как только произошла одна из ошибок ввода-вывода, IMSM, вероятно, выкинул диск из массива, и все его метаданные были удалены.

Я также понял, что этот диск был первым в массиве. Поскольку у меня есть таблица GPT и поскольку данные массива начинаются с первого сектора, также логично, что он начинается с MBR. Таким образом, суперсектор диска не был перезаписан MBR. Он всегда был там.

Чтение данных

Здесь я пытаюсь дать пошаговое решение, объясняющее все команды, используемые в процессе. Надеюсь, это поможет кому-то там.

(Дополнительно )Сделайте резервную копию всех дисков

В этом нет строгой необходимости. Тем более, что позже мы будем использовать петлевые устройства -только для чтения. Однако я особенно параноик после серьезного сбоя моего решения для хранения. Поэтому я стараюсь максимально избегать использования фактических данных.Кроме того, использование файлов резервных копий показывает, что этот метод вообще не требует оригинальных жестких дисков или BIOS. Все, что вам нужно, это образ dd. Если вы пропускаете этот раздел, убедитесь, что устройства петли в следующем разделе действительно созданы только для чтения -, иначе вы рискуете, что ваши данные станут еще хуже и могут быть потеряны навсегда.

Тем не менее, вот команда для резервного копирования жесткого диска. Возможно, вы уже знакомы с dd. Но если вы не запустите эту команду для каждого жесткого диска, который является частью вашего массива:

# dd if=/dev/sdX of=/path/to/backups/sdX.img status=progress
# dd if=/dev/sdY of=/path/to/backups/sdY.img status=progress
# [...]

Входной файл if=/dev/sdX— ваш жесткий диск. Замените sdXна sda, sdbи т. д. Выходной файл of=/path/to/backups/sdX.imgуказывает на изображение, которое должно быть записано. Снова замените sdXсоответствующим образом. status=progressпросто говорит версии GNU dd печатать текущий прогресс в stderr.

Создать кольцевые устройства

Далее мы создадим петлевые устройства. Если мы используем резервные копии, это гарантирует, что они будут распознаны как блочные файлы. Хотя это может и не понадобиться. Но в любом случае это гарантирует, что изображение будет только прочитано, поскольку мы используем флаг -только для чтения -r

.
# losetup --show -rf /path/to/backups/sdX.img
# losetup --show -rf /path/to/backups/sdY.img
[...]
  • -r:только читать из файла, не записывать в него
  • -f:использовать следующий доступный номер для кольцевого устройства, чтобы нам не приходилось угадывать его самостоятельно.
  • --show:напечатать имя, которое -fдействительно выбрало. Обычно это весьма полезно. Хотя мы все равно печатаем эти значения на следующем шаге.

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

# losetup -a
/dev/loop1: [2129]:251265027 (/path/to/backups/sdX.img)
/dev/loop2: [2129]:251265027 (/path/to/backups/sdY.img)
[...]

Постарайтесь запомнить, какое петлевое устройство относится к какому изображению.

Сбор некоторых метаданных

Далее нам нужно узнать некоторую информацию о RAID. В частности, нам нужно выяснить, с какого сектора начинается RAID (, особенно в случае матричного RAID ), сколько секторов он охватывает,каков размер и расположение его фрагментов и в каком порядке диски были добавлены в массив.

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

# mdadm --examine /dev/sdX
/dev/sdX:
          Magic : Intel Raid ISM Cfg Sig.
        Version : 1.3.00
    Orig Family : aa0b2c12
         Family : 48d867fb
     Generation : 0018f99c
     Attributes : All supported
           UUID : 0312fa14:fa8db3c2:2a76dc3f:299ed5b4
       Checksum : 084869b8 correct
    MPB Sectors : 6
          Disks : 6
   RAID Devices : 1

  Disk02 Serial : S21PNSBG710576N
          State : active
             Id : 00000000
    Usable Size : 488391936 (232.88 GiB 250.06 GB)

Bad Block Management Log:
       Log Size : 2040
      Signature : abadb10c
    Entry Count : 254

[NameOfYourArray]:
           UUID : 24b1e785:14f37ee5:41f6a4ab:d8b89e11
     RAID Level : 5
        Members : 6
          Slots : [__UUUU]
    Failed disk : 1
      This Slot : 2
    Sector Size : 512
     Array Size : 2441959424 (1164.42 GiB 1250.28 GB)
   Per Dev Size : 488392200 (232.88 GiB 250.06 GB)
  Sector Offset : 0
    Num Stripes : 7631124
     Chunk Size : 32 KiB
       Reserved : 0
  Migrate State : idle
      Map State : failed
    Dirty State : clean
     RWH Policy : off

Вывод продолжается, но остальное можно игнорировать. Вывод, показанный выше, дает следующую ценную информацию:

Sector Offset : 0       # Where the data starts
                        # (right at the first sector in my case)
Array Size : 2441959424 # Size of the volume (data) inside the array
Chunk Size : 32 KiB     # Size of a single chunk

Вы даже можете определить, где в вашем массиве находится этот конкретный диск.

This Slot : 2

Это означает, что это третий диск в массиве. (Номер слота начинается с нуля. )В качестве альтернативы Disk## Serial : [...]также намекает на номер слота:

Disk02 Serial : S21PNSBG710576N

Запустите эту команду для всех дисков. Для тех, которые по-прежнему дают действительные результаты, обратите внимание на номер слота.

Есть еще один трюк, который можно использовать для определения первого диска в массиве. Поскольку RAID записывается кусками, а не байтами, первые 32 КБ находятся на первом диске. Вторые 32 КБ на втором диске и так далее. Это означает, что на первом диске должно быть достаточно секторов, содержащих начало вашей таблицы разделов. Это означает, что в начале должен быть MBR (, даже если вы используете GPT, поскольку он начинается с защитной MBR ). mdadm --examineуже сообщает вам, что он нашел MBR, хотя метаданных нет. Но вы также можете использовать fdisk -l.

В моем случае я смог узнать номера слотов четырех дисков через их метаданные. Мне повезло, что пятый диск содержал MBR, поэтому я автоматически знал, что это первый. Для запуска массива достаточно 5 из 6 дисков. Если вы не знаете точные номера слотов достаточного количества дисков, вы можете попробовать использовать разные перестановки, пока этот метод не сработает.

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

Слот Привод Петлевое устройство
МБР (0)/dev/sdb /dev/loop2
1 отсутствует -
2 /dev/sda /dev/loop1
3 /dev/sdc /dev/loop3
4 /dev/sde /dev/loop5
5 /dev/sdd /dev/loop4

Последнее, что нужно выяснить, это макет. К сожалению, mdadmне дает нам никакой информации об этом. Однако, когда мы смотрим на определения Intel RAID , создается впечатление, что структура RAID 5 всегда остается асимметричной. Я не уверен, что массивы IMSM можно настроить с другой компоновкой, но мне это кажется маловероятным. Если все это не работает для вас, вы можете попробовать другие макеты. Посмотрите в исходном коде , чтобы узнать больше о других макетах.

Ниже представлен обзор всех уровней RAID, поддерживаемых IMSM. Ключевое слово dmsetup используется в следующей главе.

Уровень RAID Макет Синтаксис dmsetup
0 Н/Д рейд0
1 Н/Д рейд1
5 асимметричный слева рейд5 _ла
10 по умолчанию (нет 1E или копирование)рейд10

Если вы не можете собрать какие-либо метаданные ни с одного диска, вам придется угадывать значения и/или пробовать разные комбинации. В качестве справки приведены различные режимы, которые поддерживает IMSM :

.
Информация Возможные значения
Уровни RAID 0, 1, 5, 10
Размеры блоков 4 КБ, 8 КБ, 16 КБ, 32 КБ, 64 КБ, 128 КБ

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

blockdev --getsize /dev/sdX

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

Сборка массива с помощью dmsetup

К сожалению, при использовании mdadmнет возможности предоставить метаданные вручную. Единственным исключением являются уровни RAID 0 и 1, где вы можете использовать--build:

mdadm --build /dev/md0 --raid-devices=2 --level=0 --chunk=32 /dev/loop0 /dev/loop1

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

Но сначала нам нужно поговорить о числах. Как мы определили ранее, размер чанка в моем случае был 32 КБ. Однако dmsetupтребует секторов. Почти во всех случаях один сектор равен 512 байтам. Если вы хотите быть в безопасности, вы можете проверить размер сектора с помощью blockdev --getss /dev/sdX. В моем случае это означает 32 kiB / (512 bytes/sector) = 64 sectors. Мы уже знаем размер данных в массиве в секторах (т.е. 2441959424). Но существует проблема. У меня 6 устройств. С одним блоком четности на полосу количество блоков должно быть кратно 5. Но количество секторов не делится на 5. В моем случае оно как минимум кратно количеству секторов в блоке. Но я даже не уверен, что это гарантировано. Похоже, что данные останавливаются на полпути через последнюю полосу. К сожалению, dmsetup этого не допустит. Это означает, что нам нужно округлить до ближайшего целого числа, которое делится на 5 дисков и на 64 сектора (скорректировать эти числа в соответствии с вашей ситуацией ). В моем случае это :2441959680. Это будет означать, что fdiskможет жаловаться на неправильный размер диска и отсутствие резервной таблицы. Но мы можем исправить это, обрезав образ dd.

Теперь создайте файл (, например.table.txt)который будет содержать одну строку для одного раздела.

<start> <size> raid <raid layout> 2 <chunk size> nosync <num devices>[ - /dev/loopN|-]*num_devices

Сначала вы должны указать начало и размер в секторах. Следующий аргумент говорит о том, что это RAID. Схему RAID см. в таблице в предыдущем разделе. «2» в следующем аргументе означает два специальных параметра для RAID. Во-первых, это размер куска. Второй предотвратит любую синхронизацию.После этого вы должны описать свои диски, сначала указав количество устройств, а затем указав пару метаданных и путь к устройству для каждого устройства. Поскольку мы не хотим предоставлять какие-либо метаданные, мы используем тире, чтобы указать это. Если устройство отсутствует, мы пишем два тире, указывающие на то, что ни метаданные, ни устройство недоступны. Желательно исключить хотя бы одно устройство, если это позволяет уровень RAID. Если вы уже подозреваете, что один диск может содержать ошибочные данные, выберите его.

Напр. в моем случае файл выглядит так. Обратите внимание, что второе устройство отсутствует.

0 2441959680 raid raid5_la 2 64 nosync 6 - /dev/loop2 - - - /dev/loop1 - /dev/loop3 - /dev/loop5 - /dev/loop4

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

# dmsetup create sdr /path/to/table.txt

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

# dmsetup remove sdr

Теперь давайте посмотрим на этот только что созданный файл устройства. Если вы запустите

# fdisk -l /dev/mapper/sdr

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

Мой выглядит так:

Device                     Start        End    Sectors   Size Type
/dev/mapper/sdr-part1       2048     923647     921600   450M Windows recovery environment
/dev/mapper/sdr-part2     923648    1128447     204800   100M EFI System
/dev/mapper/sdr-part3    1128448    1161215      32768    16M Microsoft reserved
/dev/mapper/sdr-part4    1161216  679840003  678678788 323.6G Microsoft basic data
/dev/mapper/sdr-part5  679841792  680902655    1060864   518M Windows recovery environment
/dev/mapper/sdr-part6  680904704 2295472127 1614567424 769.9G Linux filesystem
/dev/mapper/sdr-part7 2295472128 2441957375  146485248  69.9G Linux swap

Используя начальный столбец и столбцы секторов в этой таблице, мы даже можем смонтировать некоторые из этих разделов. Обратите внимание, что все числа представлены в секторах и должны быть преобразованы в байты путем умножения на 512.

# mount -o ro,noload,loop,offset=348623208448,sizelimit=826658521088 /dev/mapper/sdr /mnt

Это означает, что мой раздел Linux теперь смонтирован в /mnt, и я могу просматривать все свои файлы в режиме ro(, то есть только для чтения -). noloadнеобходим для предотвращения выполнения ext4 операций записи .

И теперь, наконец, мы выполним полное резервное копирование с помощью dd.

# dd if=/dev/mapper/sdr of=/path/to/backups/raid.img status=progress

Помните, как мы создали RAID, который был немного больше, чем должен быть?Мы можем использовать эту возможность, чтобы исправить эту ошибку, обрезав изображение до его правильного размера. Количество секторов необходимо преобразовать в байты :2441959424*512 = 1250283225088.

# truncate -s 1250283225088 /path/to/backups/raid.img

Теперь fdisk -lбольше не жалуется на несоответствие размеров.

0
28.07.2021, 11:27

Теги

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