Intereting Posts
Сортировка файлов в каталоге по времени доступа, игнорируя подмножество из них «Не может быть раздела вне диска!» Для vdi, созданного с усеченного изображения Как мне получить копете, чтобы скрыть / игнорировать изменения статуса? Удалите значок уведомлений или сделайте уведомления затухающими через некоторое время Как сделать резервную копию нераспространяемых частей моей системы (а не только всего)? Какие файлы были получены, zsh Вставка в середину строки с помощью sed как заставить супервизор немедленно пережить после его смерти Полностью отключить функцию рабочего пространства Будет ли Linux в качестве гостя иметь возможность использовать аппаратную поддержку хоста Windows? Найти не хочет найти * .sh на определенном уровне Как добавить пользователя в группу, используя bash-скриптинг? Есть ли уловка для создания контейнера докеров с привилегией? Есть ли способ проверить степень сжатия сжатого файла xz? Перемещение файла с подстановочным знаком и добавление метки времени к имени файла

Ubuntu: Как устройства md собираются при загрузке?

Как устройства md собираются при загрузке в Ubuntu? Является ли /etc/mdadm/mdadm.conf действительно соответствующим фактором здесь?

Мой mdadm.conf звучит, и я проверил его, пока я был в среде аварийного компакт-диска. При запуске mdadm -A --scan он находит и назначает имена устройств по mdadm -A --scan усмотрению. mdadm.conf содержит AUTO -all mdadm.conf чтобы вытащить весь автоматизм из сборки массивов.

Мне нужно сделать автоматическую сборку md устройств, как указано в mdadm.conf во время загрузки, или что при сборке она mdadm.conf super-minor значение для массива 0.9 и name (видимо, <hostname>:<super-minor> ) для 1.2 массивов и делает правильную вещь без mdadm.conf . Какую часть головоломки мне не хватает?


У меня есть следующая проблема. Есть два устройства md с RAID1 ( md0 и md1 ) и один с RAID6 ( md2 ). Я имею в виду их имена нужных устройств. md0 имеет метаданные версии 0.9, остальные две версии 1.2. md0 карты в / а два других не относятся к загрузке .

Загрузочный диск разделен на GPT. На нем есть клей «BIOS Boot Partition» ( sda1 ). grub-install --no-floppy /dev/sda сообщает об успехах.

  • md0 == sda3 + sdb3
  • md1 == sda2 + sdb2
  • md2 == sdc + sdd + sde + sdf + sdg + sdh
  • sda1 и sdb1 являются «BIOS Boot Partition» каждый

GRUB2 доволен файлом /boot/grub/devicemap я ему дал, и добавил part_gpt , raid , mdraid09 и ext2 в модули для предварительной загрузки в GRUB2.

Поскольку у меня все еще был свой объем корня в спасательной среде, я просто смонтировал все, а затем chroot в него:

 mkdir /target mount /dev/md0 /target mount -o bind /dev /target/dev mount -o bind /dev/pts /target/dev/pts mount -o bind /sys /target/sys mount -o bind /proc /target/proc chroot /target /bin/bash 

Оттуда я сброшу super-minor на md0 (с метаданными 0,9) и name на md1 и md2 . Я также проверил, что он работал с использованием mdadm --detail ... Помимо этого я скорректировал /etc/default/grub , запустил update-grub а также grub-install --no-floppy /dev/sda и grub-install --no-floppy /dev/sdb .

После этого при загрузке меня всегда initramfs оболочку initramfs rescue, потому что корневая файловая система не может быть смонтирована. Причина в том, что после проверки /proc/mdstat похоже, что соответствующее устройство md даже не собирается и не запускается. Не говоря уже о том, что два других (метаданных версии 1.2) дисков получают номер устройства где-то в диапазоне 125..127.

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

Основной процесс загрузки

надрываться

  1. Grub считывает свой код диска, md, файловой системы и т. Д. Из MBR.
  2. Grub находит свой / загрузочный раздел и читает остальную часть из него. Включая конфигурацию и любые модули, необходимые для конфигурации, требуют загрузки.
  3. Grub следует инструкциям в конфиге, которые обычно говорят, что он загружает ядро ​​и initramfs в память и выполняет ядро.

Существует резервный режим, поскольку Grub не может фактически прочитать файловую систему – либо из-за нехватки места для встраивания всего этого кода в загрузочную запись, либо из-за того, что он не знает файловую систему или слои под ней. В этом случае GRUB вставляет список секторов и считывает из них код. Это намного менее надежный и лучше всего избегать. Возможно, он даже сможет сделать ядро ​​и initramfs (не уверен).

ядро

Затем ядро ​​получает управление и выполняет множество базовых аппаратных init. Этот этап довольно быстрый. Затем ядро ​​распаковывает initramfs в tmpfs и ищет /init на этом tmpfs. Затем он выполняется (в нормальном смысле, ядро ​​работает в этой точке) /init . Это, кстати, простой старый скрипт.

