21x9.org

mdadm RAID / luksCrypt

Categories: [blog]
Tags: [imported]

Im Büro haben wir früher ein USB-RAID aus zwei Platten genutzt um ein Inhouse-Backup abzubilden. Die Konfiguration ist unten aufgeführt, das Gebilde würde aber mittlerweile zugunsten eines 4TB-NAS-Laufwerks (RAID 10) abgelöst. Da die Laufwerke leicht zugänglich und beweglich waren wurden sie verschlüsselt.## Software-RAID ##

Um ein Software-RAID zu erstellen sind zunächst auf mind. 2 Festplatten gleich große Partitionen zu erstellen:

cfdisk /dev/sda
cfdisk /dev/sdb

Nun wird ein neues RAID-Array erstellt:

mdadm --create /dev/md0 --level=1 --raid-devices=2 /dev/sda1 /dev/sdb1

Das Array erhält den Namen md0 und besteht aus zwei Laufwerken (-raid-devices=2). Es ist ein Level 1-RAID (--level=1), sprich die Daten werden gespiegelt.

Nachdem das Array erstellt wurde, wird es synchronisiert. Den aktuellen Status kann man mit dem Befehl cat /proc/mdstat abfragen:

  $ cat /proc/mdstat
  Personalities : [raid1]
  md0 : active raid1 sdd1[1] sdc1[0]
        1465135869 blocks super 1.1 [2/2] [UU]
        [>....................]  resync =  0.0% (70016/1465135869) finish=2440.6min speed=10002K/sec
  unused devices: 

Alternativ kann man mdadm verwenden:

  $ mdadm --detail --scan
  ARRAY /dev/md0 metadata=1.01 name=foobar:0 UUID=1234578:1234578:1234578:1234578

  $ mdadm --detail /dev/md0
  /dev/md0:
          Version : 1.01
    Creation Time : Sat Feb  6 23:42:21 2010
       Raid Level : raid1
       Array Size : 1465135869 (1397.26 GiB 1500.30 GB)
    Used Dev Size : 1465135869 (1397.26 GiB 1500.30 GB)
     Raid Devices : 2
    Total Devices : 2
      Persistence : Superblock is persistent
      Update Time : Sun Feb  7 00:03:21 2010
            State : active, resyncing
   Active Devices : 2
  Working Devices : 2
   Failed Devices : 0
    Spare Devices : 0
   Rebuild Status : 0% complete
             Name : foobar:0  (local to host foobar)
             UUID : 1234578:1234578:1234578:1234578
           Events : 1
      Number   Major   Minor   RaidDevice State
         0       8       33        0      active sync   /dev/sda1
         1       8       49        1      active sync   /dev/sdb1

Als nächstes wird eine neue Partition auf dem RAID erstellt:

cfdisk /dev/md0

Damit ist das RAID einsatzbereit und kann nun formatiert und gemountet werden:

mkfs.ext4 -j -m 0 /dev/md0
mount /dev/md0 /mnt

Den Status des RAID kann man mit mdadm --detail /dev/md0 jederzeit überprüfen. Sollte das RAID nach einem Neustart nicht automatisch neu zusammengefügt werden, kann man dies nachträglich mit dem Befehl mdadm --assemble /dev/md0 /dev/sda1 /dev/sdb1 tun, anschließend kann das RAID wie gewohnt gemountet werden.

luksCrypt

Um das RAID (z.B. für ein Backup) zu verschlüsseln geht man (auf einer unformatierten aber partitionierten Platte) wie folgt vor:

cryptsetup --verbose --verify-passphrase luksFormat /dev/md0
Enter your desired pasphrase here (twice)
cryptsetup luksOpen /dev/md0 myraid

Anschließend kann der Crypt-Container geöffnet werden:

cryptsetup luksOpen /dev/md0 cryptraid

Das Laufwerk kann nun über /dev/mapper/cryptraid angesprochen und formatiert werden.

mkfs.ext4 -j -m 0 /dev/mapper/cryptraid

In Zukunft kann das Crypt-RAID wie folgt eingebunden werden:

  $ mdadm --assemble /dev/md0 /dev/sda1 /dev/sdb1
  $ cryptsetup luksOpen /dev/md0 cryptraid
  $ mount -t ext4 /dev/mapper/cryptraid /mnt

Um das RAID wieder zu verschließen geht man so vor:

  $ umount /mnt
  $ cryptsetup luksClose myraid
  $ mdadm --stop /dev/md0

RAID-Wiederherstellung

Fällt im RAID-Verbund auf einem der Server ein Laufwerk aus, wird automatisch eine E-Mail an root versendet.

From   : mdadm monitoring <root@example.de>
To     : root@vortis.local
Subject: Fail event on /dev/md/0:vortis

This is an automatically generated mail message from mdadm
running on vortis

A Fail event had been detected on md device /dev/md/0.

It could be related to component device /dev/sda1.

Faithfully yours, etc.

[...]

