Vor ein paar Tagen ist meine Festplatte kaputtgegangen. Backups habe ich natürlich und im Urlaub kann ich auch einen Tag entbehren, um wieder alles einzurichten. Im Allgemeinen möchte ich so ein Ereignis aber nicht erleben, wenn gerade viel Arbeit ansteht. Deshalb habe ich mich entschlossen, mit der neuen Festplatte ein RAID einzurichten (d.h. genau genommen mit zwei Festplatten). Weil außerdem relativ klar ist, dass ich die Festplatten später in ein NAS migrieren werde und eventuell auch noch mehr Speicherplatz brauchen werde, will ich zudem ein LVM einrichten. Dieses ermöglicht es mir, später weitere Festplatten zu einem logischen Speicher zu vereinigen und somit eine virtuelle Partition zu erstellen, die größer ist als jede Festplatte für sich alleine.

Schauen wir uns die Technologien also der Reihe nach an.

RAID

RAID (Redundant Array of Inexpensive/Independent Disks) ist eine Technologie zur Speicherung von Daten auf mehreren Festplatten. Ziele von RAID sind die Steigerung der Datensicherheit und/oder Performance-Verbesserung. Die üblichsten RAID-Varianten sind RAID-0 (Striping) RAID-1 (Spiegelung) und RAID-5.

Bei RAID-0 werden mehrere Festplatten zu einem großen Festplattenbereich verbunden. Dadurch kann der RAID-Treiber die Schreibvorgänge auf mehrere Festplatten verteilen und somit die Geschwindigkeit beim Schreiben und Lesen theoretisch linear zur Anzahl der Festplatten steigern. Allerdings führt der Ausfall einer einzelnen Festplatte zum Ausfall des gesamten RAID-0-Speichers. Somit erhöht sich die Ausfallwahrscheinlichkeit mit steigender Anzahl an Festplatten.

RAID-1 spiegelt Daten auf zwei Festplatten. Alle Daten werden somit identisch auf beide Festplatten geschrieben und bei Ausfall einer Festplatte kann der Betrieb fortgesetzt werden. Beim Lesen kann der Zugriff eventuell leicht schneller werden, wenn ein Lesezugriff an beide Festplatten gesendet wird und immer das zuerst erhaltene Ergebnis verwendet wird.

RAID-5 bietet im Gegensatz zu RAID-1 die Möglichkeit durch Verbindung von mehr als 2 Festplatten größere nutzbare Speicherbereiche zu erzeugen und bietet trotzdem Sicherheit gegen den Ausfall einer einzelnen Festplatte. Hierzu werden die Daten blockweise auf verschiedene Festplatten verteilt und je Block muss eine Festplatte Paritätsbits zur Datensicherung speichern. Somit ist es mit RAID-5 bereits möglich aus kleineren Festplatten einen größeren Speicherbereich zu erstellen. Allerdings müssen für RAID-5 alle Festplatten die gleiche Größe aufweisen.

LVM

LVM bedeutet Logical Volume Manager und stellt eine Abstraktionsschicht für Festplatten dar. Dazu wird der verfügbare Speicher auf jeder Festplatte in sogenannte Extents aufgeteilt (z.B. von 4MB Größe je Extent), welche dann flexibel an die virtuellen Partitionen zugeteilt werden. Eine virtuelle Partition von 400MB Größe kann nun theoretisch aus 50 Extends von Festplatte 1 und 50 Extents von Festplatte 2 bestehen. Dank Extents muss eine virtuelle Partition nicht mehr wie bei einer konventiellen Paritionieren aus einem sequentiellen Festplattenbereich bestehen.

Generell muss man bei der Arbeit mit LVM drei wichtige Begriffe kennen:

  • Physical Volume
  • Volume Group
  • Logical Volume

Das Physical Volume entspricht dem grundlegenden Speicher, aus dem LVM die virtuellen Speicherbereiche aufbaut. Dies kann entweder eine komplette reale Festplatte sein oder eine Partition einer Festplatte oder auch ein virtueller Speicherbereich unter Linux wie er z.B. von dmcrypt (Verschlüsselung) oder mdadm (Software-RAID) erstellt wird. Um ein Physical Volume mit LVM verwenden zu können, muss man einen LVM-Header darauf schreiben. Bestehende Daten auf der Festplatte werden dabei unbrauchbar.

In der Volume Group werden die verfügbaren Physical Volumes zu einem großen Speicherbereich zusammengefasst, aus dem man dann Logical Volumes (quasi die Partitionen erzeugen kann). Theoretisch ist es möglich, mehrere Volume Groups zu verwalten, im privaten Bereich wird dies aber in der Regel weniger nützlich sein. Vorstellbar erscheint mir aber, dass es im Firmenumfeld durchaus sinnvoll sein kann, mehrere Volume Groups vorzuhalten, um sicherzustellen, dass bestimmte Daten auf bestimmten Physical Volumes gespeichert werden. Beispielsweise könnte man eine Volume Group erzeugen für Daten auf SSDs und eine für Daten auf rotierenden Festplatten. Oder eine Volume Group für Daten mit RAID und eine ohne RAID.

Aus den Volume Groups erstellt man dann letztlich Logical Volumes, auf die man dann ein Dateisystem spielen kann.

Zur Verschlüsselung mit LVM muss man sich entscheiden, ob man die Verschlüsselung auf den Physical Volumes oder auf den Logical Volumes durchführen will (d.h. vor oder nach LVM). Empfohlen wird hier, die Verschlüsselung vor LVM einzurichten und die /boot Partition außerhalb vom LVM zu verwalten, damit sie unverschlüsselt bleiben kann. Letztlich hängt die Entscheidung aber natürlich davon ab, ob man unverschlüsselte Volumes anlegen will.

