Ok, so funktioniert der Startvorgang:
- Firmware> Bootloader vielleicht > Kernel
${parameters}
> Initramfs> Userspace vielleicht
Auf einer Redhat-Installationsdiskette erstellt und bildet das dracut- System von Skripten initramfs, und das Anaconda- Installationssystem bildet den endgültigen Benutzerbereich.
Es ist udev
das Gerät-Setup - wie in, benennt es die Geräte in /dev
. Dies geschieht jedoch fast immer zweimal - einmal in initramfs und erneut, wenn das Innere init
sein Ziel-Root-Gerät gefunden hat und bereit ist, ein devfs
darauf zu mounten .
So funktioniert es also:
Der Bootloader (oder die Firmware) ruft den Kernel mit einem optionalen Parametersatz und einem optionalen initramfs-Image auf. Dieser Parametersatz wird gespeichert /proc/cmdline
und der Kernel ignoriert alle Parameter, die er nicht versteht.
Das initramfs ist ein funktionierender Linux-Benutzerbereich. Ob der /
Inhalt von einem Image entpackt wird, das ihm beim Aufruf übergeben wurde, oder ob er kompiliert wurde, spielt keine Rolle - da Kernel 2.6 immer das erste funktionierende Root-Dateisystem ist, das der Linux-Kernel bereitstellt. Ab diesem Zeitpunkt überlässt der Linux-Kernel alles dem Userspace.
Normalerweise enthält das initramfs (wie es für redhats dracut gilt) nur das, was unbedingt erforderlich ist, um ein Root-Gerät zu finden und es über sich selbst zu mounten. Im Allgemeinen sind nur busybox
die Kernelmodule enthalten, die zum Mounten Ihres Ziel-Root-Geräts erforderlich sind.
Wahrscheinlich muss udev
es das tun, also udev
ist es meistens enthalten - mit seinen eigenen kleinen Regeln.
Wie bereits erwähnt, ist initramfs ein eigenes kleines vollständiges Linux-Root-Dateisystem. Eine vollständige könnte aussehen wie : /bin /etc /dev /new_root /proc /sys init
. Der Inhalt dieser Verzeichnisse ist im Allgemeinen nicht sehr ungewöhnlich - es gibt fast immer ein /bin/sh
und ein /etc/fstab
.
Die meisten init
s analysieren /proc/cmdline
nach Kernel-Parametern, die sie möglicherweise interpretieren. Eine sehr häufige ist root=/dev/somedisk
oder root=UUID=somediskUUID
oder root=LABEL=somedisklabel
. Es sind die initramfs init
, die diese root=...
Parameter interpretieren - nicht der Kernel oder das init
später ausgeführte Finale (obwohl das letzte andere sehr gut interpretieren kann) . Dieser Parameter wird akzeptiert und gemountet /new_root
(oder welcher Name auch immer für den Staging-Mount verwendet wird, bevor er verwendet wird switchroot
) . Wenn udev
es in initramfs enthalten ist, entscheidet der initramfs-Regelsatz, wie der /dev/...
Eintrag dieser Zielfestplatte jetzt benannt wird - dies kann sich jedoch ändern.
Wenn die initramfs init
erfolgreich findet und montiert das /new_root
Gerät sieht es in der Regel etwas zu exec
sich zu - in der Regel /new_root/bin/init
- was auch immer so , dass Programm wird pid 1. Es normalerweise tut dies mit dem switch_root
Programm mit zur Verfügung gestellt busybox
- die eine tut , exec
während gleichzeitig Montage /new_root
über /
. Sein Prozess wird in den Kernel-Dokumenten folgendermaßen beschrieben :
Aber initramfs ist rootfs: Sie können weder pivot_root
rootfs noch umount
es. Löschen Sie stattdessen alles aus rootfs, um den Speicherplatz freizugeben ( find -xdev / -exec rm '{}' ';'
) , überlagern Sie rootfs mit dem neuen root ( cd /newmount; mount --move . /; chroot .
) , hängen Sie es stdin/stdout/stderr
an das neue /dev/console
und exec
das neue an init
.
Das init
gerade ausgeführte Root-Gerät muss jetzt sein eigenes Root-Dateisystem füllen. Er ruft seine udev
und Halterungen seine eigene devfs
auf , /dev
basierend auf seinen eigenen ruleset und tut den Rest. Wenn es vorbei ist, können Sie Ihren Computer verwenden.
Entschuldigen Sie den Detaillierungsgrad, aber ich wollte klarstellen, warum Folgendes zutrifft:
- Jeder Kernel-Parameter, den Sie vom Bootloader aus eingeben,
root=/dev/sda
muss nicht derselbe sein /dev/sda
, auf den Sie eventuell zugreifen, /dev/sda
nachdem das initramfs abgeschlossen /init
ist.
Ich denke, eine Möglichkeit, dies zu tun, besteht darin, eine udev
Regel auf Ihrer Anaconda- Festplatte festzulegen - die wahrscheinlich tatsächlich ein Squashfs-Archiv ist -, die sie anweist, alle USB-Festplatten an einer anderen Stelle einzurichten. Hier gibt es ein hervorragendes Beispiel:
KERNEL=="sd*", SUBSYSTEMS=="scsi", ATTRS{model}=="USB 2.0 Storage Device", SYMLINK+="usbhd%n"
Und es wäre sehr gut, wenn Sie auch den Rest dieses Links lesen würden. Sie sollten in der Lage sein, dies zu tun, damit Ihr USB-Festplattengerät /dev/sda
für initramfs vorgesehen ist - Sie müssen also keine Bootloader-Konfigurationen ändern -, aber später einen Knoten für dieselbe Festplatte wie /dev/usba
für das Anaconda-Installationssystem erstellen.