Wie viele Partitionen pro Festplatte/SSD unterstützt Linux?

Über viele Jahre habe ich diese Frage mit 15 beantwortet. Gestern hat mich endlich ein Leser meiner Bücher darauf hingewiesen, dass dies falsch ist — es sind viel mehr Partitionen erlaubt. Wie viele sind es nun wirklich?

Ein Blick zurück in die Linux-Geschichte

Vor langer Zeit wurden Festplatten über den IDE-Bus angesprochen. Der IDE-Treiber von Linux unterstützte 63 Partitionen pro Festplatte.

Dann kamen IDE-Festplatten aus der Mode, außerdem wurden die SCSI-, SATA- und IDE-Treiber im Linux-Kernel zusammengeführt. Konsequenz: Zwar werden nun wesentlich mehr Disks zugleich unterstützt, aber nur mehr 15 Partitionen pro Festplatte (reicht ja meistens …).

Mit Kernel 2.6.0 (2003) wurde die Kombination aus Minor und Major Device Number von 16 auf 32 Bit erweitert (12 Bit für die Major Device Number, 20 für die Minor Device Number). Damit fand das Knausern mit den Device-Nummern ein Ende.

Mit Kernel 2.6.26 (2008) wurde die Major Device Number 259 als Block Extended Major reserviert (siehe lwn.net). An dieser Stelle können nun dynamisch (via udevd) Devices eingerichtet werden, wenn eine Festplatte/SSD mehr als 15 Partitionen hat. Damit ist Linux-seitig das Limit für die Anzahl der Partitionen gefallen. Dieser Meilenstein in der Linux-Kernel-Geschichte ist mir bisher entgangen …

GPT

Nachdem Linux seit 2008 also keine Probleme mit vielen Partitionen hat, stellt sich die Frage, welche Limits sich durch das Partitionierungsformat ergeben. Es gibt zwei Möglichkeiten, wie die Partitionstabelle gespeichert wird. Die zeitgemäße Variante ist die GUID Partition Table (GPT).

Der GPT-Standard sieht vor, dass GPT zumindest 128 Partitionen unterstützen muss. Die GPT kann aber u.U. sogar noch mehr Partitionen zulassen (siehe superuser.com). Bei meinen Tests (Partitionstabelle mit parted mit mklabel gpt eingerichtet) war bei 128 Partitionen aber Schluss. parted lieferte beim Versuch, mehr Partitionen einzurichten, die Fehlermeldung zu viele primäre Partitionen.

MBR

Beim MBR-Format wird die Partitionstabelle in den Master Boot Record geschrieben, also in den ersten Sektor der Festplatte. Es darf maximal vier primäre Partitionen geben. Eine dieser vier Partitionen darf statt primär auch erweitert (extended) sein. Die erweiterte Partition ist eine Art Container, der logische Partitionen aufnimmt.

Die Frage ist nur: Wie viele logische Partitionen sind innerhalb der erweiterten Partition erlaubt? Eine wirklich eindeutige Antwort habe ich nicht gefunden. (Wenn jemand mehr weiß, freue ich mich über eine Mail mit einem Link.)

parted war bei meinen Tests in der Lage, 60 logische Partitionen einzurichten. Mit drei primären und einer erweiterten Partition ergibt sich so eine Gesamtanzahl von 64 Partitionen, von denen 63 Dateisysteme aufnehmen können.

Test GPT

Gewissheit gibt nur ein Test. Das folgende Script geht davon aus, dass /dev/sdb ein Datenträger zum Experimentieren ist. (Ich habe VirtualBox verwendet und dort eine zweite virtuelle Festplatte mit 1 GiB eingerichtet.) Das Script legt auf dem Datenträger eine GPT an und versucht dann, 200 Partitionen zu je 1 MiB einzurichten. Bis zur 128. Partition gelingt das, dann treten Fehler auf (zu viele primäre Partitionen).

#!/bin/bash
parted /dev/sdb --script mklabel gpt
for x in {1..200}; do 
  echo "Partition $x"
  y=$[x+1]
  parted /dev/sdb --script mkpart bla ${x}MiB ${y}MiB
done

Die Ausführung des Scripts dauert ziemlich lange, weil die ständigen Änderungen an der Partitions-Tabelle samt dem Einrichten der Device-Dateien durch /lib/systemd/systemd-udevd erstaunlich viel Zeit beansprucht. Die automatisch erzeugten Device-Dateien sehen anschließend so aus:

