Ubuntu: Wie werden die MD-Geräte beim Booten zusammengebaut?

8

Wie werden die mdGeräte beim Booten in Ubuntu zusammengebaut? Ist hier /etc/mdadm/mdadm.confwirklich der relevante Faktor?

Mein mdadm.confSound ist solide und ich habe das überprüft, während ich mich in der Rettungs-CD-Umgebung befand. Beim Ausführen werden mdadm -A --scandie Gerätenamen wie gewünscht gefunden und zugewiesen. Das mdadm.confenthält AUTO -all, um jeglichen Automatismus aus dem Zusammenbau der Arrays herauszunehmen.

Was ich tun muss, ist in der Lage zu sein, die mdGeräte automatisch zusammenzubauen , wie mdadm.confbeim Booten beschrieben, oder dass beim Zusammenbau der super-minorWert für das 0,9-Array und das name(anscheinend <hostname>:<super-minor>) für die 1,2-Arrays berücksichtigt wird und das Richtige ohne getan wird mdadm.conf. Welches Puzzleteil fehlt mir?


Ich habe folgendes Problem. Es gibt zwei mdGeräte mit RAID1 ( md0und md1) und eines mit RAID6 ( md2). Ich beziehe mich mit den gewünschten Gerätenamen auf sie. md0hat Metadaten Version 0.9, die anderen beiden haben Version 1.2. md0Karten zu /und die anderen beiden sind für das Booten nicht relevant .

Das Startlaufwerk ist GPT-partitioniert. Darauf befindet sich ein Kleber "BIOS Boot Partition" ( sda1). grub-install --no-floppy /dev/sdameldet Erfolg.

  • md0 == sda3 + sdb3
  • md1 == sda2 + sdb2
  • md2 == sdc + sdd + sde + sdf + sdg + sdh
  • sda1und sdb1sind jeweils "BIOS Boot Partition"

GRUB2 ist glücklich mit der /boot/grub/devicemapich es gab und ich hinzu part_gpt, raid, mdraid09und ext2zu den Modulen Vorspannung in GRUB2.

Da ich mein Root-Volume immer noch in der Rettungsumgebung hatte, habe ich einfach alles gemountet und dann chroothineingezogen:

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

Von dort setze ich das super-minorauf md0(mit Meta-Daten 0,9) und den nameauf md1und md2. Ich habe auch überprüft, ob es mit funktioniert mdadm --detail .... Ansonsten habe ich mich angepasst /etc/default/grub, laufe update-grubund auch grub-install --no-floppy /dev/sdaund grub-install --no-floppy /dev/sdb.

Danach werde ich beim Booten immer in die initramfsRescue-Shell verschoben, da das Root-Dateisystem nicht gemountet werden konnte. Der Grund nach der Überprüfung /proc/mdstatscheint zu sein, dass das jeweilige mdGerät nicht einmal zusammengebaut und ausgeführt wird. Ganz zu schweigen davon, dass die beiden anderen Laufwerke (Metadatenversion 1.2) irgendwo im Bereich 125..127 eine Gerätenummer erhalten.

Hinweis: GRUB2 wird von der Startdiskette gestartet. Zumindest wurde es also korrekt eingebettet. Das Problem ist der Übergang vom ursprünglichen rootfszum richtigen Root-Dateisystem.

0xC0000022L
quelle
1
Verwenden Sie nicht /dev/mdXgenau aus diesem Grund. Verwenden Sie /dev/md/NAMEstattdessen. Das wird sich nie ändern.
Patrick
@Patrick: Ich verstehe nicht, was du sagen willst. Das Problem sind nicht die Namen an sich. Das ist mehr oder weniger kosmetisch. Das Problem war, dass das Root-Volume nicht zusammengestellt werden konnte und daher nicht zum Booten verfügbar war und ich daher nicht booten konnte. Ich verwende UUIDs, um GRUB2 mitzuteilen, welches Gerät welches ist, und ich verwende UUIDs in /etc/fstab. Das Setup nicht vertrauen auf den Namen, ich würde mich immer noch gerne auf diese Weise sein;)
0xC0000022L
Ich hätte es klarstellen sollen. Dies wurde nur als Lösung für Ihren Kommentar empfohlen Not to mention that the other two (meta-data version 1.2) drives receive a device number somewhere in the 125..127 range. Ich weiß nicht genug darüber, wie Ubuntu RAID-Volumes zusammenstellt, um das größere Problem zu beantworten.
Patrick

Antworten:

17

Grundlegender Startvorgang

Roden

  1. Grub liest den Code für Festplatte, MD, Dateisystem usw. aus dem MBR.
  2. Grub findet seine / boot-Partition und liest den Rest von sich aus. Einschließlich der Konfiguration und aller Module, die in der Konfiguration angegeben sind, muss geladen werden.
  3. Grub folgt den Anweisungen in der Konfiguration, die normalerweise anweisen, einen Kernel und initramfs in den Speicher zu laden und den Kernel auszuführen.

