Ubuntu – Software Raid erstellen

Wir haben in der Firma eine Videoüberwachung des Außengeländes mit einem Dutzend Kameras. Die aufgezeichneten Videos werden für ein paar Tage gespeichert. Allerdings sind die dabei anfallenden Datenmengen und Transferraten so groß, dass eine einzelne Platte überfordert wäre. Normalerweise bevorzuge ich ja Hardware Raid, aber wir haben gerade keinen Raid-Controller da und für den Anwendungszweck ist ein Software Raid vollkommen ok.

Die Ausgangslage

Ich habe zur Abwechslung mal keinen virtuellen Server, sondern richtiges Blech. Es handelt sich um ein älteres Serverboard INTEL S1200BTL mit 8GB RAM und einer kleinen SSD für das Betriebssystem sowie 5 SATA-Platten á 2TB für unser Software RAID. Als Betriebssystem ist ein Ubuntu 16.04LTS installiert.

Wichtige Vorarbeiten

Die Festplatten sind natürlich in einer Backplane verbaut, so dass man defekte Platten tauschen kann ohne gleich den ganzen Server auseinander nehmen zu müssen (erschwerend kommt in meinem Fall hinzu, dass er ganz oben im Rack auf 2m Höhe eingebaut ist). Damit bei einem Ausfall nicht die falsche Festplatte gezogen und damit evtl. das RAID zerstört wird, beschrifte ich die einzelnen Slots der Backplane mit den jeweiligen Seriennummern der Festplatten. 
Die Seriennummern des Festplatten verrät mir hdparm.

edv@kameraserver:~$ sudo hdparm -i /dev/sdb /dev/sdc /dev/sdd /dev/sde /dev/sdf | grep -i serial
Model=ST2000DM006-2DM164, FwRev=CC26, SerialNo=Z504JJC9
Model=ST2000VX008-2E3164, FwRev=CV12, SerialNo=Z520LDBJ
Model=Hitachi HDS722020ALA330, FwRev=JKAOA3EA, SerialNo=JK11A1YAJJ44LV
Model=Hitachi HDS722020ALA330, FwRev=JKAOA3EA, SerialNo=JK1171YAGZ0GES
Model=Hitachi HDS722020ALA330, FwRev=JKAOA3EA, SerialNo=JK1101YAJJ5EHV

Partitionen erstellen

Bevor ich das Raid erstellen kann, muss ich zunächst mal auf allen Platten eine Partition identischer Größe erstellen. Da ich Festplatten unterschiedlicher Hersteller im Einsatz habe und 2TB nicht überall 2TB sind, lasse ich die letzten 8192 Sektoren ungenutzt. So kann ich dann im Bedarfsfall auch eine Platte einsetzen, wo der Hersteller ein paar Sektoren eingespart hat. Als erstes lege ich mittels parted eine leere Partitionstabelle an.

edv@kameraserver:~$ sudo parted /dev/sdb mklabel gpt
Warning: The existing disk label on /dev/sdb will be destroyed and all data on this disk will be lost. Do you want to continue?
Yes/No? y
Information: You may need to update /etc/fstab.

Das ganze natürlich nicht nur für /dev/sdb, sondern in meinem Fall wiederholt bis /dev/sdf.
Als nächstes lege ich die Partition an und setze den Partitionstyp auf „raid“, auch dies ist mit parted schnell erledigt.

edv@kameraserver:~$ sudo parted -a optimal -- /dev/sdb mkpart primary 2048s -8192s
Information: You may need to update /etc/fstab.
edv@kameraserver:~$ sudo parted /dev/sdb set 1 raid on
Information: You may need to update /etc/fstab.

Ob das wie gewünscht geklappt hat, prüfe ich kurz mit fdisk.

edv@kameraserver:~$ sudo fdisk -l /dev/sdb
Disk /dev/sdb: 1,8 TiB, 2000398934016 bytes, 3907029168 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disklabel type: gpt
Disk identifier: D5D5DEB6-1A05-4434-A2AF-0CF3EDC5EF7A

