Nicht nur bei einem Backup seiner Fotos und Videoclips ist man ja vielleicht in Sorge, dass das Backup nicht mit der Zeit fehlerhaft wird oder sich Fehler einschleichen. Hier könnte Hashdeep Abhilfe leisten.
Einleitung
Ich habe meine Fotos und auch meine Videoclips jeweils auf einem externen NVMe Laufwerk, einfach weil dass sich als beste Arbeitsweise für das Arbeiten mit mehreren Geräten herausgestellt hat. Diese Daten werden regelmäßig, also z.B. bei einem neuen Fotoimport in Lightroom per Robocopy auf ein NAS-System gesichert.
Das NAS läuft mit Openmediavault und ZFS als Filesystem. Trotzdem werden diese neben auch anderen Daten per USBBackup auf externe Platten gesichert, die in einem ICY-Box Gehäuse stecken. Die Festplatte für Fotos wird sogar jede Montag gewechselt. Dadurch bestehen von meinen Fotos 2 weitere Kopien.
Und wo kommt jetzt Hashdeep ins Spiel?
Hashdeep ist praktisch für alle Linux Distributionen verfügbar, also auch für Debian, denn darauf basiert ja Openmediavault.
Hashdeep kann für alle Dateien in einem Verzeichnisbaum Prüfsummen erzeugen, und diese in eine Prüfsummendatei schreiben. Ursprünglich wurde Hashdeep mal entwickelt und so veränderte Dateien nach einem Hackerangriff festzustellen. Hier als Beispiel mal der Aufruf:
hashdeep * >~/hashed.txt
Die Textdatei enthält nun Pfade und Namen der Datei, für die Hashes generiert wurden.
cat ~/hashes.txt
%%%% HASHDEEP-1.0
%%%% size,md5,sha256,filename
## Invoked from: /home/pm/bin
## $ hashdeep bench.sh clip_compress.sh compres.sh
##
926,64be1e3d9ecfa6ac1bfdd27e88fecba8,fe1ad90ba76f4a37354ca9750539ba1e70b6d019f3febd90a63b318c7ce80c86,/home/pm/bin/clip_compress.sh
1246,8dd17d3b0abb7222d2ce9897e8516546,fa46875238754e22e7d8828eb96d24d5496c0be796f15b854fe81e9a0752507f,/home/pm/bin/bench.sh
125,756edeb1f1b83c1fadecec38abb33891,66d1a24d67a12a280efbb61a93579c8bc1cf5d2d1041a9ad017b34fde181e1a1,/home/pm/bin/compres.sh
~/bin$
Um die Konsistenz der Speicherung sicherzustellen, erfolgt eine Überprüfung mittels Hashdeep. Das sieht dann so aus:
hashdeep -a -v -k ~/hashes.txt *
hashdeep: Audit passed
Files matched: 3
Files partially matched: 0
Files moved: 0
New files found: 0
Known files not found: 0
Moderne Festplatten können zwar im Regelfall Fehler bei der Speicherung der Daten durch das Paritätsbit erkennen, wenn ein solcher Fehler aber auftritt, kann er nicht korrigiert werden.
So kann mittels Hashdeep geprüft werden, ob evtl. Änderungen an Dateien vorgekommen sind. In Verbidung mit den letzten Zugriffszeiten kann man dann vielleicht ermitteln, wann es zu dieser Veränderung gekommen ist.
Und die Anwendung beim Foto-Backup?
Meine Fotos befinden sich in einem Unterordner und dort wiederum ist für jedes Jahr ein weiterer Unterordner angelegt. In diesme jährlich Unterordner werden dann noch Unterordner mit dem Datum und dem evtl. Event gebildet, in dem dann die Fotos abgelegt werden. Mit dem Schalter -r können nun diese Verzeichnisse rekursiv durchwandert werden.
Dazu habe ich dann folgendes Script erstellt, um dies möglichst automatisiert ablaufen zu lassen.
#!/bin/bash
# $Id: wrapper.sh 302 2024-10-24 17:02:29Z pm $
# $Rev: 302 $
# $Author: pm $
##################################
# Fotos = foto
# blog-fotos = blog
exec 5> >(logger -t $0)
BASH_XTRACEFD="5"
PS4='$LINENO: '
incyear () {
LY=$(cat $1)
local YEAR=$((LY+1))
if [ ${YEAR} -gt $(date +%Y) ]; then
YEAR=$2
fi
echo ${YEAR} > $1
echo ${YEAR}
}
case $1 in
foto)
STARTYEAR=2003
BASEDIR="Fotos/LWH/"
CHECKYEAR=~/hashdeep/check-$1
YEAR=$(incyear $CHECKYEAR $STARTYEAR)
cd /Pool/${BASEDIR}
echo "Year: Foto $YEAR"
time hashdeep -a -r -l -vv -k ~/hashdeep/$1-${YEAR}.txt ${YEAR}/*
echo "Fotos"
;;
foto-gen)
#STARTYEAR=2008
BASEDIR="Fotos/LWH/"
cd /Pool/${BASEDIR}
time hashdeep -j 16 -c md5 -r -l ${2}/* > ~/hashdeep/foto-${2}.txt
;;
usb-foto)
# called every 20 weeks for alle years will rotate thru all 3 disks
# same for every 10 weeks or 17 weeks
STARTYEAR=2003
#mount /dev/sdj1 /root/usb
BASEDIR="Fotos/LWH"
CHECKYEAR=~/hashdeep/$1
YEAR=$(incyear $CHECKYEAR $STARTYEAR)
cd /root/usb/${BASEDIR}
echo "Year: $YEAR"
time hashdeep -a -r -l -v -k ~/hashdeep/foto-${YEAR}.txt ${YEAR}/*
#umount /dev/sdj1
;;
*)
echo "$0 Help"
echo "foto Checks hashes for Fotos"
echo "foto-gen Param Year generates hashfile"
echo "usb-foto Param Year checks USB drives hashfile"
;;
esac
Fangen wir an der Stelle mit der einfachsten Option an, und zwar genrieren wir die Hashes für alle Fotos eines Jahres. Der Aufruf des Scriptes würden dann wie folgt gehen: wrapper.sh foto-gen 2016.
Die entsprechenden Fotos befinden sich dann in $BASEDIR/2016 und der hashdeep Aufruf erstellt alle Hashes zu den Dateien und speichert ides in der Datei ~/hashdeep/foto-2016.txt ab. Da Präfix foto wird genutzt, da das Script etwas länger ist und auch für die Blog-Fotos und auch für Video Clips genutzt wird. Wichtig ist hier nur, dass in das Basisverzeichnis gewechselt wird und hashdeep nur relative Pfade aufzeichnet.
Die Überprüfung und der Umgang mit usbbackup von Openmediavault schauen wir uns im Teil II an.