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.