Linux fdisk
Eine Platte muss aufgeteilt werden, bevor Dateisysteme darauf entstehen können. Wie diese Aufteilung abgelegt wird, regelt das Partitionsschema. Dieser Artikel behandelt den MBR und das Werkzeug fdisk. Das neuere Schema GPT und der zugehörige Editor gdisk sind in einem eigenen Artikel beschrieben.
Master Boot Record
- Bei einer MBR-partitionierten Platte liegen im ersten Sektor – 512 Byte – der Bootcode, die Partitionstabelle und eine Kennung.
- Bei GPT-Platten ist dieser Sektor ebenfalls belegt, enthält dann aber nur einen Schutzeintrag.
Abbildung 1: Aufbau des MBR und eines Partitionseintrags
Bootcode
- 446 Byte groß.
- Hier liegt die erste Stufe des Bootloaders. Bei GRUB 2 ist das nur ein Sprungbefehl in den Bereich hinter dem MBR.
Partitionstabelle
- 64 Byte groß, aufgeteilt in vier Einträge zu je 16 Byte.
- Vier Einträge bedeuten vier primäre Partitionen – mehr sieht der MBR nicht vor.
| Byte | Länge | Inhalt |
|---|---|---|
| 0 | 1 | Bootindikator: 0x80 = aktiv, 0x00 = inaktiv |
| 1–3 | 3 | Anfang der Partition in CHS-Notation |
| 4 | 1 | Partitionstyp (Systemkennung) |
| 5–7 | 3 | Ende der Partition in CHS-Notation |
| 8–11 | 4 | Anfang der Partition als LBA |
| 12–15 | 4 | Länge der Partition in Sektoren |
- Ausgewertet werden heute nur die beiden LBA-Felder. Die CHS-Angaben stammen aus der Zeit, als das BIOS die Geometrie brauchte, und sind bei großen Platten schlicht falsch.
- Anfang und Länge sind je 32 Bit breit. Bei 512-Byte-Sektoren ergibt das 2 TiB als größte adressierbare Platte – genau diese Grenze hat GPT abgelöst.
Kennung
- 2 Byte groß, die letzten beiden Byte des Sektors.
- Auf der Platte stehen die Byte
55 AA. Wird sie mitod -xausgelesen, erscheintaa55, weil dieses Werkzeug 16-Bit-Wörter little endian ausgibt.
Wichtige Partitionstypen
| Hex | Bedeutung |
|---|---|
| 83 | Linux |
| 82 | Linux Swap |
| 8e | Linux LVM |
| fd | Linux RAID autodetect |
| ef | EFI System Partition |
| ee | GPT Protective (Platte ist in Wahrheit GPT-partitioniert) |
| 05 / 0f | erweiterte Partition |
Den MBR ansehen
# dd if=/dev/sdb bs=512 count=1 status=none | hexdump -C
hexdump -C zeigt die Byte in der Reihenfolge, in der sie auf der Platte stehen. Mit od geht es ebenfalls, dann aber byteweise statt in Wörtern:
# od -A d -t x1 -N 512 /dev/sdb
Interessant sind drei Stellen: der Beginn bei 0x000, die Tabelle ab 0x1BE und die Kennung bei 0x1FE.
000001b0 00 00 00 00 00 00 00 00 7b 9a 3b 98 00 00 80 20 000001c0 21 00 83 ef 1c 10 00 08 00 00 00 00 10 00 00 00 000001d0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 000001e0 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
Der erste Eintrag beginnt bei 0x1BE und lässt sich Byte für Byte lesen:
| Byte | Wert | Bedeutung |
|---|---|---|
| 0 | 80 |
aktiv (bootfähig) |
| 1–3 | 20 21 00 |
Anfang in CHS |
| 4 | 83 |
Typ Linux |
| 5–7 | ef 1c 10 |
Ende in CHS |
| 8–11 | 00 08 00 00 |
Start-LBA 2048 (little endian) |
| 12–15 | 00 00 10 00 |
1048576 Sektoren = 512 MiB |
- Die vier Byte bei 0x1B8 (
7b 9a 3b 98) sind die Disk-Signatur, diefdiskals Disk identifier anzeigt. - Ab 0x1CE folgen die Einträge 2 bis 4, hier alle leer.
Primäre, erweiterte und logische Partitionen
Abbildung 2: Aufteilung einer MBR-Platte
- Der MBR kennt genau vier Einträge. Einer davon darf eine erweiterte Partition sein.
- Die erweiterte Partition ist nur ein Container ohne eigenes Dateisystem. In ihr werden die logischen Partitionen in einer verketteten Liste verwaltet.
- Logische Partitionen werden immer ab 5 nummeriert, auch wenn nur drei primäre existieren.
- Der Kernel führt für sd-Geräte höchstens 15 Partitionen je Platte.
fdisk, der Partitionstabelleneditor
fdisk teilt eine Platte in Partitionen ein, löscht bestehende und ändert deren Systemkennung. Es gibt zwei Betriebsarten: den List-Modus und den interaktiven Modus.
List-Modus
# fdisk -l /dev/sdb Disk /dev/sdb: 1 GiB, 1073741824 bytes, 2097152 sectors Disk model: QEMU HARDDISK Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disklabel type: dos Disk identifier: 0x983b9a7b Device Boot Start End Sectors Size Id Type /dev/sdb1 2048 1050623 1048576 512M 83 Linux /dev/sdb2 1050624 2097151 1046528 511M 83 Linux
- Gerechnet wird in Sektoren, nicht mehr in Zylindern. Ältere Anleitungen zeigen hier noch Köpfe, Spuren und Zylinder – diese Darstellung ist seit util-linux 2.26 verschwunden.
- Disklabel type verrät das Schema:
dosfür MBR,gptfür GPT.
Interaktiver Modus
# fdisk /dev/sdb Befehl (m für Hilfe):
Solange nicht mit w geschrieben wird, passiert auf der Platte nichts. q verwirft alles.
Die wichtigsten Kommandos
| Taste | Wirkung |
|---|---|
m |
Hilfe anzeigen |
p |
Partitionstabelle anzeigen |
n |
neue Partition anlegen |
d |
Partition löschen |
t |
Partitionstyp ändern |
a |
Bootflag umschalten (nur MBR) |
F |
freien Platz anzeigen |
i |
Details zu einer Partition |
v |
Tabelle prüfen |
o |
neue leere MBR-Tabelle anlegen |
g |
neue leere GPT-Tabelle anlegen (siehe eigenen Artikel) |
O / I |
Layout als sfdisk-Skript sichern / laden |
w |
schreiben und beenden |
q |
beenden ohne zu schreiben |
Eine primäre Partition anlegen
Befehl (m für Hilfe): n
Partitionstyp
p Primär (0 primär, 0 erweitert, 4 frei)
e Erweitert (Container für logische Partitionen)
Wählen (Vorgabe p): p
Partitionsnummer (1-4, Vorgabe 1): 1
Erster Sektor (2048-2097151, Vorgabe 2048):
Letzter Sektor, +/-Sektoren oder +/-Größe{K,M,G,T,P} (2048-2097151, Vorgabe 2097151): +250M
Eine neue Partition 1 des Typs „Linux" und der Größe 250 MiB wurde erstellt.
- Beide Vorgaben lassen sich mit der Eingabetaste übernehmen. Der Vorschlag ist immer der erste freie Sektor.
- Die Größe gibt man als
+250Moder+2Gan, statt Sektoren auszurechnen.
Eine erweiterte Partition anlegen
Befehl (m für Hilfe): n
Partitionstyp
p Primär (1 primär, 0 erweitert, 3 frei)
e Erweitert (Container für logische Partitionen)
Wählen (Vorgabe p): e
Partitionsnummer (2-4, Vorgabe 2): 2
Erster Sektor (514048-2097151, Vorgabe 514048):
Letzter Sektor, +/-Sektoren oder +/-Größe{K,M,G,T,P} (514048-2097151, Vorgabe 2097151):
Eine neue Partition 2 des Typs „Extended" und der Größe 773 MiB wurde erstellt.
Logische Partitionen anlegen
Befehl (m für Hilfe): n
Alle Primärpartitionen sind in Verwendung.
Logische Partition wird hinzugefügt 5
Erster Sektor (516096-2097151, Vorgabe 516096):
Letzter Sektor, +/-Sektoren oder +/-Größe{K,M,G,T,P} (516096-2097151, Vorgabe 2097151): +250M
Eine neue Partition 5 des Typs „Linux" und der Größe 250 MiB wurde erstellt.
- Der erste Sektor liegt 2048 Sektoren hinter dem Anfang der erweiterten Partition. Der Platz davor nimmt den Verkettungssektor auf.
Den Partitionstyp ändern
Befehl (m für Hilfe): t Partitionsnummer (1,2,5, Vorgabe 5): 5 Hex code oder Alias (Typ L zum Auflisten aller): 8e Der Typ der Partition „Linux" wurde in „Linux LVM" geändert.
- Der Typ ist nur eine Kennzeichnung. Er legt kein Dateisystem an und hindert niemanden daran, etwas anderes darauf zu schreiben.
- Trotzdem gehört er gesetzt:
8efür LVM undfdfür RAID sind das, wonach Werkzeuge und Init-System suchen.
Schreiben oder verwerfen
Befehl (m für Hilfe): w Die Partitionstabelle wurde verändert. Rufe ioctl() um Partitionstabelle neu einzulesen. Synchronisiere Platten.
Ohne Schreiben:
Befehl (m für Hilfe): q
Ausrichtung
- Aktuelle Versionen beginnen die erste Partition bei Sektor 2048, also bei 1 MiB.
- Der Grund: Platten mit 4-KiB-Sektoren, Erase-Blöcke von SSDs und Stripes von RAID-Verbünden. Eine falsch ausgerichtete Partition führt dazu, dass jeder Schreibzugriff zwei physische Blöcke berührt statt einen.
- Prüfen lässt sich das an der Spalte Start in der Ausgabe von
fdisk -l: steht dort 2048, stimmt die Ausrichtung.
Nach dem Schreiben: den Kernel informieren
Ist eine Partition der Platte gerade in Benutzung, kann der Kernel die neue Tabelle nicht sofort übernehmen und fdisk meldet:
WARNUNG: Neueinlesen der Partitionstabelle führte zu Fehler 16: Device or resource busy. Der Kernel benutzt noch die alte Tabelle.
- Ursache ist fast immer eine gemountete Partition oder ein aktives Swap auf derselben Platte.
- Solange die alte Tabelle gilt, arbeitet das System mit den alten Grenzen weiter. Entweder man löst die Blockade und ruft
partprobeauf, oder man startet neu.
# partprobe /dev/sdb

