Wie unterstützen Dateisysteme das Booten von älteren Versionen?

486
sherrellbc

Ich schreibe gerade einen einfachen OS-Bootloader (zuerst im Legacy-Modus). Nachdem ich den Boot-Prozess ( MBR beim Laden der VBR usw.) verstanden hatte, begann ich, die Spezifikationen für die verschiedenen Dateisysteme zu untersuchen, um zu verstehen, wie sie mit diesem alten Boot-Modus umgehen.

Dies ist erforderlich, da sich der Volume Boot Record (VBR) auf der Festplatte des ersten Sektors der "aktiven" Partition befindet. Mit anderen Worten sind die Bytes des ersten Sektors (normalerweise 512 Bytes) keine Datenstrukturen des Dateisystems, sondern der Boot-Code für das Betriebssystem.

Zuerst habe ich FAT wegen seiner Einfachheit betrachtet. Zu meiner Überraschung fand ich Hinweise auf den " Boot-Sektor ", der direkt in die Spezifikation aufgenommen wurde. Insbesondere wenn Sie eine Platte mit dem FAT-Dateisystem formatieren, können Sie am Anfang einige Sektoren für spezielle Codeblöcke wie den VBR "reservieren". In diesem Fall werden alle Dateisystem-Datenstrukturen um diese Anzahl reservierter Blöcke verschoben. Großartig! Genau das habe ich gesucht.

In anderen Dateisystemen (speziell ext) konnte ich jedoch nichts Ähnliches finden. Diese anderen Dateisysteme müssen die "alte" Art des Bootens unterstützen (z. B. Speicherplatz für die VBR zum Booten des Betriebssystems), da sie lange vor der UEFI-Startspezifikation verfügbar waren.

