Inhaltsverzeichnis

FIXME

GUID Partition Table (GPT)

Die »GUID Partition Table (GPT)« (Global Unique Identifier)1) ist ein Standard zur Speicherung der Partitionstabelle auf Datenträgern und der Nachfolger des bislang üblichen »Master Boot Record (MBR)«. »GPT« ist Teil der EFI-Spezifikation (bzw. »UEFI«2)), welches zukünftig das »BIOS« eines Computers ablösen soll. Mit »EFI« bzw. »GPT« wurden einige Probleme, hauptsächlich zu geringer Adressierbarkeit, gelöst.

Beim »MBR« konnten bislang einige Tricks angewendet werden, um sein Überleben bis heute zu sichern aber im Prinzip war das Konzept schon lange überholt. Waren in der Partitionstabelle des »MBR« noch vier (primäre) Partitionen möglich, sind es in der »GPT« 128 (und ggf mehr) und hatte der »MBR« noch ein 32 Bit großes Adressfeld, was bei einer Sektorengröße von 512 Byte eine Partitionsgröße von maximal 2 TiB zulässt (232 * 512) sind diese in der »GPT« 64 Bit groß, was theoretisch exorbitant große Partitionen von bis zu 8 ZiB (Zettabyte → etliche Milliarden TiB) zulassen würde. Der Bootloader passt nur noch zum Teil in den »MBR« und die ursprüngliche Cylinder-Head-Sector »CSH« Adressierung wurde zur heutigen Logical-Block-Address »LBA« Adressierung. Damit konnte man eigentlich recht gut leben aber dann kamen Festplatten > 2 TiB und damit das endgültige Ende des »MBR«

Nun obwohl ein modernes Computersystem jetzt ein »EFI« zum Starten des Computers und eine »GPT« zum Initialisieren des Datenträgers verwenden sollte, haben solche, doch signifikante, Änderungen gerade in der Übergangszeit doch recht erhebliche Ansprüche an Flexibilität. So sollte gewährleistet sein, dass ein »BIOS« betriebenes System auch von einen »GPT« Datenträger booten konnte usw. Vor allem die älteren Betriebssysteme, wie zB Windows XP in der 32 Bit Ausführung kamen hier deutlich an ihre Grenzen, wobei zB ein 64 Bit Linux System mit GRUB2 gänzlich ohne »UEFI« bzw. ohne spezieller »BIOS« Erweiterungen von einem »GPT« Datenträger booten kann.3)

Der Aufbau

MBR

Der erste Sektor einer Festplatte »LBA 0«, welcher bisher den »MBR« beinhaltete, enthält bei »GPT« formatierten Datenträgern aus Gründen der Abwärtskompatibilität weiterhin einen klassischen aber geschützten »MBR«. Dadurch soll einerseits gewährleistet werden, dass nicht »GPT« kompatible Partitionierungstools nicht fälschlicherweise Weise einen leeren Datenträger sehen und Betriebssysteme, welche »GPT« noch nicht verstehen, immer noch etwas mit dem Datenträger anfangen können, wenn auch mit einigen Einschränkungen.

Hier ein Beispiel des »MBR« Teils eines »GPT« formatierten Datenträgers, welches von einem »BIOS« System gestartet wird:

LBA 0:

