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 udevdas 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 initsein Ziel-Root-Gerät gefunden hat und bereit ist, ein devfsdarauf 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/cmdlineund 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 busyboxdie Kernelmodule enthalten, die zum Mounten Ihres Ziel-Root-Geräts erforderlich sind.
Wahrscheinlich muss udeves das tun, also udevist 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/shund ein /etc/fstab.
Die meisten inits analysieren /proc/cmdlinenach Kernel-Parametern, die sie möglicherweise interpretieren. Eine sehr häufige ist root=/dev/somediskoder root=UUID=somediskUUIDoder root=LABEL=somedisklabel. Es sind die initramfs init, die diese root=...Parameter interpretieren - nicht der Kernel oder das initspä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 udeves 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 initerfolgreich findet und montiert das /new_rootGerät sieht es in der Regel etwas zu execsich zu - in der Regel /new_root/bin/init- was auch immer so , dass Programm wird pid 1. Es normalerweise tut dies mit dem switch_rootProgramm mit zur Verfügung gestellt busybox- die eine tut , execwä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_rootrootfs noch umountes. 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/stderran das neue /dev/consoleund execdas neue an init.
Das initgerade ausgeführte Root-Gerät muss jetzt sein eigenes Root-Dateisystem füllen. Er ruft seine udevund Halterungen seine eigene devfsauf , /devbasierend 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/sdanachdem das initramfs abgeschlossen /initist.
Ich denke, eine Möglichkeit, dies zu tun, besteht darin, eine udevRegel 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/sdafür initramfs vorgesehen ist - Sie müssen also keine Bootloader-Konfigurationen ändern -, aber später einen Knoten für dieselbe Festplatte wie /dev/usbafür das Anaconda-Installationssystem erstellen.