skweez.net

System auf GUID Partition Table umstellen

by mks
20.11.2010

Note: An English version of this article is available.

Disclaimer: Dieser Artikel ist keine Schritt-für-Schritt-Anleitung für Anfänger! Ich habe alles auf Arch Linux durchgeführt, darum können die Pfadangaben auf Ubuntu leicht abweichen. Veränderungen an der Partitionstabelle und am Master Boot Record sind immer riskant! Mache Backups! Ich bin nicht verantwortlich für verlorene Daten!

Dieser Artikel beschreibt, wie man ein Linux-System von einer MSDOS-Partitionstabelle auf den neuen GUID Partition Table-Standard (GPT) umstellen kann. GPT ist Teil der EFI-Spezifikation und wird somit wahrscheinlich sehr bald in den meisten Desktops und Notebooks Einzug halten. Apple benutzt EFI und GPT bereits großflächig in seinen Systemen und auch IA64-basierte Server und Workstations setzen auf den neuen Standard. Aber auch wenn man noch ein BIOS-basiertes System sein Eigen nennt, kann man GPT nutzen.

MSDOS-Partitionstabellen werden im sog. Master Boot Record (MBR) gespeichert. Dieser ist der erste Sektor auf der Festplatte und somit 512 Byte groß. Der MBR enthält aber auch noch den Boot-Loader, der bereits 440 Byte in Anspruch nimmt. Die Partitionstabelle muss seit eh und je in 64 Byte passen. Das ist der Grund, warum man eigtl. höchstens vier Partitionen anlegen kann (dabei benötigt jeder Eintrag genau 16 Byte). Weil die Größe einer Partition in 32 Bit gespeichert wird, kann jede auch "nur" 2 Terabyte groß sein.

Wer von den Einschränkungen durch MBR-Partitionstabellen die Nase voll hat, insbesondere von der Begrenzung auf vier primäre Partitionen und den Hack mit erweiterten Partitionen, der kann sich GPT als Alternative anschauen. Mit GPT kann man 128 Partitionen anlegen, jede maximal 8192 Exabyte groß.

Was man braucht

Das fdisk-Tool kann nicht mit GPT umgehen. Man braucht daher gdisk, das aber nahezu gleich bedient wird. Außerdem benötigt man einen GPT-kompatiblen Boot-Loader. Der alte GRUB 0.97 benötigt dazu einen Patch, GRUB2 kann aber einwandfrei mit GPT umgehen. Ich benutze allerdings extlinux, das mit syslinux daherkommt, weil ich das Konfigurationssystem von GRUB2 nicht mag.

Wenn man das erste Mal auf GPT umstellt, muss man außerdem die erste Partition um 33 Sektoren verschieben (das ist die Größe, die die neue Tabelle braucht). Wenn man, wie ich, eine extra /boot-Partition hat, dann ist das kein Problem, ansonsten sollte man evtl. bis zur nächsten Neuinstallation warten. ;-)

Kombatibilität

Linux kann GPT-formatierte Platten mounten und auch davon booten. Man sollte aber vorher prüfen, ob der Kernel mit GPT-Unterstützung kompiliert wurde.

$ zgrep CONFIG_EFI_PARTITION /proc/config.gz

CONFIG_EFI_PARTITION=y # we're ready to go

Auch FreeBSD kann von GPT booten, was ich aber nicht getestet habe. Windows kann ohne Weiteres nicht auf BIOS-basierten Systemen von GPT-Platten booten! Wenn sich also Linux die Platte mit Windows teilt, sollte man noch darauf verzichten.

Let's rock'n'roll

Zuerst habe ich syslinux und gdisk aus den Repositories installiert. Man braucht mindestens syslinux 4.0. Wenn man noch nicht Ubuntu 10.10 installiert hat, muss man es daher selbst kompilieren.

Dann habe ich extlinux in den MBR mit herkömmlicher Partitionstabelle installiert, um zu testen ob es überhaupt geht und eine funktionierende Konfiguration zu erstellen. Nicht vergessen, /boot zu mounten; sda an das eigene System anpassen!

$ dd if=/usr/lib/syslinux/mbr.bin of=/dev/sda # Copy bootloader to MBR
$ mkdir /boot/extlinux
$ extlinux --install /boot/extlinux
$ cp /usr/lib/syslinux/menu.c32 /boot/extlinux

Nun muss man /boot/extlinux/extlinux.conf anlegen und entsprechend dem eigenen System anpassen. Das manual `man syslinux` hilft dabei. Meine sieht folgendermaßen aus. Deine muss sicherlich anders aussehen!

default menu.c32
prompt 0
menu title Arch Linux
timeout 30

label linux
 menu label Linux
 kernel ../vmlinuz26
 append initrd=../kernel26.img root=/dev/sda3 ro resume=/dev/sda2 quiet

Nachdem die extlinux-Konfiguration funktionierte, habe ich die System Rescue CD gebootet. Die folgenden Schritte kann man nicht auf dem laufenden System machen, da man die Partitionstabelle verändern und dann mit der neuen Tabelle den Boot-Loader installieren muss. Der Kernel liest die Tabelle aber erst beim Reboot neu ein, der aber nicht funktioniert, solange man den Loader noch nicht installiert hat.

Auf dem laufenden Live-CD-System habe ich meine Partitionen eingehängt und /boot gesichert.

$ mkdir /mnt/host
$ mount /dev/sda3 /mnt/host
$ mount /dev/sda1 /mnt/host/boot
$ cd /mnt/host
$ tar cf boot.tar boot/
$ umount boot/

Jetzt habe ich gdisk gestartet. Es bringt beim ersten Start die Meldung, dass man eine MBR-Tabelle hat, welche es konvertiert hat und dass man die erste Partition löschen oder verkleinern/verschieben muss. Also löscht man sie und legt sie weiter hinten neu an.

$ gdisk /dev/sda
Command (? for help): d
Partition number (1-4): 1

Command (? for help): n
Partition number (1-128, default 1): 1
First sector (34-312581774, default = 34) or {+-}size{KMGTP}: 
Last sector (34-112454, default = 112454) or {+-}size{KMGTP}: 
Current type is 'Linux/Windows data'
Hex code or GUID (L to show codes, Enter = 0700): 
Changed type of partition to 'Linux/Windows data'

Command (? for help): x

Expert command (? for help): a
Partition number (1-4): 1
Known attributes are:
0: system partition
1: hide from EFI
2: legacy BIOS bootable
60: read-only
62: hidden
63: do not automount

Toggle which attribute field (0-63, 64 or <Enter> to exit): 2

Attribute value is 0000000000000004. Set fields are:
2 (legacy BIOS bootable)

Command (? for help): w

Jetzt hat man die Partitionstabelle zu einer GPT konvertiert. Letzter Schritt: den Inhalt von /boot wiederherstellen und extlinux nochmal installieren, diesmal aber mit dem Loader-Code für GPTs (gptmbr.bin).

$ mkfs.ext2 /dev/sda1
$ mount /dev/sda1 /mnt/host/boot
$ cd /mnt/host
$ tar xf boot.tar
$ dd if=/mnt/host/usr/lib/syslinux/gptmbr.bin of=/dev/sda
$ extlinux --install /mnt/host/boot/extlinux

Wenn alles glatt gelaufen ist, hat man nun ein GPT-System. Viel Glück! :-)

$ reboot

Referenzen (Englisch)