Device     Start        End    Sectors  Size Type
/dev/sdb1   2048 3907020976 3907018929  1,8T Linux RAID

Sieht gut aus, also wiederhole ich das ganze wieder mit den anderen Festplatten bis /dev/sdf.

Raid einrichten

Nun kann ich endlich das eigentliche Raid anlegen, in meinem Fall ein RAID 6, welches dann unter dem Block-Device /dev/md0 verfügbar ist.

edv@kameraserver:~$ sudo mdadm --create /dev/md0 --level=6 --raid-devices=5 /dev/sd[bcdef]1
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md0 started.

Der Aufbau des Raid kann durchaus einige Stunden dauern, den aktuellen Status kann ich mir jederzeit mittels

edv@kameraserver:~$ sudo cat /proc/mdstat
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]
md0 : active raid6 sdf1[4] sde1[3] sdd1[2] sdc1[1] sdb1[0]
      5860134912 blocks super 1.2 level 6, 512k chunk, algorithm 2 [5/5] [UUUUU]
      [>....................]  resync =  0.9% (18899392/1953378304) finish=453.3min speed=71123K/sec
      bitmap: 15/15 pages [60KB], 65536KB chunk

anschauen, in meinem Fall wird es also wohl noch knappe 8 Stunden dauern. Es ist aber nicht nötig nun in Ehrfurcht vor dem Rechner zu verharren, selbst bei einem Neustart wird der Build nahtlos fortgeführt. In der Zwischenzeit speichere ich die Raid-Konfiguration ab. Dies geschieht in der Datei /etc/mdadm/mdadm.conf. Den nötigen Konfigurationseintrag lasse ich mir erstmal anzeigen.

edv@kameraserver:~$ sudo mdadm --examine --scan --verbose
ARRAY /dev/md/0  level=raid6 metadata=1.2 num-devices=5 UUID=21ae1412:e3b4dd92:2c42cdaa:09862571 name=kameraserver:0
   devices=/dev/sdf1,/dev/sde1,/dev/sdd1,/dev/sdc1,/dev/sdb1

Diese Ausgabe füge ich nun exakt so wie sie ist ans Ende der /etc/mdadm/mdadm.conf hinzu, die nun so aussieht.

# mdadm.conf
#
# Please refer to mdadm.conf(5) for information about this file.
#

# by default (built-in), scan all partitions (/proc/partitions) and all
# containers for MD superblocks. alternatively, specify devices to scan, using
# wildcards if desired.
#DEVICE partitions containers

# auto-create devices with Debian standard permissions
CREATE owner=root group=disk mode=0660 auto=yes

# automatically tag new arrays as belonging to the local system
HOMEHOST <system>

# instruct the monitoring daemon where to send mail alerts
MAILADDR ralf

# definitions of existing MD arrays

# This file was auto-generated on Thu, 27 Sep 2018 18:35:02 +0200
# by mkconf $Id$
ARRAY /dev/md/0  level=raid6 metadata=1.2 num-devices=5 UUID=21ae1412:e3b4dd92:2c42cdaa:09862571 name=kameraserver:0
   devices=/dev/sdf1,/dev/sde1,/dev/sdd1,/dev/sdc1,/dev/sdb1

RAID formatieren und mounten

Ich möchte ext4 als Dateisystem verwenden und 200GB (also ungefähr 3%) meines RAID6 für den Benutzer root reservieren. Soviel Platz brauche ich zwar nicht wirklich für root, aber es dient auch dazu eine Fragmentierung zu vermeiden.

edv@kameraserver:~$ sudo mkfs.ext4 -m 3 -b 4096 -E stride=128,stripe-width=384 /dev/md0
mke2fs 1.42.13 (17-May-2015)
Ein Dateisystems mit 1465033728 (4k) Blöcken und 183132160 Inodes wird erzeugt.
UUID des Dateisystems: 1bf6c85b-9dbd-4741-95b1-6465edac30aa
Superblock-Sicherungskopien gespeichert in den Blöcken:
        32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
        4096000, 7962624, 11239424, 20480000, 23887872, 71663616, 78675968,
        102400000, 214990848, 512000000, 550731776, 644972544

