Назад | Перейти на главную страницу

Что говорит 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 чтобы вернуть его. Это также вернуло суперблоки на прежнее место.

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

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

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

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

update-initramfs

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

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

Добавьте этот скрипт в /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-массивов или обновления программного обеспечения.

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

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

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

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

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

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

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

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

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

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

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

затем

update-initramfs -u