Initramfs

Вы можете извлечь initramfs вручную, выполнив что-то вроде mkdir /tmp/foo; cd /tmp/foo; zcat /boot/initrd.img-3.8-trunk-amd64 | cpio -idmv mkdir /tmp/foo; cd /tmp/foo; zcat /boot/initrd.img-3.8-trunk-amd64 | cpio -idmv mkdir /tmp/foo; cd /tmp/foo; zcat /boot/initrd.img-3.8-trunk-amd64 | cpio -idmv .

Initramfs отвечает за загрузку всех драйверов, запуск udev и поиск корневой файловой системы. Это шаг, который не подходит для вас – он не может найти корневую файловую систему, поэтому он сработает.

Как только initramfs завершит работу, он установит корневую файловую систему и передаст управление в / sbin / init.

Загрузка системы

На данный момент ваш init берет верх – я думаю, Ubuntu использует выскочку в настоящее время.

Что нарушено

Я не совсем уверен, что сломано (часть, признаюсь, потому что я гораздо лучше знаком с тем, как она работает на Debian, чем Ubuntu, хотя и похожа на нее), но у меня есть несколько предложений:

  • У initramfs есть своя копия mdadm.conf . Вам просто нужно запустить update-initramfs -u чтобы исправить это.
  • Посмотрите загрузочные сообщения. Может возникнуть ошибка. Избавьтесь от «тихих» и «всплесков» и, возможно, добавьте «verbose» в свою строку ядра, чтобы увидеть их.
  • В зависимости от используемого хранилища вам может потребоваться установить параметр rootdelay.
  • Когда вы попадаете в приглашение оболочки, у вас нет большого количества команд, но у вас есть mdadm. Попытайтесь выяснить, что пошло не так. Если вы исправите проблему, загрузка может продолжаться.

Хорошо, я узнал, что мне просто не хватает одной части. Изображения initrd не обновлялись после использования mdadm.conf .

Так что же я сделал?

Я загрузился в систему восстановления CD-диска Ubuntu Server. Выбирайте для выполнения оболочки из среды установщика и не используйте корневую файловую систему. Затем (комментарии добавлены с # ):

 cat /proc/mdstat # It showed me md125, md126 and md127 # Stop those: mdadm -S /dev/md125 mdadm -S /dev/md126 mdadm -S /dev/md127 # Assemble the root volume (meta-data version 0.9) mdadm -Av --update=super-minor --run /dev/md0 /dev/sda3 /dev/sdb3 # Assemble the other two arrays, updating the names (meta-data version 1.2) mdadm -Av --update=name --run /dev/md1 /dev/sda2 /dev/sdb2 mdadm -Av --update=name --run /dev/md2 /dev/sdc /dev/sdd /dev/sde /dev/sdf /dev/sdg /dev/sdh # Check the outcome: cat /proc/mdstat # See preferred minor and names: mdadm --detail /dev/md0 mdadm --detail /dev/md1 mdadm --detail /dev/md2 # All is fine, so proceed ... # Create directory for the chroot: mkdir /target # Mount root volume on it mount /dev/md0 /target mount -o bind /dev /target/dev mount -o bind /proc /target/proc mount -o bind /sys /target/sys mount -o bind /dev/pts /target/dev/pts # Now chroot into it: chroot /target /bin/bash # Fix up the GRUB device map to match what 'mdadm --detail' gives as UUID: nano /boot/grub/devicemap 

нано

Я использую nano потому что vim вызвал у меня головные боли из-за немого терминала, буквально. Вы можете использовать Ctrl + x для выхода (подскажите сохранить, Ctrl + k, чтобы вырезать текущую строку, Ctrl + u, чтобы вставить линию вырезания, Ctrl + o, чтобы сохранить буфер.

Это звучит сложно, но может быть сделано и с одним bash (хотя и длинным):

 for i in /dev/disk/by-id/md-uuid-*; do DEV=$(readlink $i); echo "(${DEV##*/}) $i"; done|sort|tee /boot/grub/devicemap 

Это использует текущие имена md устройств и их UUID и создает devicemap для прочтения GRUB2. Поэтому, полагая, что это было сделано правильно, вы должны иметь правильные имена устройств.

Далее:

 # Edit the grub config nano /etc/default/grub 

Убедитесь, что он содержит:

 GRUB_PRELOAD_MODULES="part_gpt raid mdraid09 ext2" 

если вы настроили ваш / или /boot раздел как метаданные версии 1.2, используйте mdraid1x вместо mdraid09 .

В дальнейшем:

 # Update the initrd images update-initramfs -c -k all 

Этот выше шаг был недостающим звеном . Это, очевидно, гарантирует, что mdadm.conf вступает в силу при загрузке.

 # Install GRUB2 on the two drives eligible for booting, just to be sure grub-install --no-floppy /dev/sda grub-install --no-floppy /dev/sdb # Make the latest config take effect update-grub 

После этого покиньте chroot и перезагрузитесь.