nologin
игнорируется для пользователя root. Таким образом, вы можете использовать SSH для подключения с правами root, но у вас, вероятно, есть дистрибутив, который по умолчанию не разрешает вход в систему root. Вы можете создать ключ SSH и поместить его в ~root/.ssh/authorized_keys
, после чего вы сможете войти с этим ключом как root.
Итак, я узнал, как снова получить доступ к своим данным. К сожалению, мне не удалось воссоздать массив с помощью 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
Если ваши данные на самом деле не начинаются с нуля, вы все равно можете получить правильное смещение позже, выполнив поиск заголовка раздела или, возможно, даже выполнив поиск файловых систем .
К сожалению, при использовании 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
больше не жалуется на несоответствие размеров.