In BIOS
basierten Systemen enthalten die ersten 512 Byte des ersten Sektors einer Festplatte den Master Boot Record
. Dieser enthält eine Partitionstabelle
, eine Festplattensignatur
und ursprünglich einen Bootloader
, welcher durch das BIOS geladen und ausgeführt wird. Abgeschlossen wird der MBR
mit der MBR Signatur
55AA(16). Der MBR
gliedert sich wie folgt:
Bootloader
Die ersten 440 Byte des MBR sind für den Bootloader reserviert. Der Bootloader ist ein ausführbarer Code und sucht in der Partitionstabelle nach einer aktiven Partition und lädt den Bootsektor
der ersten aktiven Partition und führt diesen aus, woraus dann das eigentliche Betriebssystem gestartet wird. Moderne Systeme weichen von diesem Ablauf idR ab, weil deren Bootloader entweder zu groß für den MBR ist oder ein Bootmanager
verwendet wird, der die Möglichkeit bietet zwischen mehreren Betriebssystemen zu wählen. In diesem Fall enthält die Bootloader Komponente im MBR nur einen Teil des gesamten Bootloaders, der es ermöglicht die weiteren Teile des Bootloaders auf dem Dateisystem der Festplatte zu suchen und auszuführen.
Festplattensignatur
Die folgenden 4 Bytes zeigen die Festplattensignatur
an. Beim Initialisieren des Datenträgers wird eine zufällig generierte Festplattensignatur erzeugt und im MBR angelegt. Diese Signatur wird ab Windows 2000 in der Registry im Schlüssel HKLM\System\MountedDevices
gespeichert, wodurch das Windows Betriebssystem die Platte beim Mount-Vorgang identifizieren kann. An dieser Stelle befindet sich eine Falle, in die viele Anwender tappen, wenn sie ihre Festplatte klonen um zB ein vorhandenes System auf eine neue Festplatte zu migrieren. Einige Festplattenklonprogramme klonen nun den Inhalt der Festplatte, lassen aber die Disksignatur unberührt, was beim Starten des geklonten Betriebssystems einen Fehler bei der Erkennung der Festplatte erzeugt. In diesem Fall kann das fdisk
-Utility mit dem Parameter /mbr
eine neue, gültige Disksignatur erzeugen.
Partitionstabelle
Nach der Disksignatur folgen zwei leere Bytes, welche normalerweise mit Null belegt sind, darauf folgen 64 Bytes für die Partitionstabelle
, welche sich in vier 16 Byte Sektionen unterteilt. Jede dieser Sektionen enthält die Informationen einer Partition, was auch der Grund dafür ist warum auf einem MBR basierten System nur vier Partitionen vorhanden sein können, wobei allerdings unter Verwendung einer logischen Partition mehr als vier Partitionen angelegt werden können. Im Partitionsschema einer Partition wird ggf das Bootflag untergebracht (80(16)=bootfähig, 00(16)=nicht bootfähig), der Partitionstyp
festgehalten (zB NTFS, FAT oder Linux), die Anfangs- und Endadressen sowohl physikalisch im CHS-Schema
, wie auch logisch im LBA-Schema
.
MBR-Signatur
Die letzten zwei Byte des MBR sind mit der MBR Signatur
(auch Magic Number
genannt) belegt, welche den MBR abschließt und als gültig deklariert. Die MBR Signatur besteht in seiner gültigen Form immer aus 55(16) und AA(16) (Auf Little Endian9) Systemen wird die MBR Signatur als 0xAA55
interpretiert). Ist diese Signatur nicht vorhanden, kann von diesem System nicht gebootet werden, auch wenn der restliche Inhalt des MBR in korrekter Form vorliegt.
Beispiel MBR
Man kann den MBR auslesen und analysieren. Auf UNIX basierten Betriebssystemen eignet sich hier das dd-Utility:
# dd if=/dev/sda of=/home/mbr.dmp bs=512 count=1
Dieser Befehl liest von der Festplatte /dev/sda
die ersten 512 Byte (bs=512
) in die Datei /home/mbr.dmp
ein. Der Inhalt dieser Datei repräsentiert dann den binären Inhalt des MBR und kann mit dem od
-Utility zB in hexadezimaler Ausgabe angezeigt werden:
# od -t x1 /home/mbr.dmp
0000000 eb 63 90 10 8e d0 bc 00 b0 b8 00 00 8e d8 8e c0
0000020 fb be 00 7c bf 00 06 b9 00 02 f3 a4 ea 21 06 00
0000040 00 be be 07 38 04 75 0b 83 c6 10 81 fe fe 07 75
0000060 f3 eb 16 b4 02 b0 01 bb 00 7c b2 80 8a 74 01 8b
0000100 4c 02 cd 13 ea 00 7c 00 00 eb fe 00 00 00 00 00
0000120 00 00 00 00 00 00 00 00 00 00 00 80 01 00 00 00
0000140 00 00 00 00 ff fa eb 07 f6 c2 80 75 02 b2 80 ea
0000160 74 7c 00 00 31 c0 8e d8 8e d0 bc 00 20 fb a0 64
0000200 7c 3c ff 74 02 88 c2 52 be 80 7d e8 1c 01 be 05
0000220 7c f6 c2 80 74 48 b4 41 bb aa 55 cd 13 5a 52 72
0000240 3d 81 fb 55 aa 75 37 83 e1 01 74 32 31 c0 89 44
0000260 04 40 88 44 ff 89 44 02 c7 04 10 00 66 8b 1e 5c
0000300 7c 66 89 5c 08 66 8b 1e 60 7c 66 89 5c 0c c7 44
0000320 06 00 70 b4 42 cd 13 72 05 bb 00 70 eb 76 b4 08
0000340 cd 13 73 0d f6 c2 80 0f 84 d8 00 be 8b 7d e9 82
0000360 00 66 0f b6 c6 88 64 ff 40 66 89 44 04 0f b6 d1
0000400 c1 e2 02 88 e8 88 f4 40 89 44 08 0f b6 c2 c0 e8
0000420 02 66 89 04 66 a1 60 7c 66 09 c0 75 4e 66 a1 5c
0000440 7c 66 31 d2 66 f7 34 88 d1 31 d2 66 f7 74 04 3b
0000460 44 08 7d 37 fe c1 88 c5 30 c0 c1 e8 02 08 c1 88
0000500 d0 5a 88 c6 bb 00 70 8e c3 31 db b8 01 02 cd 13
0000520 72 1e 8c c3 60 1e b9 00 01 8e db 31 f6 bf 00 80
0000540 8e c6 fc f3 a5 1f 61 ff 26 5a 7c be 86 7d eb 03
0000560 be 95 7d e8 34 00 be 9a 7d e8 2e 00 cd 18 eb fe
0000600 47 52 55 42 20 00 47 65 6f 6d 00 48 61 72 64 20
0000620 44 69 73 6b 00 52 65 61 64 00 20 45 72 72 6f 72
0000640 0d 0a 00 bb 01 00 b4 0e cd 10 ac 3c 00 75 f4 c3
0000660 00 00 00 00 00 00 00 00 03 7e 09 00 00 00 80 20
0000700 21 00 83 93 29 2a 00 08 00 00 00 68 0a 00 00 b4
0000720 09 2a 05 fe ff ff fe 77 0a 00 02 80 f5 00 00 00
0000740 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0000760 00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 aa
In dieser Ausgabe sehen wir den MBR eines Linux Sytems, welchen man jetzt genauer analysieren kann. Der Index ist octal angegeben, das zugrunde liegende System ist in Little Endian Bytefolge zu interpretieren.
Die ersten 440 Byte bestehen aus Maschinen-Code und werden vom Bootloader belegt. Hier können eigentliche keine sinnvollen Informationen entnommen werden. Die Festplattensignatur (blau) besteht aus einen zufällig generierten Wert aber die Partitionstabelle enthält nun analysierbare Informationen. Die vier verfügbaren Partitionen sind hier in rot, grün, türkis und pink dargestellt. Die Bedeutung der einzelnen Bytes pro Partition gliedern sich wie in folgender Tabelle aufgelistet:
Speicherplatz in Hex | Größe in Bytes | Inhalt |
0x00 | 1 | bestimmt ob von dieser Partition gestartet werden kann (80(16)=bootfähig; 00(16)=nicht bootfähig |
0x01 | 3 | CHS-Eintrag des ersten Sektors |
0x04 | 1 | Partitionstyp |
0x05 | 3 | CHS-Eintrag des letzten Sektors |
0x08 | 4 | Startsektor, relativ zum Anfang der Festplatte oder zur erweiterten Partition |
0x0c | 4 | Anzahl der Sektoren in der Partition per LBA-Methode |
Typ-Byte (Hex) | Bezeichnung |
0x00 | leer/unbenutzt |
0x01 | FAT12 (Floppy Disks) |
0x04 | FAT16 ≤ 32 MiB |
0x05 | erweiterte Partition |
0x06 | FAT16 > 32 MiB |
0x07 | NTFS (Windows) oder HPFS (OS/2) |
0x0B | FAT32 |
0x0C | FAT32 mit BIOS-Extensions (LBA) |
0x0E | FAT16 > 32 MiB mit BIOS-Extensions (LBA) |
0x0F | erweiterte Partition mit BIOS-Extensions (LBA) |
0x12 | OEM-Partition für Konfiguration, Diagnose, BIOS-Erweiterung (für Windows-Betriebssysteme unsichtbar) |
0x42 | Dynamischer Datenträger |
0x82 | Linux Swap / Solaris 2.6 X86 bis Solaris 9 X86 |
0x83 | Linux Native |
0x8E | Linux LVM |
0xA5 | FreeBSD |
0xA6 | OpenBSD |
0xA9 | NetBSD |
0xEE | GPT: Legacy MBR mit folgendem EFI Header |
0xEF | GPT: Partition mit EFI-Dateisystem |
Aus diesen Tabellen lässt sich nun ermitteln, welche Partitionen auf dem System angelegt sind, von welcher gebootet werden kann und welchen Typ sie entsprechen. Das erste Byte der ersten Partition hat den Wert 80(16)
, was bedeutet von dieser Partition kann gebootet werden. Das fünfte Byte enthält den Partitionstyp und hat den Wert 83(16)
, was Linux native repräsentiert. Bei den folgenden Partition wird mit dem ersten Byte angezeigt, dass davon nicht gebootet werden kann 00(16)
, wobei der Partitionstyp der zweiten Partition mit 05(16)
angezeigt wird, was einer erweiterten Partition entspricht und die letzten beiden verfügbaren Partitionen sind auf diesem System nicht vorhanden.
Wir können diese Angaben mit dem fdisk
-Utility überprüfen oder ggf auch ändern:
# fdisk -l
Disk /dev/sda: 8589 MB, 8589934592 bytes
255 heads, 63 sectors/track, 1044 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00097e03
Device Boot Start End Blocks Id System
/dev/sda1 * 1 43 340992 83 Linux
Partition 1 does not end on cylinder boundary.
/dev/sda2 43 1045 8044545 5 Extended
/dev/sda5 43 407 2925568 83 Linux
/dev/sda6 408 586 1434624 83 Linux
/dev/sda7 586 645 473088 82 Linux swap / Solaris
/dev/sda8 645 676 246784 83 Linux
/dev/sda9 676 1045 2960384 83 Linux
Wir sehen hier eingefärbt in rot und grün die ersten beiden Partitionen. Die erste Partition besitzt das Bootflag, was in der Ausgabe von fdisk durch den Stern *
angezeigt wird und in der Partitionstabelle durch die Belegung des ersten Bytes mit dem Wert 0x80
ausgedrückt wird. Des Weiteren kann der Ausgabe von fdisk das Linux
Format mit dem Wert 0x83
im fünften Byte gegenüber gestellt werden, was laut og Tabelle Linux nativ
entspricht.
Die grün eingefärbte Partition wird als Typ Extended
angezeigt, was wiederum mit der 5
sowohl in der fdisk-Ausgabe wie auch in der Partitionstabelle im fünften Byte 0x05
angezeigt wird. Das erste Byte in der Partitionstabelle ist mit 0x00
belegt, was sich in der Ausgabe von fdisk durch das fehlen des Sterns in der Spalte Boot
bestätigen lässt.
Die Festplattensignatur ist blau markiert und wird in der hexadezimalen Ausgabe oben (ebenfalls blau markiert) mit 03 7e 09 00
angegeben, was auf einem Little Endian System als 0x00097e03
quasi rückwärts gelesen interpretiert wird. Die restlichen Angaben der Größen und Sektorenanzahl betreffend werden ebenfalls aus den Angaben im MBR entnommen. So entsprechen zB die in er fdisk Ausgabe angegebenen 340.992 (1 KiB) Blöcke den im MBR angegebenen Wert: (00 68 0a 00(16)
→ 0xa6800
(little endian) → 681.984(10)
), wobei hier aber eine 512 Byte Blockgröße verwendet wird, was eben genau 340.992 * 2
entspricht.