# dd if=/dev/sda bs=1 count=512 | hexdump -C
00000000  eb 63 90 00 00 00 00 00  00 00 00 00 00 00 00 00  |.c..............|
00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
00000050  00 00 00 00 00 00 00 00  00 00 00 80 22 00 00 00  |............"...|
00000060  00 00 00 00 ff fa eb 07  f6 c2 80 75 02 b2 80 ea  |...........u....|
00000070  74 7c 00 00 31 c0 8e d8  8e d0 bc 00 20 fb a0 64  |t|..1....... ..d|
00000080  7c 3c ff 74 02 88 c2 52  be 80 7d e8 1c 01 be 05  ||<.t...R..}.....|
00000090  7c f6 c2 80 74 48 b4 41  bb aa 55 cd 13 5a 52 72  ||...tH.A..U..ZRr|
000000a0  3d 81 fb 55 aa 75 37 83  e1 01 74 32 31 c0 89 44  |=..U.u7...t21..D|
000000b0  04 40 88 44 ff 89 44 02  c7 04 10 00 66 8b 1e 5c  |.@.D..D.....f..\|
000000c0  7c 66 89 5c 08 66 8b 1e  60 7c 66 89 5c 0c c7 44  ||f.\.f..`|f.\..D|
000000d0  06 00 70 b4 42 cd 13 72  05 bb 00 70 eb 76 b4 08  |..p.B..r...p.v..|
000000e0  cd 13 73 0d f6 c2 80 0f  84 d8 00 be 8b 7d e9 82  |..s..........}..|
000000f0  00 66 0f b6 c6 88 64 ff  40 66 89 44 04 0f b6 d1  |.f....d.@f.D....|
00000100  c1 e2 02 88 e8 88 f4 40  89 44 08 0f b6 c2 c0 e8  |.......@.D......|
00000110  02 66 89 04 66 a1 60 7c  66 09 c0 75 4e 66 a1 5c  |.f..f.`|f..uNf.\|
00000120  7c 66 31 d2 66 f7 34 88  d1 31 d2 66 f7 74 04 3b  ||f1.f.4..1.f.t.;|
00000130  44 08 7d 37 fe c1 88 c5  30 c0 c1 e8 02 08 c1 88  |D.}7....0.......|
00000140  d0 5a 88 c6 bb 00 70 8e  c3 31 db b8 01 02 cd 13  |.Z....p..1......|
00000150  72 1e 8c c3 60 1e b9 00  01 8e db 31 f6 bf 00 80  |r...`......1....|
00000160  8e c6 fc f3 a5 1f 61 ff  26 5a 7c be 86 7d eb 03  |......a.&Z|..}..|
00000170  be 95 7d e8 34 00 be 9a  7d e8 2e 00 cd 18 eb fe  |..}.4...}.......|
00000180  47 52 55 42 20 00 47 65  6f 6d 00 48 61 72 64 20  |GRUB .Geom.Hard |
00000190  44 69 73 6b 00 52 65 61  64 00 20 45 72 72 6f 72  |Disk.Read. Error|
000001a0  0d 0a 00 bb 01 00 b4 0e  cd 10 ac 3c 00 75 f4 c3  |...........<.u..|
000001b0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
000001c0  01 00 ee fe ff ff 01 00  00 00 ff ff 9f 00 00 00  |................|
000001d0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
000001f0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 55 aa  |..............U.|

Die ersten 440 Byte dieses »MBR« enthalten, wie im klassischen »MBR« auch, idR den ersten Teil »Stage 1« des Bootloaders. Da ein »BIOS« gebootetes System den Bootloader immer im ersten Sektor der Festplatte und somit im »MBR« sucht, wurde aus Gründen der Abwärtskompatibilität dies auch in der »GPT« so beibehalten. Aber schon zu Zeiten von klassischen MBR-formatierten Datenträgern waren die 440 zur Verfügung stehenden Bytes nicht mehr ausreichend, weswegen sich im MBR idR nur ein Teil des Bootloaders befindet (»Stage 1«), dieser lädt dann den nächsten Teil »Stage 2«, welcher sich bereits irgendwo auf einer Partition des Datenträgers befindet und bei sehr komplexen Bootloadern wird dann uU sogar noch ein dritter Teil geladen »Stage 3«

Damit das System erkennt ob es von einem »MBR-« oder »GPT«-formatierten Datenträger bootet, wird ein bestimmter Wert als Partitionstyp (»0xEE« bzw. »0xEF«) in die Partitionstabelle der ersten Partition eingetragen:

Dadurch erkennt nun das System, dass es sich um einen »GPT«-formatierten Datenträger handelt. Nicht »GPT«-kompatible Systeme erkennen hier eine Partition über den gesamten Datenträger, »GPT«-kompatible Systeme hingegen springen dann zum nächsten Abschnitt, welcher je nach Art der »GPT« (0xEE bzw. 0xEF) unterschiedlich angesprochen wird.

Primärer/Sekundärer GPT (Header)

Im zweiten Sektor der Festplatte »LBA 1« befindet sich der Header der primären »GPT«, welcher neben der Anzahl der benutzbaren »LBAs« pro Partition zB auch die Position des Headers definiert, es werden einige Start- und Ende-LBAs definiert usw. Des Weiteren werden einige »CRC32 Prüfsummen« gespeichert, welche die Integrität des »GPT-Headers« und der Partitionstabellen verifizieren. Falls der »primäre GPT-Header« korrupt sein sollte, wird die Checksumme der »sekundären GPT« verglichen. Ist die gültig, wird der »primäre GPT-Header« aus dem sekundären wieder hergestellt (und umgekehrt). Aus diesem Grund ist es wichtig Änderungen an einer »GPT« nur mit geeigneten Werkzeugen durchzuführen, weil andernfalls der »GPT-Header« korrupt wird.

LBA 1:

# dd if=/dev/sda bs=1 count=512 skip=512 | hexdump -C
00000000  45 46 49 20 50 41 52 54  00 00 01 00 5c 00 00 00  |EFI PART....\...|
00000010  ff 92 29 46 00 00 00 00  01 00 00 00 00 00 00 00  |..)F............|
00000020  ff ff 9f 00 00 00 00 00  22 00 00 00 00 00 00 00  |........".......|
00000030  de ff 9f 00 00 00 00 00  3b e2 5f f5 35 bb 16 40  |........;._.5..@|
00000040  86 ce e1 a8 9b ac 19 b9  02 00 00 00 00 00 00 00  |................|
00000050  80 00 00 00 80 00 00 00  cd 1a 88 22 00 00 00 00  |..........."....|
00000060  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
00000200

Der hier dargestellte Inhalt des zweiten logischen Blockes »LBA 1« eines »GPT«-formatierten Datenträgers gliedert sich wie folgt:4)

Byte Offset Bytes Beispiel Definition
0x00 8 0x4546492050415254 Signatur: Wird benutzt um alle EFI-kompatiblen »GPT-Headers« zu identifizieren und entspricht immer den hier dargestellten Wert.
0x08 4 0x00000100 Version: Die Revisions-Nummer der EFI-Spezifikation zu welcher dieser »GPT-Header« gehört. Hier Version 1.0.
0x0C 4 0x5c000000 Header Size: Die Größe in Bytes des »GPT-Headers«. Der Wert entspricht immer »0x5C« oder 92 Bytes. Die restlichen Bytes sind reserviert
0x10 4 0xff922946 CRC32 Checksum: Wird benutzt um die Integrität des »GPT-Headers« sicherzustellen.
0x14 4 0x00000000 Reserviert: Muss 0x00000000 sein
0x18 8 0x0100000000000000 Primary LBA: Die logische Block Adresse, welche den »GPT-Header« enthält. Entspricht immer »LBA 1«
0x20 8 0xffff9f0000000000 Backup LBA: Die logische Block Adresse des »Backup GPT-Headers«. Dieser Wert entspricht immer den letzten LBA des Datenträgers
0x28 8 0x2200000000000000 First Usable LBA: Die logische Blockadresse an welcher die erste Partition beginnt.
0x30 8 0xdeff9f0000000000 Last Usable LBA: Die logische Block Adresse der letzten benutzbaren LBA
0x38 16 0x3be25ff535bb164086cee1a89bac19b9 Disk GUID: Eindeutige Identifikationsnummer des »GPT-Headers« und des Datenträgers selbst
0x48 8 0x0200000000000000 Partition Entry LBA: Die Start-LBA des GUID Partitions Array. Dies ist immer »LBA 2«
0x50 4 0x80000000 Number of Partition Entries: Die maximale Anzahl der Partitionen
0x54 4 0x80000000 Size of Partition Entry: Die maximale Länge eines GUID Partitionseintrag → 128 Byte
0x58 4 0xcd1a8822 CRC32 Checksum: Checksumme der GUID Partitions Einträge
0x5C 420 Immer Null Reserviert: Muss 0x00000000… sein

Partitionseinträge

Ab »LBA 2« bis »LBA 33« befinden sich die einzelnen Partitionseinträge. Die Spezifikation sieht dafür mindestens 32 Sektoren resp. 32 LBAs vor, was dem og Eintrag Number of Partition Entries (0x80) entspricht. Daraus ergeben sich 128 adressierbare Partitionen (32 * 512 / 128 = 128). Die Anzahl der Sektoren für die Partitionseinträge kann beliebig erhöht werden und wird theoretisch nur durch den insgesamt verfügbaren Platz des Datenträgers begrenzt.

LBA 2:

# dd if=/dev/sda bs=1 count=128 skip=1024 | hexdump -C
00000000  48 61 68 21 49 64 6f 6e  74 4e 65 65 64 45 46 49  |Hah!IdontNeedEFI|
00000010  cc a3 6f d3 0a ea 8a 4f  b7 62 00 04 95 a9 8a e8  |..o....O.b......|
00000020  22 00 00 00 00 00 00 00  c3 07 00 00 00 00 00 00  |"...............|
00000030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
00000080

Dieser 128 Byte Hexdump des »LBA 2« beinhaltet folgende Informationen:5)

Offset Bytes Beispiel Definition
0x00 16 0x4861682149646f6e744e656564454649 Partitionstyp GUID
0x16 16 0xcca36fd30aea8a4fb762000495a98ae8 Einzigartige Partitions GUID
0x32 8 2200000000000000 Beginn der Partition: Erster LBA (Little Endian)
0x40 8 c307000000000000 Ende der Partition: Letzter LBA (Little Endian)
0x48 8 0x0000000000000000 Attribute
0x56 72 Partitionsname

BIOS-basiertes System von einem GPT Datentraeger booten

Es gibt Leute, welche der Meinung sind, dass man mit einem BIOS-System nicht von einem »GPT-formatierten« Datenträger booten kann (Ich gehörte bis vor kurzem auch dazu). Das stimmt aber nicht, oder zumindest zT nicht. Windows ist hier eher problematisch6) aber diesem Tutorial zB liegt ein Linux Debian 32-Bit System zu Grunde, welches problemlos in diesem Setup funktioniert.

BIOS Boot Partition

Wie bereits angemerkt passen moderne Bootloader nicht mehr in den 440 Byte großen Platz, welcher im MBR dafür vorgesehen ist. Deswegen ist der Bootloader meistens in mehrere Teile aufgeteilt (»Stage«), wobei der erste Teil »Stage 1« im »MBR« untergebracht ist. Wie dann ggf der zweite Teil des Bootloaders geladen wird, hängt vom Bootloader selbst ab. In konventionellen BIOS-basierten Systemen befindet sich hinter dem ersten Sektor, welcher den MBR beinhaltet, ein kleines Loch bevor die erste Partition anfängt; ein sogenanntes »Post-MBR-Gap«, die Größe hängt von der Ausrichtung der Partitionen an den Sektoren ab. Dieses Loch wurde von manchen Bootloadern benutzt, um den »Stage 2« Bootloader unterzubringen. Diese Post-MBR Loch fehlt allerdings bei einem GPT-formatierten Datenträger, weil sich hier im Anschluss an den MBR »LBA 0« sofort der »GPT-Header« auf »LBA 1« befindet. Aus diesem Grund besteht bei GPT-kompatiblen Disk-Partitionierungs-Utilities die Möglichkeit eine »BIOS-Boot-Partition«7) anzulegen. Diese Partition wird nicht gemountet und enthält auch kein Dateisystem.

Diese Partition benötigt idR nur sehr wenig Platz (ca. 30 KiB), wobei es sinnvoll ist das Partition-Alignment zu berücksichtigen, um die folgenden Partitionen korrekt auszurichten. Wenn Sie Ihre Partitionen nach dem 1 MiB Alignment8) ausrichten, dann wäre die logische Größe dieser Partition 1 oder 2 MiB.

Debian 6.0.6

An dieser Stelle mit dem Partition Alignment bin ich bei Debian über ein Problem gestolpert, welches mich zuerst ratlos dastehen ließ und was mich zu einer ganzen Reihe dummer Fragen in »de.comp.os.unix.linux.misc« verleitet hat. Ich war nicht in der Lage eine 1 MiB Partition anzulegen, weil der Installer bei der Partitionierung nur MB zugelassen hat, was nach dieser dämlichen neuen Notation nun mal nur 1000 KB sind und nicht 1024 KB, wie es eigentlich sein müsste (oder früher mal gewesen wäre)