RAID auf dem Raspberry Pi einrichten

Festplatten formatieren

Die Festplatten (devices) sollten wie folgt erscheinen:

/dev/sda
/dev/sdb
/dev/sdc
/dev/sdd

Um Reste alter Partitionen usw. zu löschen:

sudo wipefs -a /dev/sda
sudo wipefs -a /dev/sdb
sudo wipefs -a /dev/sdc
sudo wipefs -a /dev/sdd

Dann neue primäre Partitionen mit parted erstellen:

sudo parted /dev/sda mklabel gpt
sudo parted /dev/sda mkpart primary 4096s 100%
sudo parted /dev/sdb mklabel gpt
sudo parted /dev/sdb mkpart primary 4096s 100%
sudo parted /dev/sdc mklabel gpt
sudo parted /dev/sdc mkpart primary 4096s 100%
sudo parted /dev/sdd mklabel gpt
sudo parted /dev/sdd mkpart primary 4096s 100%

Es kann sein, dass sich parted beschwert, dass die Partition nicht optimal angeordnet wird. Dies am besten mit i für Ignore akzeptieren, da 4096s optimal ist1.

Am Ende sollte

ls -l /dev/sd*

folgendes ausgeben:

brw-rw---- 1 root disk 8,  0 Apr 15 08:10 /dev/sda
brw-rw---- 1 root disk 8,  1 Apr 15 08:10 /dev/sda1
brw-rw---- 1 root disk 8, 16 Apr 15 08:10 /dev/sdb
brw-rw---- 1 root disk 8, 17 Apr 15 08:10 /dev/sdb1
brw-rw---- 1 root disk 8, 32 Apr 15 08:10 /dev/sdc
brw-rw---- 1 root disk 8, 33 Apr 15 08:10 /dev/sdc1
brw-rw---- 1 root disk 8, 48 Apr 15 08:10 /dev/sdd
brw-rw---- 1 root disk 8, 49 Apr 15 08:10 /dev/sdd1

Nun die Partitionen (hier sda1, sdb1, sdc1 und sdd1) formatieren:

sudo mkfs.ext4 /dev/sda1
sudo mkfs.ext4 /dev/sdb1
sudo mkfs.ext4 /dev/sdc1
sudo mkfs.ext4 /dev/sdd1

Nun eine Bezeichnung (label) jeder formatierten Partition zuweisen:

sudo e2label /dev/sda1 320GB01
sudo e2label /dev/sdb1 320GB02
sudo e2label /dev/sdc1 500GB01
sudo e2label /dev/sdd1 500GB02

Zum Test solle sudo blkid u.a. folgendes zurückgeben:

/dev/sda1: LABEL="320GB01" UUID="xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" TYPE="ext4" PARTLABEL="primary" PARTUUID="xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
/dev/sdb1: LABEL="320GB02" UUID="xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" TYPE="ext4" PARTLABEL="primary" PARTUUID="xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
/dev/sdc1: LABEL="500GB01" UUID="xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" TYPE="ext4" PARTLABEL="primary" PARTUUID="xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
/dev/sdd1: LABEL="500GB02" UUID="xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" TYPE="ext4" PARTLABEL="primary" PARTUUID="xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"

RAID-Array erstzellen

Nun die RAID-Software installieren:

sudo apt update
sudo apt upgrade
sudo apt install mdadm

Und z.B. 2 RAID-1 (mit Spiegelung) erstellen:

sudo mdadm --create --verbose /dev/md0 --level=mirror --raid-devices=2 /dev/sda1 /dev/sdb1
sudo mdadm --create --verbose /dev/md1 --level=mirror --raid-devices=2 /dev/sdc1 /dev/sdd1

Der RAID-Status kann mit cat /proc/mdstat festgestellt werden und sollte anfangs so aussehen (variiert natürlich abhängig von Festplattengröße):

