
Ich verwende CentOS 7 und habe mehrere Festplatten daran angeschlossen. Ich weiß, dass mein Betriebssystem, mein Kernel, Initramfs usw. unter „/dev/sda“ liegen und dass dies die bootfähige Festplatte ist. Aber wie erkennt Grub2 das? Überprüft es alle angeschlossenen Festplatten einzeln?
Antwort1
Technisch gesehen: Linux findet keine bootfähige Festplatte, da der Bootloader bis Linux läuft seine Aufgabe bereits erledigt hat, und zwar:
- Linux aus einer Datei irgendwo in den RAM kopieren
- kopiere das initramfs aus einer Datei irgendwo in den RAM
- auf einigen Architekturen wie ARM - kopieren Sie zusätzliche Dinge wie einen Gerätebaum oder einen Architekturdeskriptor irgendwo in den RAM
- Übergeben Sie die Kontrolle an den ersten Speicherort im RAM, an den Linux kopiert wurde. Jetzt ist der Bootloader nicht mehr aktiv.
Moderne UEFI-Firmware sowie Dinge auf Nicht-x86-Plattformen wie U-Boot haben in der Firmware gespeicherte „Boot-Einträge“ – ein Boot-Eintrag enthält ein Speichergerät und einen Dateinamen, und die Firmware geht der Reihe nach vor und lädt/führt die erste Datei aus, die sie findet. Sie ändern die Reihenfolge, indem Sie in die UEFI-Einstellungen gehen und Änderungen vornehmen oder ein Dienstprogramm in Ihrem Betriebssystem verwenden, um die UEFI-NVRAM-Einstellungen zu ändern.
Die Sache mit UEFI auf x86 ist, dass es eine einzelne Binärdatei in den RAM lädt, aber normalerweise benötigt Linux zum Booten auch mindestens ein initramfs (obwohl dies keine strenge Anforderung von Linux ist).
Außerdem verfügte x86 früher über eine primitivere Firmware (BIOS), die einfach den ersten Sektor von einem Speichergerät lud (die Reihenfolge wurde durch die BIOS-Einstellungen bestimmt) und nicht einmal versuchte, nach Dateien zu suchen/sie zu laden.
Aus diesem Grund wird auf den meisten Linux-Systemen GRUB von UEFI geladen (also das Programm, das die Startreihenfolge befolgt und nach bootfähigen Geräten sucht). GRUB ist eine gängige Bootloader-Plattform für Linux (und andere Betriebssysteme, falls gewünscht), die viele der Pre-Boot-Aufgaben erledigt, diesollenin der Firmware enthalten sein, ist es aber aus verschiedenen Gründen nicht, und bietet Ihnen außerdem eine Umgebung, in der Sie Dinge tun können, bevor ein Betriebssystem geladen wird.
Bei der Installation von Linux konfiguriert das Installationsprogramm GRUB, indem es eine Konfigurationsdatei generiert, auf die GRUB zugreifen kann, und Einträge in das GRUB-Menü einfügt, die GRUB mitteilen, wo es den Kernel und Initramfs laden soll. Mehrere Einträge sind möglich und sogar üblich – Debian installiert beispielsweise ein zweites Menüelement für einen Rettungskernel – ungefähr gleichbedeutend mit dem abgesicherten Modus von Windows. Aber diese werden alle vom Installationsprogramm festgelegt, wenn Linux installiert wird, und Sie erreichen diese Optionen, nachdem UEFI seine Arbeit erledigt hat.
(Übrigens gefiel mir an U-Boot, dass es den Kernel und Initramfs direkt lädt, sodass GRUB überhaupt nicht benötigt wurde. Aber das war ein ARM-Gerät mit anpassbarer Firmware.)
Windows hat seinen eigenen "GRUB", winload.exe
der die Dinge erledigt, die Windows braucht, und optional vor dem Booten Menüoptionen bereitstellt, die die Firmware ebenfalls nicht bietet. bcdedit
Dort ändern Sie Menüoptionen. Frühere Windows-Versionen als Vista verwendeten NTLDR und Dinge konnten, wenn ich mich recht entsinne, mit der Datei C:\boot.ini konfiguriert werden.
Linux erfordert kein GRUB – lange Zeit wurde ein einfacherer Bootloader namens LILO (Linux Loader) verwendet und einige Distributionen verwenden ihn wahrscheinlich immer noch.