LVM kann auch RAID-Funktionalitäten umsetzen, allerdings scheint das Tooling hierzu eventuell etwas limitiert und ich vermute, dass man bei Verwendung von LVM-RAID die Verschlüsselung nicht zwischen RAID und LVM in die Mitte schalten kann.

LVM on dmcrypt on RAID

Mein gewähltes Setup sieht nun so aus, dass ich erst zwei Festplatten zu einem RAID-1 verbinde. Damit habe ich Ausfallsicherheit auf den Festplatten hergestellt. Daraus wird mir vom RAID-Manager (mdadm unter Linux) eine einzelne Festplatte angezeigt. Diese verschlüssle ich mit dmcrypt. Die so verschlüsselte Festplatte füge ich anschließend zu einer Volume Group in LVM hinzu.

Mit diesem Setup kann ich später meinen Speicherbereich erweitern. Derzeit habe ich noch zwei weitere identische Festplatten aus einem älteren RAID-1-Setup verfügbar. Diese würde ich bei einem Einbau dann wieder mit RAID-1 absichern, die entstehende virtuelle Festplatte verschlüsseln und anschließend zur LVM Volume Group hinzufügen. Damit stünde für LVM dann ein größerer Speicherbereich zur Verfügung, der im Hintergrund verschlüsselt und mit RAID-1 gesichert ist.

Mein Betriebssystem und die /boot-Partition habe ich auf einer getrennten SSD außerhalb des LVM-Bereichs.

Um ein RAID-1-Array aus den beiden vorhanden Partitionen zu erstellen, kann man mit mdadm arbeiten:

mdadm --create /dev/md0 --level=raid1 --raid-devices=2 /dev/sdb /dev/sdc

Dieser Befehl legt ein RAID-1 auf den beiden Festplatten /dev/sdb und /dev/sdc an und mountet den gemeinsamen Speicher unter /dev/md0. Die nachfolgenden Programme können nun also mit /dev/md0 arbeiten. Man kann das neu erstellte RAID-Array mit mdadm --details /dev/md0 anzeigen.

Dieses Device kann man nun mit cryptsetup verschlüsseln, welches einem beim Entschlüsseln der Festplatte wieder ein neues Device unter /dev/mapper/<name> anlegt. Unter cryptsetup Versionen 1.6.0 oder neuer wird mit LUKS1 als Verschlüsselungsmethode aes-xts-plain64 verwendet. Relevant ist noch, ob man LUKS1 oder LUKS2 verwenden will (LUKS2 ist seit cryptsetup 2.1.0 Standard).

cryptsetup luksFormat --type luks1 --key-size 512 /dev/md0
cryptsetup open /dev/md0 crypt

Nun wird unter /dev/mapper/crypt das neue Device angezeigt, welches man zum verschlüsselten Schreiben verwenden kann. Dieses kann nun in LVM verwendet werden.

Hierzu erstellt man sich zunächst ein Physical Volume auf dem Device. Dabei schreibt LVM zunächst nur die notwendigen Metadaten in den Speicherbereich. Anschließend erstellt man eine Volume Group mit diesem Physical Volume. Die Namenskonvention scheint sich in die Richtung entwickelt zu haben, dass man den Hostnamen des Hosts mit in den Namen der Volume Group übernimmt, damit beim Einsatz der Festplatten auf anderen Geräten keine Kollissionen entstehen. Im privaten Bereich ist dieses Problem vernachlässigbar, allerdings schadet die Konvention auch nicht. Belässt man die Festplatten dann im anderen Host, kann man die Volume Group mit vgrename umbenennen. Zuletzt muss noch ein Logical Volume in der Volume Group erstellt werden.

pvcreate /dev/mapper/crypt
vgcreate vg-myhost /dev/mapper/crypt
lvcreate -n lv-data -L2TB vg-myhost
# show the newly created logical volume
lvdisplay

Anschließend kann man sich ein Dateisystem im Logical Volume erstellen und es mounten:

mkfs.ext4 /dev/vg-myhost/lv-data
mount /dev/vg-myhost/lv-data /mnt

Integration im bestehenden System

Wie zuvor beschrieben ist bei mir eine Festplatte ausgefallen, was heißt, dass ich das gesamte Setup auf einer Live-CD durchgeführt habe. Dann habe ich die wichtigsten Daten vom Backup auf die neue Festplatte kopiert.

Damit die neue Platte unter Arch richtig geladen wird, musste ich anschließend noch /etc/mdadm.conf, /etc/crypttab und /etc/fstab anpassen. Den notwendigen Eintrag für /etc/mdadm.conf lässt man sich am besten durch mdadm --detail --scan ausgeben.

# /etc/mdadm.conf

ARRAY /dev/md0 metadata=1.2 UUID=<uuid of device>

Die crypttab definiert, wie die verschlüsselte Platte entschlüsselt werden soll.

# /etc/crypttab

crypt0 /dev/md0 /path/to/keyfile luks

In der fstab trägt man ein, dass das LVM Logical Volume geladen werden soll.

# /etc/fstab

/dev/vg-myhost/lv-data /home ext4 defaults 0 1
I do not maintain a comments section. If you have any questions or comments regarding my posts, please do not hesitate to send me an e-mail to blog@stefan-koch.name.