ls -lv /dev/sdb*

brw-rw---- 1 root disk   8,  16 Mai 31 13:51 /dev/sdb
brw-rw---- 1 root disk   8,  17 Mai 31 13:51 /dev/sdb1
brw-rw---- 1 root disk   8,  18 Mai 31 13:51 /dev/sdb2
brw-rw---- 1 root disk   8,  19 Mai 31 13:51 /dev/sdb3
brw-rw---- 1 root disk   8,  20 Mai 31 13:51 /dev/sdb4
brw-rw---- 1 root disk   8,  21 Mai 31 13:51 /dev/sdb5
brw-rw---- 1 root disk   8,  22 Mai 31 13:51 /dev/sdb6
brw-rw---- 1 root disk   8,  23 Mai 31 13:51 /dev/sdb7
brw-rw---- 1 root disk   8,  24 Mai 31 13:51 /dev/sdb8
brw-rw---- 1 root disk   8,  25 Mai 31 13:51 /dev/sdb9
brw-rw---- 1 root disk   8,  26 Mai 31 13:51 /dev/sdb10
brw-rw---- 1 root disk   8,  27 Mai 31 13:51 /dev/sdb11
brw-rw---- 1 root disk   8,  28 Mai 31 13:51 /dev/sdb12
brw-rw---- 1 root disk   8,  29 Mai 31 13:51 /dev/sdb13
brw-rw---- 1 root disk   8,  30 Mai 31 13:51 /dev/sdb14
brw-rw---- 1 root disk   8,  31 Mai 31 13:51 /dev/sdb15
brw-rw---- 1 root disk 259,   1 Mai 31 13:51 /dev/sdb16
brw-rw---- 1 root disk 259,   2 Mai 31 13:51 /dev/sdb17
...
brw-rw---- 1 root disk 259, 224 Mai 31 13:51 /dev/sdb127
brw-rw---- 1 root disk 259, 225 Mai 31 13:51 /dev/sdb128

(Die relativ unbekannte ls-Option -v sortiert Ziffern vernünftig, d.h. /dev/sdb9 wird vor /dev/sdb10 eingeordnet, nicht umgekehrt.)

Test MBR

Für den MBR-Test habe ich das Script ein wenig abgewandelt:

#!/bin/bash
parted /dev/sdb --script mklabel msdos
parted /dev/sdb --script mkpart primary 1MiB 2MiB
parted /dev/sdb --script mkpart primary 2MiB 3MiB
parted /dev/sdb --script mkpart primary 3MiB 4MiB
parted /dev/sdb --script "mkpart extended 4MiB -1MiB"
for x in {5..100}; do 
  echo "Partition $x"
  parted /dev/sdb --script "mkpart logical ${x}MiB ${x}.9MiB"
done

Jede Partition reicht jeweils von n MiB bis (n + 0,9) MiB. Auf diese Weise habe ich die unsäglich blöden parted-Fehlermeldungen abgestellt, wonach eine Partition nicht da beginnen darf, wo die vorige Partition aufhört.

Das Script läuft bis zur 64. Partition fehlerfrei, danach liefert parted Fehlermeldungen (Es können keine weiteren Partitionen erzeugt werden). Die resultierenden Device-Dateien sehen wie bei GPT aus:

ls -lv /dev/sdb*

brw-rw---- 1 root disk   8, 16 Jun  1 08:34 /dev/sdb
brw-rw---- 1 root disk   8, 17 Jun  1 08:34 /dev/sdb1
brw-rw---- 1 root disk   8, 18 Jun  1 08:34 /dev/sdb2
...
brw-rw---- 1 root disk   8, 30 Jun  1 08:34 /dev/sdb14
brw-rw---- 1 root disk   8, 31 Jun  1 08:34 /dev/sdb15
brw------- 1 root root 259, 30 Jun  1 08:33 /dev/sdb16
brw------- 1 root root 259, 31 Jun  1 08:33 /dev/sdb17
...
brw-rw---- 1 root disk 259, 96 Jun  1 08:34 /dev/sdb63
brw-rw---- 1 root disk 259, 97 Jun  1 08:34 /dev/sdb64

Schlusswort

Und wer braucht so viele Partitionen? Im Normalfall niemand. Wenn Sie wirklich viele Dateisysteme auf einem Datenträger einrichten möchten, sollten Sie LVM verwenden — das ist viel flexibler.

Quellen