Вопрос: Что говорит initramfs или процесс загрузки Ubuntu Server как собрать RAID-массивы?


Простой вопрос: как initramfs знает, как собрать массивы RAID mdadm при запуске?

Моя проблема: я загружаю свой сервер и получаю:

Gave up waiting for root device.
ALERT! /dev/disk/by-uuid/[UUID] does not exist. Dropping to a shell!

Это происходит потому, что / dev / md0 (который является / boot, RAID 1) и / dev / md1 (который /, RAID 5) не собираются правильно. То, что я получаю, / dev / md0 не собирается вообще. / dev / md1, но вместо использования / dev / sda2, / dev / sdb2, / dev / sdc2 и / dev / sdd2 он использует / dev / sda, / dev / sdb, / dev / sdc, / DEV / SDD.

Чтобы исправить это и загрузить мой сервер, я делаю:

$(initramfs) mdadm --stop /dev/md1
$(initramfs) mdadm --assemble /dev/md0 /dev/sda1 /dev/sdb1 /dev/sdc1 /dev/sdd1
$(initramfs) mdadm --assemble /dev/md1 /dev/sda2 /dev/sdb2 /dev/sdc2 /dev/sdd2
$(initramfs) exit

И он правильно садится, и все работает. Теперь мне просто нужны массивы RAID для правильной сборки при загрузке, поэтому мне не нужно их вручную собирать. Я проверил /etc/mdadm/mdadm.conf, и UUID из двух массивов, перечисленных в этом файле, соответствуют UUID из $ mdadm --detail /dev/md[0,1],

Другие сведения: Ubuntu 10.10, GRUB2, mdadm 2.6.7.1

ОБНОВЛЕНИЕ: У меня такое чувство, что оно связано с суперблоками. $ mdadm --examine /dev/sda выводит то же самое, что и $ mdadm --examine /dev/sda2, $ mdadm --examine /dev/sda1 кажется прекрасным, поскольку он выводит информацию о /dev/md0, Я не знаю, является ли это проблемой или нет, но, похоже, это соответствует /dev/md1 собираться с /dev/sd[abcd] вместо /dev/sd[abcd]2,

Я попытался обнулить суперблоки /dev/sd[abcd], Это удалило суперблок из /dev/sd[abcd]2 а также не позволил мне собраться /dev/md1 вообще. Мне пришлось $ mdadm --create чтобы вернуть его. Это также положило суперблоки обратно к тому, как они были.


4
2017-12-05 20:39


Источник




Ответы:


Хорошо глядя на скрипты, используемые для сборки initramfs, я думаю, что проблема, вероятно, в том, что ваш /etc/mdadm/mdadm.conf устарел.

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

mdadm --detail --scan > /etc/mdadm/mdadm.conf

После этого обновите свои initramfs с помощью:

update-initramfs

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


8
2018-01-15 01:04



Обратите внимание, что >> добавит к существующему файлу mdadm.conf, который может быть нежелательным (используйте> для перезаписи) - Peter Gibson
Это оказалось причиной неудачи в моем случае (я думаю) из-за дублирования записей в mdadm.conf. - Peter Gibson


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

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


1
2017-12-05 21:20



Я пробовал это пару раз, это не помогает. Он по-прежнему загружает / dev / sd [abcd] в / dev / md1 вместо / dev / sd [abcd] 2. - Brad


Вот обходной путь, который я придумал:

Добавьте этот скрипт в /etc/initramfs-tools/scripts/local-top:

 #!/bin/sh
 sleep 6
 mdadm --stop /dev/md1
 mdadm --stop /dev/md0
 sleep 6
 mdadm --assemble --scan

Это исправляет массивы RAID, прежде чем система попытается установить md1 в /root, Я должен был добавить паузы, чтобы заставить команды работать последовательно.

На самом деле это не проблема, но это лучшее решение, которое я нашел, что не требует изменения RAID-массивов или программного обеспечения для модернизации.


1
2017-12-06 07:12



+1 Спасибо за сообщение возможного решения для других, которые могут быть в одном месте в какой-то момент. - David Spillett


У меня такая же проблема, и я нашел эту ссылку, которая объясняет, почему это происходит: https://bugs.launchpad.net/ubuntu/+source/debian-installer/+bug/599515кажется, что ваш раздел sda2 доходит до конца диска и перезаписывает суперблок диска, так что sda и sda2 - одно и то же, что и mdadm, и заканчивается сборка md1 с sda вместо sda2


1
2018-01-14 21:47





Чтобы ответить на вопрос: да, это связано с суперблоками. Техническая документация находится здесь: https://raid.wiki.kernel.org/index.php/RAID_superblock_formats


0
2017-12-05 22:34



Я воссоздал массив: $ mdadm --create -n 4 -l 5 -e 1.1 /dev/md1 /dev/sd[abcd]2 и казалось, что это работает, и mdadm --examin выглядел лучше. Однако я больше не могу монтировать / dev / md1 или / dev / md / 1. - Brad


Установлены ли / dev / sd [abcd] 2 как тип «fd» (RAID-определение) в таблице разделов? Бег fdisk -l | less для просмотра таблиц разделов. Похоже, что initrd не обнаруживает разделы, но затем на необработанном устройстве он видит суперблоки. Или может быть, что в initrd есть некорректный mdadm.conf, но я бы ожидал, что update-initramfs это исправит.

Вы можете извлечь initrd, создав каталог, cd в него, а затем запустить:

gunzip </path/to/initrd | cpio -ivd

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

Но сначала проверьте таблицы разделов ...


0
2017-12-05 22:46



Все разделы отмечены как autodetect fd - Linux raid. - Brad
Спасибо за подсказку о том, как смотреть файл initrd. Это выглядело правильно, но это помогло мне разобраться, что делает initramfs. - Brad
@Brad: Любая удача, исправляющая это? Я действительно надеялся, что тип раздела будет делать это, иначе я думаю, что это займет некоторое копание. - Sean Reifschneider
Я смог придумать обходной путь, чтобы загрузить его, но я не смог решить проблему. - Brad


Аналогичная проблема с RAID + LVM в окне Debian Lenny. Перед выходом из оболочки initramfs выполните:

$(initramfs) vgchange MyLvmVol -a y
$(initramfs) exit

тогда

update-initramfs -u

0
2017-09-29 06:51