Ein solcher Fehler kann auch testweise selbst provoziert werden:

mdadm -manage -set-faulty /dev/md0 /dev/sda1

Hier wird das Laufwerk /dev/sda1 im RAID /dev/md0 als beschädigt (faulty) markiert. Resultat sollte die oben erwähnte Mail sein. Der Aufruf von mdadm --detail /dev/md0 sollte folgendes zeigen:

/dev/md0:

        Version : 00.90.03
  Creation Time : Fri Nov  2 15:52:45 2007
     Raid Level : raid1
     Array Size : 14651136 (13.97 GiB 15.00 GB)
    Device Size : 14651136 (13.97 GiB 15.00 GB)
   Raid Devices : 2
  Total Devices : 2
Preferred Minor : 0

    Persistence : Superblock is persistent
    Update Time : Sat Nov 10 15:11:48 2007
          State : clean, degraded
 Active Devices : 1
Working Devices : 1
 Failed Devices : 1
  Spare Devices : 0

           UUID : 644f52f2:66ea4422:1ae79331:d593083b
         Events : 0.48895 

    Number   Major   Minor   RaidDevice State

       0       0        0        -      removed
       1       8       17        1      active sync   /dev/sdb1
       2       8        1        -      faulty   /dev/sda1

Um eine neue Festplatte in das RAID aufzunehmen ist zunächst die beschädigte Festplatte zu entfernen:

mdadm /dev/md0 -r /dev/sda1

Klappt dies erscheint folgende Meldung:

mdadm: hot removed /dev/sda1

Das Resultat kann auch noch einmal mit mdadm --detail /dev/md0 bestätigt werden:

/dev/md0:

        Version : 00.90.03
  Creation Time : Fri Nov  2 15:52:45 2007
     Raid Level : raid1
     Array Size : 14651136 (13.97 GiB 15.00 GB)
    Device Size : 14651136 (13.97 GiB 15.00 GB)
   Raid Devices : 2
  Total Devices : 1
Preferred Minor : 0
    Persistence : Superblock is persistent

    Update Time : Sat Nov 10 15:19:54 2007
          State : clean, degraded
 Active Devices : 1
Working Devices : 1
 Failed Devices : 0
  Spare Devices : 0

           UUID : 644f52f2:66ea4422:1ae79331:d593083b
         Events : 0.48944

    Number   Major   Minor   RaidDevice State
       0       0        0        -      removed
       1       8       17        1      active sync   /dev/sdb1

Nun kann das Laufwerk auch physikalisch aus dem Server entfernt und gegen ein neues Laufwerk gleicher (oder höherer) Kapazität ausgetauscht werden. Dies kann im laufenden Betrieb geschehen.

Anschließend wird das neue Laufwerk dem RAID hinzugefügt:

mdadm /dev/md0 -a /dev/sda1

Das Resultat sollte lauten:

mdadm: hot added /dev/sda1

Auch dies lässt sich mit mdadm --detail /dev/md0 noch einmal überprüfen:

/dev/md0:

        Version : 00.90.03
  Creation Time : Fri Nov  2 15:52:45 2007
     Raid Level : raid1
     Array Size : 14651136 (13.97 GiB 15.00 GB)
    Device Size : 14651136 (13.97 GiB 15.00 GB)
   Raid Devices : 2
  Total Devices : 2
Preferred Minor : 0

    Persistence : Superblock is persistent

    Update Time : Sat Nov 10 15:25:21 2007
          State : clean, degraded, recovering
 Active Devices : 1
Working Devices : 2
 Failed Devices : 0
  Spare Devices : 1

 Rebuild Status : 40% complete

           UUID : 644f52f2:66ea4422:1ae79331:d593083b
         Events : 0.48999

    Number   Major   Minor   RaidDevice State

       0       0        0        -      removed
       1       8       17        1      active sync   /dev/sdb1
       2       8        1        0      spare rebuilding   /dev/sda1

Wie hier zu erkennen wird das neue Laufwerk zunächst als Spare Device eingebunden und synchronisiert. Ist der Rebuild-Prozess erfolgreich beendet gibt mdadm --detail /dev/md0 wieder das gewohnte Bild zurück:

/dev/md0:

Version : 00.90.03
  Creation Time : Fri Nov  2 15:52:45 2007

     Raid Level : raid1
     Array Size : 14651136 (13.97 GiB 15.00 GB)
    Device Size : 14651136 (13.97 GiB 15.00 GB)

   Raid Devices : 2
  Total Devices : 2
Preferred Minor : 0
    Persistence : Superblock is persistent
    Update Time : Sat Nov 10 14:54:36 2007
          State : clean
 Active Devices : 2
Working Devices : 2
 Failed Devices : 0
  Spare Devices : 0

           UUID : 644f52f2:66ea4422:1ae79331:d593083b
         Events : 0.48810

    Number   Major   Minor   RaidDevice State

       0       8        1        0      active sync   /dev/sda1
       1       8       17        1      active sync   /dev/sdb1