beim Anfordern von Speicher für die Gruppentabellen: erledigt
Inode-Tabellen werden geschrieben: erledigt
Das Journal (32768 Blöcke) wird angelegt: erledgt
Die Superblöcke und die Informationen über die Dateisystemnutzung werden
geschrieben: erledigt

Ich möchte das RAID-Laufwerk im Verzeichnis /mnt/aufzeichnung zur Verfügung stellen, daher lege ich dieses Verzeichnis an.

edv@kameraserver:~$ sudo mkdir /mnt/aufzeichnung

Damit mein RAID nach einem Neustart automatisch gemountet wird und direkt zur Verfügung steht, füge ich an das Ende der /etc/fstab folgendes hinzu:

/dev/md0 /mnt/aufzeichnung/ ext4 defaults,nosuid,noexec,nodev,noatime 1 2

Ich verwende diese Mountoptionen, da das RAID ausschließlich für Video-Dateien verwendet wird. Sollen dort auch ausführbare Dateien liegen, macht die eine oder andere Option eher wenig Sinn, also bitte nicht blind übernehmen sondern mal nachlesen was die wirklich machen.

Nun fix testen ob das Mounten auch funktioniert, entweder per Neustart oder durch ein

edv@kameraserver:~$ sudo mount -a

Wenn alles geklappt hat, sollte das RAID6 nun als /dev/md0 unter /mnt/aufzeichnung zur Verfügung stehen und ganz normal genutzt werden können, schauen wir mal nach.

edv@kameraserver:~$ df -h
Filesystem      Size  Used Avail Use% Mounted on
udev            3,8G     0  3,8G   0% /dev
tmpfs           770M  8,7M  761M   2% /run
/dev/sda1       1,8T  2,3G  1,7T   1% /
tmpfs           3,8G     0  3,8G   0% /dev/shm
tmpfs           5,0M     0  5,0M   0% /run/lock
tmpfs           3,8G     0  3,8G   0% /sys/fs/cgroup
tmpfs           770M     0  770M   0% /run/user/1000
/dev/md0        5,5T   58M  5,3T   1% /mnt/aufzeichnung

Das sieht sehr gut aus, nun noch schnell Samba installieren und die Freigaben für die Kameras erstellen und fertig ist die Laube.

Informationen über den RAID-Zustand kann ich mir jederzeit über mdadm ausgeben lassen.

edv@kameraserver:~$ sudo mdadm --detail /dev/md0
/dev/md0:
        Version : 1.2
  Creation Time : Fri Sep 28 15:46:21 2018
     Raid Level : raid6
     Array Size : 5860134912 (5588.66 GiB 6000.78 GB)
  Used Dev Size : 1953378304 (1862.89 GiB 2000.26 GB)
   Raid Devices : 5
  Total Devices : 5
    Persistence : Superblock is persistent

  Intent Bitmap : Internal

    Update Time : Mon Oct  1 09:51:18 2018
          State : clean
 Active Devices : 5
Working Devices : 5
 Failed Devices : 0
  Spare Devices : 0

         Layout : left-symmetric
     Chunk Size : 512K

           Name : kameraserver:0  (local to host kameraserver)
           UUID : 21ae1412:e3b4dd92:2c42cdaa:09862571
         Events : 5507

    Number   Major   Minor   RaidDevice State
       0       8       17        0      active sync   /dev/sdb1
       1       8       33        1      active sync   /dev/sdc1
       2       8       49        2      active sync   /dev/sdd1
       3       8       65        3      active sync   /dev/sde1
       4       8       81        4      active sync   /dev/sdf1

Wie man eine defekte Festplatte im Raid ersetzt, habe ich hier beschrieben.