Linux Software-RAID ist eine gerne verwendete Lösung, um auf die schnelle ein RAID System an dem einen oder anderem Server zu realisieren. In den meisten Fällen funktioniert dies auch einfach so, doch lästige moderne Systeme haben durch zunehmend dynamischere Hardware (USB, SATA, …) und stetige Verbesserungen am Init Prozess (z.B. Upstart, systemd) ein großartiges Potential sich bei der beliebten Kombination RAID und LVM in den Fuß zu schießen.
Doch auch andere Kombinationen sind möglich, genau genommen jede Option, bei welcher eine Anwendung oder ein Systembestandteil pauschal alle Block Devices nach einem bestimmten Header durchsucht. Auf einem RAID System können genau diese Header, in exakt gleicher Form, nämlich auf mehreren Block Devices zur gleichen Zeit vorhanden sein. Problematisch ist dies vor allem bei RAID1, aber ich gehe davon aus das auch andere RAID-Level hier Probleme bereiten könnten.
Um das Problem zu verstehen, muss man dessen Ursache kennen, daher ein kleiner Überblick über die gängigen RAID Metadatenversionen:
- 0.90
- Dabei handelt es sich um das nach wie vor oft verwendete, aber inoffiziell als PITA bezeichnete Metadatenversion. Limitierungen sind u.a. maximal 2TB bei einem RAID-Level größer oder gleich 1 und zusätzlich die Limitierung auf maximal 28 Geräte im Verbund, welche weniger problematisch sein sollte. Dummerweise ist bei dieser Metadatenversion je nach Partitionierung auch nicht definiert ob sich ein RAID Verbund über die gesamte Platte oder nur einen Teil davon (Partition) erstreckt.
- 1.0
- Das neue Metadatenformat, hier liegt der RAID Header genauso wie beim 0.90er Format am Ende der Partition/Platte. Die Bugs aus 0.90 wurden hierbei gefixt und es gibt auch einen Satz neue Features welche in der Manpage erläutert werden.
- 1.1
- Wie 1.0, jedoch liegt der RAID Header hier nicht am Ende, sondern am Anfang einer Partition/Platte.
- 1.2
- Wie 1.0, jedoch liegt der RAID Header hier nicht am Ende der Platte/Partition, sondern 4KB nach dem Startsektor derselben.
Das PITA (0.90) Format möchten wir wirklich nicht mehr einsetzen, aber die anderen Versionen klingen doch sehr verlockend. Aufpassen muss man hier aber bei der Wahl der Version, den einzig 1.1 sorgt dafür das am Anfang der Partition der RAID Header ist. Dadurch erkennen die meisten Tools welche ihre Header ebenfalls am Start der Partition/Platte erwarten dort keinen eigenen Header mehr und kommen nicht auf die blöde Idee diesen zu verwenden.
Durch eine ungünstige Situation (z.B. eine Race Condition) kann es z.B. beim Startvorgang vorkommen das so /dev/sda1 in eine LVM Volume Group aufgenommen wird obwohl nur wenig später das richtige Block Device, nämlich /dev/md0 zu Verfügung stehen würde. Der Schutz durch das RAID besteht so ggf. nicht, im schlimmsten Fall überschreiben sich das Software-RAID und LVM gegenseitig die Daten, ein großartiges Szenario.
Beobachten konnte ich das recht theoretische Problem bisher 2-3x auf meinem Homeserver, durch viele Schutzmaßnahmen ist aber nichts passiert, mal davon abgesehen das die gängige LVM Befehle auf einmal jammerten, dass keine PVs verfügbar wären, obwohl das System schon seit Wochen stabil läuft. Beobachten konnte ich ebenfalls das dieses Problem nur auftritt wenn der lvmetad verwendet wird, dies ist z.B. bei Arch Linux der Fall. Ich gehe auch davon aus das dieses LVM spezifische Problem eher dort zu suchen ist, unabhängig davon gibt es neben LVM noch einige andere Dinge die gerne mal Metadaten am Anfang der Partition/Platte suchen, durch die Wahl der richtigen Metadatenversion können hier schon beim erstellen des RAIDs potentielle Probleme vermieden werden.