Um die Daten auf einer Festplatte bestmöglich zu verwalten werden diese in Sektoren mit einer bestimmten Sektorgröße aufgeteilt. Ein Sektor ist die kleinste Einheit, mit der die Festplatte physisch angesprochen werden kann. Bei älteren Festplatte sind die Sektoren 512 Byte groß wohingegen die Sektoren bei neueren Festplatten, die das Advanced Format unterstützen 4KByte groß sind.
Im Moment ist eine der größten Hürden, dass viele Festplatten das ältere Format noch emulieren, aber mit dem neuen arbeiten. Das kann im besten Fall keinen Einfluss auf die Performance haben, im schlechtesten und wahrscheinlicheren Fall reduziert sich die Performance jedoch erheblich.
Warum der Verlust der Performance?
Angenommen es kommt eine Festplatte mit 4KByte Sektorgröße und ein Dateisystem mit einer Blockgröße von 4KByte zum Einsatz. Zusätzlich emuliert die Festplatte noch das alte Format.
Dies hört sich zunächst nicht sehr schlimm an.
Doch weiter wird angenommen, dass bei der Partitionierung nicht auf die 4KByte Grenzen geachtet wurde und die Partition dank der Emulation ohne Probleme in der Mitte eines physischen Sektors beginnt. Schreibt nun das Dateisystem einen Block von 4KByte auf die Festplatte, so müssen insgesamt zwei Sektoren gelesen, die geänderten Teile angepasst und beide wieder geschrieben werden. Im Gegensatz wird bei einer Beachtung der Grenzen nur ein Sektor geschrieben. Es werden also bis zu zwei Lese- und ein Schreibzugriff eingespart.
Warum hat Linux Probleme?
Linux hat eigentlich schon seit einer ganzen Weile kein Problem mehr mit den 4KByte Sektorgrößen. Doch leider geben manche Festplatten durch eine erzwungene Emulation die falsche Größe aus, was unweigerlich zum Problem führt. Weil wenn das Betriebssystem falsche Informationen von der Hardware bekommt, dann kann es sie nicht automatisch korrigieren.
Die erkannte physikalische Sektorgröße kann wie folgt ausgelesen werden.
$ cat /sys/block/sda/queue/hw_sector_size
Bei einer WD20EARS von Western Digital wird hier 512 Byte ausgegeben.
Partitionen einrichten
Falls noch nicht geschehen muss zunächst eine Partitionstabelle erstellt werden. Dazu wird zunächst ein Live-System gestartet und parted aufgerufen.
Achtung: Wenn schon Partitionen bestehen darf dies auf keinen Fall gemacht werden, da es sonst zum Datenverlust kommt. Im weiteren wird von einer leeren Festplatte ausgegangen.
Hinweis: Das Live-System ist nur notwendig, wenn ein neues System installiert werden soll. Besteht das System schon und soll nur erweitert werden kann es auch bequem aus dem laufenden System gemacht werden.
$ sudo parted /dev/sda
Anschließend kann die Paritionstabelle erstellt werden.
(parted) mklabel gpt
Um nicht so viel rechnen zu müssen bietet es sich noch an, die Einheiten auf KByte umzustellen.
(parted) unit kib
Erstellt werden soll eine Partition über die gesamte Festplatte. Hierzu werden zunächst die Informationen zu der Festplatte ausgelesen.
(parted) print
Model: ATA WDC WD20EARS-00M (scsi)
Disk /dev/sda: 1953514584kiB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Number Start End Size Type File system Flags
Beim erstellen der neuen Partition ist es wichtig zu beachten, dass der Anfangswert immer ohne Rest durch 4 teilbar ist.
(parted) mkpart primary 32 1953514584
Warning: You requested a partition from 32,0kiB to 1953514584kiB.
The closest location we can manage is 32,0kiB to 1953514567kiB.
Is this still acceptable to you?
Yes/No? Yes
Warning: The resulting partition is not properly aligned for best performance.
Ignore/Cancel? Ignore
An dieser Stelle kann das Programm beendet werden.
(parted) quit
Zum Schluss kann noch das Dateisystem mit einer Blockgröße von 4KByte erstellt werden.
Achtung: Auch bei diesem Befehl gehen alle Daten auf der angegeben Partition verloren.
$ sudo mkfs.ext4 -b 4096 /dev/sda1
Links
- parted (englisch)
- Western Digital (mehrsprachig, deutsch)