Personalities : [raid1]
md1 : active raid1 sdd1[1] sdc1[0]
      488252416 blocks super 1.2 [2/2] [UU]
      [>....................]  resync =  3.2% (15865664/488252416) finish=103.1min speed=76290K/sec
      bitmap: 4/4 pages [16KB], 65536KB chunk

md0 : active raid1 sdb1[1] sda1[0]
      312437056 blocks super 1.2 [2/2] [UU]
      [=>...................]  resync =  6.5% (20465280/312437056) finish=65.3min speed=74413K/sec
      bitmap: 3/3 pages [12KB], 65536KB chunk

unused devices: <none>

Nun muss das RAID-System so gespeichert werden, dass es immer geladen wird.

sudo -i # Leiter notwendig, da user:pi keine Berechtigung für mdadm.conf hat
mdadm --detail --scan >> /etc/mdadm/mdadm.conf
exit

Ein Test stellt sicher, dass die Konfiguration richtig in die Datei geschrieben wurde:

cat /etc/mdadm/mdadm.conf

sollte folgendes zurückgeben:

# mdadm.conf
#
# !NB! Run update-initramfs -u after updating this file.
# !NB! This will ensure that initramfs has an uptodate copy.
#
# 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

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

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

# definitions of existing MD arrays
# This configuration was auto-generated on xxxxxxxxx by mkconf
ARRAY /dev/md0 metadata=1.2 name=raspberrypi:0 UUID=xxxxxxxx:xxxxxxxx:xxxxxxxx:xxxxxxxx
ARRAY /dev/md1 metadata=1.2 name=raspberrypi:1 UUID=xxxxxxxx:xxxxxxxx:xxxxxxxx:xxxxxxxx

Die letzten Zeilen sind hier das Entscheidende.

Nun noch die RAID-Partitionen in RAID-Volumen formatieren:

mkfs.ext4 -v -m .1 -b 4096 -E stride=32,stripe-width=64 /dev/md0
mkfs.ext4 -v -m .1 -b 4096 -E stride=32,stripe-width=64 /dev/md1

und aktivieren:

sudo mount /dev/md0 /mnt/320GB
sudo mount /dev/md1 /mnt/500GB

Automatisches Einbinden des RAID-Arrays

Damit die RAID-Volumen auch Zukunft von alleine aktiviert werden, bestehen zwei Möglichkeiten es automatisch einzubinden. Entweder die Datei /etc/fstab wird aktualisiert, oder ein Script wird unmittelbar nach dem Start des Raspberry Pis ausgeführt, um das Array einzubinden.

Erste Möglichkeit

Hierfür muss zuerst die UUIDs der RAID-Volumen über sudo blkid erhalten werden:

/dev/md0: UUID="11111111-1111-1111-1111-111111111111" TYPE="ext4"
/dev/md1: UUID="22222222-2222-2222-2222-222222222222" TYPE="ext4"

und diese dann in /etc/fstab schreiben:

UUID=11111111-1111-1111-1111-111111111111 /mnt/320GB ext4 defaults 0 0
UUID=22222222-2222-2222-2222-222222222222 /mnt/500GB ext4 defaults 0 0

Zweite Möglichkeit

...
[ TIME ] Timed out waiting for device /dev/disk/by-uuid/11111111-1111-1111-1111-111111111111
[DEPEND] Dependency failed for /mnt/320GB
...
You are in emergency mode. After logging in, type "journalctl -xe" to view system logs, "systemctl reboot" to reboot, "systemctl default" or "exit" to boot into default mode.

Cannot open access to console, the root account is locked.
See sulogin(8) man page for more details.
...

In der Datei /etc/rc.local muss vor dem exit 0 folgendes eingefügr werden:

until [ -b /dev/md0 ]; do
  sleep 1
done 
sudo mount /dev/md0 /mnt/320GB

until [ -b /dev/md1 ]; do
  sleep 1
done
sudo mount /dev/md1 /mnt/500GB

Fußnoten

  1. linuxquestions.org