FIXME[[:it|{{ :xeon.png?40|}}]] =====GUID Partition Table (GPT)===== Die >>GUID Partition Table (GPT)<< (Global Unique Identifier)((http://de.wikipedia.org/wiki/GUID_Partition_Table)) ist ein Standard zur Speicherung der Partitionstabelle auf Datenträgern und der Nachfolger des bislang üblichen >>[[:it:mbr|Master Boot Record (MBR)]]<<. >>GPT<< ist Teil der EFI-Spezifikation (bzw. >>UEFI<<((http://de.wikipedia.org/wiki/Unified_Extensible_Firmware_Interface))), 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.((http://de.wikipedia.org/wiki/GUID_Partition_Table#Unterst.C3.BCtzung_in_Betriebssystemen)) ====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: * ''**EE16**'': Legacy MBR mit folgendem >>EFI-Header<< (>>BIOS-basiertes<< System) * ''**EF16**'': Natives >>EFI-basiertes<< System. 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:((http://de.wikipedia.org/wiki/GUID_Partition_Table#Header_der_GUID-Partitionstabelle)) ^ 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 | ''0x0000__01__00'' | ''**Version**'': Die Revisions-Nummer der EFI-Spezifikation zu welcher dieser >>GPT-Header<< gehört. Hier Version 1.0. | | 0x0C | 4 | ''0x__5c__000000'' | ''**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 | ''0x__01__00000000000000'' | ''**Primary LBA**'': Die logische Block Adresse, welche den >>GPT-Header<< enthält. Entspricht immer >>LBA 1<< | | 0x20 | 8 | ''0x__ffff9f__0000000000'' | ''**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 | ''0x__deff9f__0000000000'' | ''**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 | ''0x__02__00000000000000'' | ''**Partition Entry LBA**'': Die Start-LBA des GUID Partitions Array. Dies ist immer >>LBA 2<< | | 0x50 | 4 | ''0x__80__000000'' | ''**Number of Partition Entries**'': Die maximale Anzahl der Partitionen | | 0x54 | 4 | ''0x__80__000000'' | ''**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:((http://de.wikipedia.org/wiki/GUID_Partition_Table#Partitionseintrag)) ^ Offset ^ Bytes ^ Beispiel ^ Definition ^ | 0x00 | 16 | ''0x4861682149646f6e744e656564454649'' | Partitionstyp GUID | | 0x16 | 16 | ''0xcca36fd30aea8a4fb762000495a98ae8'' | Einzigartige Partitions GUID | | 0x32 | 8 | ''__22__00000000000000'' | Beginn der Partition: Erster LBA (Little Endian) | | 0x40 | 8 | ''__c307__000000000000'' | 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 problematisch((http://www.rodsbooks.com/gdisk/booting.html#windows)) 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<<((http://en.wikipedia.org/wiki/BIOS_Boot_partition)) 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 Alignment((http://en.wikipedia.org/wiki/1_MB_partition_alignment#1_MB_alignment)) 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)