# Notizen zum RAID-TA des c3d2 am 18.03.2005 - RAID-5-Teil
# Fragen an: Frank Benkstein <frank@benkstein.net>

## Benötigt: Kernel mit md, RAID-5 und loopback, mdadm

# folgendes alles als root

# falls existierende Loops benötigt werden, folgende Befehle anpassen

# alle bereits bestehenden Loop-Devices löschen
echo /dev/loop? | xargs -n1 losetup -d

# Loopdevices anlegen
for i in `seq 0 3` ; 
    do dd if=/dev/zero of=disk$i bs=1M count=100
    losetup /dev/loop$i disk$i
done

# Empfehlung: screen oder splitvt mit "watch -n1 cat /proc/mdstat" oben, shell
# unten oder zweites Terminal
# falls nicht, regelmäßig cat /proc/mdstat ausführen

# auch nie verkehrt: zweite console mit man mdadm

# RAID anlegen - so einfach!
mdadm --create /dev/md0 --level 5 --raid-devices 4 /dev/loop{0,1,2,3}

# gehört ein bestimmtes Blockdevice zu einem RAID?
mdadm --examine /dev/loop1

# bestehendes RAID untersuchen, UUID notieren
mdadm --detail /dev/md0

vi /etc/mdadm.conf

<code>
DEVICE /dev/loop*
ARRAY /dev/md0 uuid=...
</code>

# für Faule statt des vorherigen:
# echo 'DEVICE /dev/loop*' >> /etc/mdadm.conf
# mdadm --detail --scan >> /etc/mdadm.conf

# Monitor mode: mailt wichtige Ereignisse (z.B. Ausfall) an Admin.

# Die starndardmäßige Ausgabe ist ziemlich sporadisch, besser vielleicht
# folgendes Script
# dieses Skript wird von mdadm mit zwei oder drei Parametern aufgerufen:
# 1. die Art des Events (MissingSpareEvent, FailEvent, RebuildStarted, ...)
# 2. das RAID-Device, um das es geht (meist /dev/md0)
# 3. das Block-Device, mit dem das Event was zu tun hat (nicht immer)

<code path="/usr/local/sbin/handle-mdadm-events">
#!/bin/sh

FILE=`mktemp /tmp/mdadm-event.XXXXXX`
MAILTO=frank

cat > $FILE << EOF

A $1 event had been detected on $2, details follow.

# mdadm --detail $2 -- begin
`mdadm --detail $2`
# mdadm --detail $2 -- end

EOF

if [ ! -z "$3" ] ; then
    cat >> $FILE << EOF
# mdadm --examine $3 -- begin
`mdadm --examine $3`
# mdadm --examine $3 -- end

EOF
fi

echo "#contents of /proc/mdstat -- begin"
cat /proc/mdstat >> $FILE
echo "#contents of /proc/mdstat -- end"

mail -s "$1 event on $2:`hostname`" "$MAILTO" < $FILE
rm $FILE
</code>

# Monitor mode aktivieren:
mdadm --monitor /dev/md0 --program /usr/sbin/handle-mdadm-events --daemonise
# oder, wenn einem die sporadische Ausgabe reicht
mdadm --monitor /dev/md0 --mail frank --daemonise
# am besten in init-Skript aufnehmen
# wichtig: ein funktonierender lokaler Mailer wird hierbei vorausgesetzt
# falls dies nicht gewährleistet ist, statt die Zeile 
# mail -s "$1 event on $2:`hostname`" "$MAILTO" < $FILE
# durch
# cat $FILE > /var/log/$2.log
# oder ähnliches ersetzen

# mal ein bisschen mit dem neuen RAID rumspielen
mdadm --stop /dev/md0       # anhalten
mdadm --assemble /dev/md0   # zusammenbauen lassen

# Dateisystem auf RAID erstellen
mkreiserfs /dev/md0
mount /dev/md0 /mnt
df -h /mnt

# Dateisystem füllen, z.B.
tar xvjf linux-2.6.10.tar.bz2 -C /mnt
df -h /mnt

# zum späteren Vergleich
tar xvjf linux-2.6.10.tar.bz2

# was passiert, wenn eine Platte ausfällt?
# per Hand setzen mit --fail
# /proc/mdstat und evt. mutt beobachten

mdadm --fail /dev/md0 /dev/loop0

# Platte muss zunächst entfernt werden
mdadm --remove /dev/md0 /dev/loop0

# nach evt. Neustart und Auswechseln der Platte, neue hinzufügen

mdadm --add /dev/md0 /dev/loop0

# Wichtig: /proc/mdstat beobachten!