Es gibt einen Fallback-Modus, wenn Grub das Dateisystem nicht lesen kann - entweder weil nicht genügend Speicherplatz vorhanden war, um den gesamten Code in den Startdatensatz einzubetten, oder weil das Dateisystem oder die darunter liegenden Ebenen nicht bekannt sind. In diesem Fall bettet GRUB eine Liste von Sektoren ein und liest Code daraus. Dies ist viel weniger robust und wird am besten vermieden. Möglicherweise kann es sogar solche Kernel- und Initramfs ausführen (nicht sicher).

Kernel

Der Kernel übernimmt dann die Kontrolle und führt viele grundlegende Hardware-Initialisierungen durch. Diese Phase ist ziemlich schnell. Als nächstes entpackt der Kernel die initramfs in ein tmpfs und sucht nach einem /initauf diesem tmpfs. Es wird dann ausgeführt (im normalen Sinne läuft der Kernel zu diesem Zeitpunkt voll) /init. Dies ist übrigens ein einfaches altes Shell-Skript.

Initramfs

Sie können die initramfs von Hand extrahieren, indem Sie so etwas tun mkdir /tmp/foo; cd /tmp/foo; zcat /boot/initrd.img-3.8-trunk-amd64 | cpio -idmv.

Das initramfs ist dafür verantwortlich, alle Treiber zu laden, udev zu starten und das Root-Dateisystem zu finden. Dies ist der Schritt, der für Sie fehlschlägt. Das Root-Dateisystem kann nicht gefunden werden.

Sobald das initramfs fertig ist, wird das Root-Dateisystem gemountet und die Steuerung an / sbin / init übergeben.

Systemstart

Zu diesem Zeitpunkt übernimmt Ihr Init - ich denke, Ubuntu verwendet derzeit Upstart.

Was ist kaputt?

Ich bin mir nicht ganz sicher, was kaputt ist (Teil, ich gestehe, weil ich viel besser mit der Funktionsweise von Debian vertraut bin als Ubuntu, obwohl es ähnlich ist), aber ich habe ein paar Vorschläge:

  • Das initramfs hat eine eigene Kopie von mdadm.conf. Möglicherweise müssen Sie nur ausführen update-initramfs -u, um das Problem zu beheben.
  • Schauen Sie sich die Startmeldungen an. Möglicherweise liegt ein Fehler vor. Befreien Sie sich von 'quiet' und 'splash' und fügen Sie Ihrer Kernel-Zeile möglicherweise 'verbose' hinzu, um sie tatsächlich zu sehen.
  • Je nach verwendetem Speicher müssen Sie möglicherweise den Parameter rootdelay festlegen.
  • Wenn Sie an die Shell-Eingabeaufforderung ausgegeben werden, haben Sie nicht viele Befehle, aber Sie haben mdadm. Versuchen Sie herauszufinden, was schief gelaufen ist. Wenn Sie das Problem beheben, kann der Startvorgang fortgesetzt werden.
derobert
quelle
2
Ihr erster Vorschlag war genau richtig. Ihre Antwort kam herein, während ich meine eigene schrieb. Vielen Dank, dass Sie sich die Zeit genommen haben, um zu antworten. Sehr geschätzt. Ich denke, Ihre Frage bietet zusätzliche Einblicke. +1 plus akzeptieren.
0xC0000022L
2

Okay, ich fand heraus, dass mir nur ein Stück fehlte. Die initrdBilder wurden nach dem Basteln nicht aktualisiert mdadm.conf.

Also, was habe ich getan?

Ich habe das Rettungssystem der Ubuntu Server-Installations-CD gestartet. Sie haben sich entschieden, eine Shell in der Installationsumgebung auszuführen und kein Root-Dateisystem zu verwenden. Dann (Kommentare vorangestellt mit #):

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

Ich benutze, nanoweil vimmir buchstäblich Kopfschmerzen wegen des dummen Terminals verursacht haben. Sie können Ctrl+ xzum Beenden verwenden (fordert zum Speichern auf, Ctrl+ kzum Ausschneiden der aktuellen Zeile, Ctrl+ uzum Einfügen einer Schnittzeile, Ctrl+ ozum Speichern des Puffers.

Das klingt kompliziert, kann aber auch mit einem bashEinzeiler (wenn auch einem langen) durchgeführt werden:

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

Dies verwendet die aktuellen Namen der mdGeräte und ihrer UUIDs und erstellt eine devicemapfür GRUB2. Unter der Annahme, dass die oben genannten Schritte korrekt ausgeführt wurden, sollten Sie bereits die richtigen Gerätenamen haben.

Weiter:

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

Stellen Sie sicher, dass es enthält:

GRUB_PRELOAD_MODULES="part_gpt raid mdraid09 ext2"

Wenn Sie Ihre /oder Ihre /bootPartition als Metadatenversion 1.2 konfiguriert haben , verwenden Sie mdraid1xstattdessen anstelle von mdraid09.

Des Weiteren:

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

Dieser obige Schritt war das fehlende Glied . Dies stellt anscheinend sicher, dass das mdadm.confbeim Booten wirksam wird.

# 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

Danach verlassen Sie die chrootund starten Sie neu.

0xC0000022L
quelle