Linux fdisk

Aus Xinux Wiki
Zur Navigation springen Zur Suche springen

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 mit od -x ausgelesen, erscheint aa55, 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, die fdisk als Disk identifier anzeigt.
  • Ab 0x1CE folgen die Einträge 2 bis 4, hier alle leer.

Primäre, erweiterte und logische Partitionen

part-1
empty app.diagrams.net chart

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: dos für MBR, gpt fü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 +250M oder +2G an, 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: 8e für LVM und fd fü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 partprobe auf, oder man startet neu.
# partprobe /dev/sdb