Software-Raid verschlüsseln

Raid-Array erzeugen

Zunächst werden die Festplatten wie folgt vorbereitet:

Partitionsart primäre Partition
Partitionsgröße alle Partitionen haben dieselbe Größe
Partitionstyp LINUX RAID AUTODETECT
Partitionstyp-Code fd

Dann werden die Partitionen zum Raid-Array zusammengeschlossen:

lexi:~# mdadm --create <devicename> --level=<raid-level>
  --raid-devices=<number of component devices> <component devices>
Platzhalter Beispiel Bedeutung
devicename /dev/md0 Name des zu erstellenden mdX-Devices. Möglicherweise - so war es bei mir - müssen zuvor einige mdX-Devices angelegt werden.
raid-level 5 Welcher Raid-Level soll eingerichtet werden?
number of component devices 4 Anzahl der Partitionen die zum Raid-Array gehören sollen.
component devices hde1 hdf1 hdg1 hdh1 Auf diesen Partitionen wird das Raid-Array erzeugt.

Verschlüsseln

Das Array wird mit der Option luksFormat verschlüsselt, weil dadurch angeblich ein besseres Schlüsselmanagement gewährleistet wird.

lexi:~# cryptsetup luksFormat /dev/<devicename>

Zur Zeit sind auf Lexi folgende Arrays eingerichtet:

raid5_250 raid5_500
devicename md0 md1
raid-level 5 5
# of devices 6 4
component devices hd[gmecki]1 sd[abcd]1
volume-name raid5_250 raid5_500
mountpoint /mount/raid5_250 /mount/raid5_500

Einbinden in den Verzeichnisbaum

Die mdX-Devices werden während des Boot-Vorgangs automatisch erkannt und in /dev eingebunden. Sie sind aber zu dem Zeitpunkt verschlüsselt und müssen durch das Kommando

 lexi:~# cryptsetup luksOpen /dev/<devicename> <volume-name>

geöffnet werden.

Arrays automatisch einbinden

Beide Raid-Devices werden während des Boot-Vorgangs geöffnet, indem die Passwörter aus einer Datei gelesen und in das o.g. Kommando eingesetzt werden. Das ist noch nicht optimal.

#! /bin/sh
# /etc/init.d/cryptdrives

case "$1" in
    start)
        wget -q -O - [URI_1] |
          cryptsetup luksOpen /dev/md0 raid5_250
        mount /dev/mapper/raid5_250 /mount/raid5_250
        wget -q -O - [URI_2] |
          cryptsetup luksOpen /dev/md1 raid5_500
        mount /dev/mapper/raid5_500 /mount/raid5_500
        ;;
    stop)
        umount -l /dev/mapper/raid5_500
        cryptsetup luksClose /dev/mapper/raid5_500
        umount -l /dev/mapper/raid5_250
        cryptsetup luksClose /dev/mapper/raid5_250
        ;;
    *)
        echo "Usage: cryptdrives {start|stop}"
        exit 1
        ;;
esac

exit 0

Wie das ganze dann als Init-Skript ausgeführt wird, ist hier nachzulesen.

Array vergrößern

Ausgangszustand: Das Array ist entschlüsselt und ins Dateisystem eingebunden.

Bevor der Raid-Verbund vergrößert werden kann, muss mindestens eine weitere Partition vorbereitet werden. Dabei sind dieselben Schritte erforderlich wie beim Einrichten der Anfangspartitionen.

Die vorbereitete Partition wird dem Array hinzugefügt:

lexi:~# mdadm --add /dev/<devicename> /dev/<new disc name>

Das Array wird auf die neue Partition ausgedehnt:

lexi:~# mdadm --grow /dev/<devicename> --raid-devices=<new no. of raid devices>

Dieser Vorgang dauert ziemlich genau eine halbe Ewigkeit. Beim Warten kann mit

lexi:~# cat /proc/mdstat

der Fortschritt überprüft werden.

Das Raid-Array ist nun vergrößert, nicht aber das darauf enthaltene Dateisystem. Dazu wird das verschlüsselte Array aus dem Verzeichnisbaum genommen.

lexi:~# umount /dev/mapper/<volume-name>

Dann wird die crypto-Partition geschlossen, kann aber gleich wieder geöffnet werden.

lexi:~# cryptsetup luksClose <volume-name>
lexi:~# cryptsetup luksOpen /dev/<devicename> <volume-name>

Cryptsetup kennt nun auch die neue Größe des Arrays. Jetzt wird das Dateisystem überprüft,

lexi:~# e2fsck -f /dev/mapper/<volume-name>

vergrößert,

lexi:~# resize2fs /dev/mapper/<volume-name>

und wieder in den Verzeichnisbaum gehängt.

lexi:~# mount /dev/mapper/<volume-name> <mountpoint>