1
Sie irren sich, wie der Linux-Startvorgang funktioniert. Es ist keine VBR erforderlich, wenn der MBR-Code genug vom Dateisystem versteht, um die nächste Stufe zu laden, die keinen Platzbeschränkungen unterliegt. Daniel B vor 6 Jahren 0
[Ext2 hat auch einen 1024-Byte-Bootcode-Bereich] (http://www.nongnu.org/ext2-doc/ext2.html#DISK-ORGANISATION). Daniel B vor 6 Jahren 0
[Btrfs scheint 64 KB zu haben] (https://superuser.com/a/1208690/432690). Kamil Maciorowski vor 6 Jahren 0
@DanielB Der Prozess ist nicht Linux-spezifisch. DOS wurde auf diese Weise gebootet. Der Prozess ist bekannt. Der MBR erhält die Ausführung um 0x0000: 0x7c00, er verlagert sich selbst, bestimmt die "aktive" Partition und lädt seine VBR (ersten Sektor) an derselben Adresse, `0x0000: 0x7c00 '. Diese VBR war die erste Stufe des Bootloaders, die für das installierte Betriebssystem spezifisch ist. Natürlich wurde dies so gemacht, und der Prozess hat sich in den letzten 40 Jahren weiterentwickelt. Sie benötigen keine VBR, insbesondere wenn Ihr installierter Bootloader wie GRUB den MBR mit seinem eigenen Code überschreibt, der für sein Boot-Schema spezifisch ist sherrellbc vor 6 Jahren 0
@DanielB Es gibt nur 512 Byte, mit denen im MBR und VBR (falls vorhanden) gearbeitet werden kann. Daher habe ich erwartet, dass die Implementierung ziemlich vereinfacht wird. Danke auch für den Link zu ext. Ich stöberte im Wiki herum und konnte es dort nicht finden. sherrellbc vor 6 Jahren 0

1 Antwort auf die Frage

2
Kamil Maciorowski

Diese anderen Dateisysteme müssen die "alte" Art des Bootens unterstützen (z. B. Speicherplatz für die VBR zum Booten des Betriebssystems), da sie lange vor der UEFI-Startspezifikation verfügbar waren.

Nein, das brauchen sie nicht. Siehe GNU GRUB Manual 2.02 :

Das normalerweise auf PC-BIOS-Plattformen verwendete Partitionstabellenformat wird als MBR-Format (Master Boot Record) bezeichnet. Dieses Format ermöglicht bis zu vier primäre Partitionen und zusätzliche logische Partitionen. Bei diesem Partitionstabellenformat gibt es zwei Möglichkeiten, GRUB zu installieren: Es kann in den Bereich zwischen dem MBR und der ersten Partition eingebettet werden (genannt unter verschiedenen Namen wie "Boot-Track", "MBR-Lücke" oder "Einbetten") Bereich ", und das ist in der Regel mindestens 31 KiB), oder das Kernabbild kann in einem Dateisystem installiert werden, und eine Liste der Blöcke, aus denen es besteht, kann im ersten Sektor dieser Partition gespeichert werden.

Jedes davon hat andere Probleme. Es gibt keine Möglichkeit, Speicherplatz im Embedding-Bereich mit absoluter Sicherheit zu reservieren, und einige proprietäre Software verwendet sie, um Benutzern die Umgehung von Lizenzbeschränkungen zu erschweren. und Systeme werden manchmal partitioniert, ohne dass vor der ersten Partition genügend Speicherplatz vorhanden ist. Auf der anderen Seite bedeutet die Installation in einem Dateisystem, dass GRUB anfällig ist, dass seine Blöcke durch Dateisystemfunktionen wie Endverpackung oder sogar durch aggressive fsckImplementierungen verschoben werden. Daher ist dieser Ansatz ziemlich anfällig. Dieser Ansatz kann nur verwendet werden, wenn sich das / boot-Dateisystem auf derselben Festplatte befindet, von der das BIOS gestartet wird, sodass sich GRUB nicht auf das Erraten von BIOS-Laufwerksnummern verlassen muss.

Das GRUB-Entwicklungsteam empfiehlt, GRUB vor der ersten Partition einzubetten, sofern Sie keine besonderen Anforderungen haben. Sie müssen sicherstellen, dass die erste Partition mindestens 31 KiB (63 Sektoren) ab dem Start der Festplatte startet. Auf modernen Festplatten ist es oft ein Leistungsvorteil, Partitionen trotzdem an größeren Grenzen auszurichten, sodass die erste Partition möglicherweise 1 MiB vom Anfang der Festplatte an startet.

Dies bedeutet, dass sich ein Bootloader vor der ersten VBR oder sogar innerhalb eines Dateisystems befinden kann.

Ja, natürlich. Ich wollte nicht andeuten, dass dies der einzige Weg war, nur zu booten. Es war einfach so, wie es gemacht wurde, bevor GRUB den ganzen "einheitlichen Bootloader" ausprobierte. Ich kann auch nachweisen, dass dies in der Praxis umgesetzt wird. Ich habe letzte Woche einige Zeit damit verbracht, den GRUB-Code in QEMU durchzugehen. Ich habe die drei Stufen extrahiert (Download aus meinem Beitrag in diesem Thread (https://forum.osdev.org/viewtopic.php?f=1&t=32764&sid=47b854391c0c8fc2fd8e77f0526f5a3f). Ich fand heraus, dass GRUB den MBR im 0. Sektor überschrieb und das VBR im 1. Sektor und dann seine zweite Stufe im 2. Sektor hatte. sherrellbc vor 6 Jahren 0
Danke für den Link und das Zitat. Meine Untersuchung dazu führte zu meiner Feststellung, dass GRUB seinen MBR und seine Stage Stage in den ersten Sektoren auf der Festplatte gespeichert hat (nach dem MBR, aber vor der ersten Partition), aber ich konnte nirgendwo Verweise darauf finden. Dies führte mich zu der Frage, wie es den Fall kompensieren würde, bei dem der Benutzer versuchte, die Installation in einem vorhandenen System ohne diesen "reservierten" Speicherplatz vorzunehmen. Dieses Zitat zeigt, dass dies erforderlich ist, sofern die Dateien nicht riskant im Dateisystem gespeichert sind. Ich fand auch, dass "fdisk" die ersten 2048 Sektoren und "cfdisk" die ersten 63 reserviert. sherrellbc vor 6 Jahren 0
@sherrellbc: Ich glaube, einige Bootloader (zB Lilo) würden Stufe 2 in eine Datei einfügen und dann den LBA-Speicherort dieser Datei im MBR-Code festcodieren. Vielleicht riskant, aber sehr verbreitet. (Hatte MSDOS nicht so etwas?) grawity vor 6 Jahren 0