Es waren einmal....
Windows-Clients und ein Linux-Server mit einem vermeintlich sicheren RAID-Verbund... und die Erkenntnis über geographische Sicherheit.
Jeder der einen Server mit gespiegelten Festplatten betreibt, würde sicherlich erst einmal auf die Frage "Wie sicher sind eigentlich die Daten auf deinem RAID?" sagen: "Total sicher".
Ein Blitzschlag im ziemlich nahe gelegenen Nachbarhaus brachte mir allerdings näher, dass ein Blitz meist die phänomenale Eigenschaft besitzt, gleich alle Festplatten in einem Server auf einmal zu "grillen" zu können... und einem die Versicherung und selbst ein Datenwiederherstellungsdienst wie Firma Kroll-Ontrack auch gegen den "Einwurf kleiner Münzen" hier nicht mehr all zu viel Material hätte, welches sie überhaupt retten könnte.
Und nun... was tun?
Ein zweites Backup an einem geographisch entfernten Ort muss her -
und zwar schnell! Und natürlich günstig!
Ein alter NAS325 von Zyxel fand sich in meiner "Hardware-Restekiste" wieder.
Das könnte doch die Lösung sein -
so lange ich diesen weit genug entfernt aufstelle.
Und wie bekomme ich dort nun die Daten hin?
rsync wäre sicherlich eine Möglichkeit -
mag das System aber anscheinend nicht.
Und der liebe Strom? Wie schalte ich das Gerät ein? Und wieder aus?
.....
Eine Stunde herum scripten - und das Problem war nun gelöst.
Vielleicht kann jemand den Ansatz gebrauchen. :-)
Viele Grüße,
Oliver [Zum vollen Artikel samt Script.]
#!/bin/bash
#
# Kleines Cronjob-Script zum Backup auf den NAS
#
# 2015-07-19 Oliver Lenz
#
# Die folgenden Parameter müssen ggf. angepasst werden.
#
quelle="/home/**"
ziel="//nsa325/sicherung/"
wakeupmac="1a:2b:3c:4d:5e:6f"
wakeupzeit=600
landevice="eth0"
zeitverbrauch_minimum=5
log="/var/log/backup.log"
tme="/var/log/backup.tme"
mountpoint="/media/backupmount/"
benutzer="admin-benutzer vom NAS325"
kennwort="hier ist dann ein ganz geheimes Kennwort vom NAS-Share vom Benutzer admin"
#
# Ändere hinter dieser Linie lieber nichts, wenn du dir nicht ganz sicher bist, was du da tun willst. :-)
#
if [ ! -e "$log" ]; then
touch "$log"
chmod 700 "$log"
else
chmod 700 "$log"
echo "############################################" >> "$log"
fi
echo "Beginne Backup. $( date "+%Y-%m-%d %H:%M:%S" )" | tee -a "$log"
start=$(date "+%s")
fehler=""
warnung=""
# mountpoint erstellen und prüfen
umount -f "$ziel" 2> /dev/null
mkdir "$mountpoint" 2> /dev/null
chmod 700 "$mountpoint" 2>/dev/null
if [ ! -d "$mountpoint" ] || [ "$( ls -al "$mountpoint" | grep " .$" | cut -d"." -f1 )" == "drwx------" ]; then
echo "Der Mountpoint konnte nicht erstellt werden oder die gesetzten Rechte sind nicht korrekt." | tee -a "$log"
fehler=1
else
echo "Der Mointpoint \"$mountpoint\" besteht mit passenden Rechten." | tee -a "$log"
zielip=$(echo "$ziel" | cut -d"/" -f3 | nslookup 2>&1 | grep "Address:" | grep -v "#" | cut -d" " -f2 )
echo "Das Ziel \"${ziel}\" hat die IP ${zielip}" | tee -a "$log"
# wakup des Ziels, sofern eine Waceupmac vermerkt wurde
# und noch nicht wach ist.
echo "Es wird versucht das Ziel ${zielip} zu erreichen."
ping -c 1 "${zielip}" 2>&1 >/dev/null
if [ ! "$?" == "0" ]; then
if [ -n "$wakeupmac" ]; then
echo "Das Ziel ist nicht erreichbar." | tee -a "$log"
echo "Sende einen WakeUp an Zielip ${zielip} (${wakeupmac}) via ${landevice}." | tee -a "$log"
ether-wake -i $landevice ${wakeupmac} 2>/dev/null
echo "Es wird nun ${wakeupzeit} Sekunden gewartet." | tee -a "$log"
sleep $wakeupzeit
ping -c 1 "$zielip" 2>&1 >/dev/null
if [ "$?" == "0" ]; then
ziel_erreicht=1
fi
fi
else
ziel_erreicht=1
wakeup_differenz=1
fi
if [ ! "$ziel_erreicht" == "1" ]; then
echo "Ziel ${zielip} nicht erreichbar." | tee -a "$log"
fehler=1
else
# mounten des Ziels
echo "Ziel ${zielip} ist erreichbar." | tee -a "$log"
mount -t cifs -o username=$benutzer,password=$kennwort "${ziel}" "${mountpoint}" 2> /dev/null
if [ ! "$( mount | grep "$(dirname "${mountpoint}.")" | wc -l | xargs echo )" == "1" ]; then
echo "Konnte das Ziel ${ziel} nicht nach ${mountpoint} mounten." | tee -a "$log"
fehler=1
else
# copy... Gewisse Fehler ausblenden; z.B. Dateien und Verzeichnisse mit ":" oder Symbolische Links.
echo "Beginne das Kopieren von ${quelle} nach ${ziel}." | tee -a "$log"
cp -rup ${quelle} ${mountpoint} 2>&1 | while read zeile; do
case "$zeile" in
*"cannot create symbolic link"*)
# nothing to do
;;
*"cannot create regular file"*)
p=$( echo $zeile | sed 's/.*`//g' | sed "s/': No such file.*//g" | grep -v ":" )
if [ -n "$p" ]; then
echo "Problem: $zeile" | tee -a "$log"
fehler=1
fi
;;
*"cannot create directory"*)
p=$( echo $zeile | sed 's/.*`//g' | sed "s/': No such file.*//g" | grep -v ":" )
if [ -n "$p" ]; then
echo "Problem: $zeile" | tee -a "$log"
fehler=1
fi
;;
*)
echo "Ein Problem ist aufgetreten: $zeile" | tee -a "$log"
fehler=1
;;
esac
done
# diskstatistik
statistik=$(df -h | grep "$ziel" | sed '1,$s/ * / /g')
gesamt=$(echo $statistik | cut -d" " -f2 )
genutzt=$(echo $statistik | cut -d" " -f3 )
frei=$(echo $statistik | cut -d" " -f4 )
genutzt_p=$(echo $statistik | cut -d" " -f5 | cut -d"%" -f1 )
frei_p=$(bc <<< "100-${genutzt_p}")
echo "Copyjob beendet." | tee -a "$log"
echo "Diskstatistik: Platz: $gesamt (100%) Genutzt: ${genutzt} (${genutzt_p}%) Frei: ${frei} (${frei_p}%)" | tee -a "$log"
# unmount
sync
umount "$mountpoint" | tee -a "$log"
# rmdir -f "$mountpoint"
# SMB-Server / NAS herunter fahren
# Version 1: Abschalten über den Apache
# wget -T 5 http://$zielip/abschalten.php --output-document=/tmp/dummy.txt
# rm -f /tmp/dummy.tmp
# Version 2: Abschalten über RPC
# net rpc shutdown -f -t 120 -C „Das System wird herunter gefahren“ -I $zielip -U $benutzer%$kennwort# net rpc shutdown -f -t 120 -C „Das System wird herunter gefahren“ -I $zielip -U $benutzer%$kennwort
# Version 3: Abschalten via SSH mit expect/spawn/send
# Nicht vergessen: Das Paket "expect" installieren und ssh auf dem NAS einschalten :-)
echo "Schalte Zielsystem ab." | tee -a "$log"
expect -c "
set timeout 10
spawn ssh root@${zielip}
expect {
\"*continue connecting (yes/no)?*\" {
send yes\r
exp_continue
}
\"*assword:*\" {
send $kennwort\r
exp_continue
}
\"~ # \" {
send poweroff\r
expect \"*Connection to ${zielip} closed.*\" {
exit
}
}
}
" 2>&1 > /dev/null
#Zeitdelta berechnen, sofern Referenz vorhanden
zeitverbrauch=$(expr $(date "+%s") \- $start)
if [ -n "$wakeup_differenz" ]; then
zeitverbrauch=$(expr $zeitverbrauch \+ $wakeupzeit )
fi
if [ -e "$tme" ]; then
zeitverbrauch_delta=$( expr ${zeitverbrauch} \- $(cat ${tme}) )
fi
echo ${zeitverbrauch} > "$tme"
fi
fi
fi
diff=$(expr $(date "+%s") \- $start)
sekunden=$(($diff%60))
minuten=$(($diff/60%60))
stunden=$(($diff/60/60%24))
tage=$(($diff/60/60/24%7))
echo "Dauer: ${tage}d ${stunden}h ${minuten}m ${sekunden}s" | tee -a "$log"
echo "Beende Backup. $( date "+%Y-%m-%d %H:%M:%S" )" | tee -a "$log"
if [ -n "${fehler}" ]; then
echo -e "\nFEHLER: ES SIND FEHLER AUFGETRETEN. \n" | tee -a "$log"
exit 2
else
if [ -n "$zeitverbrauch_delta" ] && [ $zeitverbrauch_delta -lt $zeitverbrauch_minimum ]; then
echo -e "\nWARNUNG: Das Zeitdelta zum letzten Backup beträgt lediglich $zeitverbrauch_delta Sekunden.\n" | tee -a "$log"
exit 1
else
echo -e "\nOK: Das Backup scheint fehlerfrei durchgelaufen zu sein. Zeitdelta: ${zeitverbrauch_delta} Sekunden.\n" | tee -a "$log"
exit 0
fi
fi
Nachsatz: die IP sollte im dns bzw. unter /etc/hosts gepflegt sein!
Und ggf. muss für einen automatischen Cronjob auch die Variable "PATH" ordentlich gesetzt sein.
Abonnieren
Kommentare zum Post (Atom)
Keine Kommentare:
Kommentar veröffentlichen