Простой вопрос: откуда 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