Kätzchen schrieb:
Man kann auch Dateien so speichern oder packen, das es eine Reparaturmöglichkeit gibt. In diesem Video geht es um Windows Software, es ist aber interessant um zu kapieren wie es funktioniert:
Danke, die schaue ich mir mal an (hab gerade keine gescheite Bandbreite zur Verfügung).
san04 schrieb:
Dein Problem ist allerdings nicht so ungewöhnlich, dass es nicht bereits gut erprobte Lösungen dafür gibt. Die sind vermutlich schneller und effizienter und es haben deutlich mehr Leute drübergeschaut, was die Gefahr für gravierende Bugs verringert. Gerade bei so einem sensiblen Thema wäre das für mich ein Grund keine eigene Lösung zu basteln.
BorgBackup wurde ja schon genannt. Ich werfe mal noch restic in den Raum.
checking-integrity-and-consistency wäre hier ein Blick wert.
Naja, mein Script kann ich noch gut überschauen, da ist nicht viel Spielraum für Bugs. Ich erprobe immer alles sehr penibel bevor ich es erweitere und lasse mir die nötige Zeit. Und die "kompliziertere" Arbeit nimmt "rsync" ja für mich bereits ab.
Ich schreibe es lieber selber, weil ich oft Sonderwünsche habe und es dann nicht mit Features ausgestattet ist, die ich nicht brauche (und Angriffsfläche für Bugs liefern) und ich arbeite gerne nach dem KISS Prinzip, also alles so simpel wie möglich halten. Dazu gehört, so wenig zusätzliche Software wie möglich einzusetzen, bzw. mit Boardmitteln zu arbeiten. Meine Scripte sollten möglichst auf jedem Linux nativ laufen, ohne zusätzliche Installationen. Und mittels "rsync" und "sha256sum" habe ich in diesem Fall bereits alles was ich brauche.
Ausserdem lerne ich so besser mit der Shell umzugehen und Scripte zu schreiben, bzw generell das Programmieren und vor allem strukturieren größerer Scripte.
dingsbums schrieb:
Aktuellen Zustand gegen die Dateiliste prüfen, geänderte Dateien ausgeben
| #! /bin/bash
cat sha256sums.txt | while read line;do
datei=$(echo ${line#*' '})
sha_saved=$(echo ${line%%' '*})
sha_now=$(sha256sum "$datei" | cut -d ' ' -f1)
if [ ! "$sha_now" == "$sha_saved" ];then
echo "$datei wurde geändert"
fi
done
|
Sollte auch mit Leerzeichen in Ordner- und Dateinamen funktionieren.
Mit doppelten oder mehr Leerzeichen funktioniert es nicht. 😉 Diese Daten werden korrekt in die Liste geschrieben aber bei der Prüfung nur noch teilweise ausgelesen (bis zum doppelten Leerzeichen) und entsprechend als unauffindbar bemängelt. Was aber eigentlich gut ist, so kann man diese Dateien gleich ausfindig machen und den Dateinamen korrigieren.
Kannst du mir noch einmal helfen, wie ich das Script abändern muss, damit es bei der Prüfung alle Zeilen die mit "#" beginnen ignoriert?
Nachdem die Datei geschrieben wurde, wollte ich z.B. mit
| echo -e "# bla $(date +%y%m%d)$(date +%H%M)\n$(cat /ordner/shasum.txt)" > /ordner/shasum.txt
|
noch ein par eigene Zeilen einfügen, damit die Datei quasi einen gescheiten Header hat, mit zusätzlichen Infos (falls man mal reingucken will, wann die Datei angelegt wurde und mit welcher Scriptversion etc.).
Allerdings schlagen alle diese Zeilen dann bei der Prüfung an, statt ignoriert zu werden.
Wenn ich mehr Zeit habe, werde ich mich mal tiefer mit deinem Script befassen (es vollständig verstehen) und es dann so umschreiben, dass es besser mit den eigenen Änderungen von Ordnerstrukturen umgeht, statt stumpf alles zu prüfen/neuzuschreiben. "rsync" gibt ja selber genug Daten aus, die verändert wurden und wie. Die muss ich nur gescheit mit dem SHA-Scrypt verbinden, da hab ich schon grobe Ideen.
dingsbums schrieb:
Das ist brutal viel Arbeit für die Platten
Wenn du einen Riesenhaufen links mit einem Riesenhaufen rechts vergleichen willst, geht das nun mal nicht ohne Aufwand. Zumal wenn sich der Inhalt des "Haufens" regelmäßig ändert. Und es dürfte ziemlich egal sein, ob du das dann per eigenem Skript oder per Fertiglösung machst. Prüfsummenberechnung wird immer IO- und CPU-Last erzeugen.
Für die Arbeit mit meinen USB-Sticks (mit eher kleinen Daten drauf) funktionert es bisher für mich perfekt.
Ich habe das Script mit meinem 300GB Testordner mal ausprobiert, da brauchte es ziemlich genau 20 Minuten für. Das ist für mich in Ordnung. Je größer meine Backups sind, desto seltener rühre ich diese an. Und auf den meisten meiner ganz großen Platten sind Daten die nicht so sensibel, dass ich dort eigentlich keine SHA-Prüfung brauche. Aber ich werde meine Ordnerstruktur anpassen, dass ich kleinteiliger Prüfungen durchführen kann, sodass nicht immer gleich die gesamte Platte auf einmal geprüft werden muss. Und "shamd5sum" gibts ja auch noch, was man für nicht ganz so wichtige Daten mal probieren kann.
sonstiges:
Mittlerweile ist mein Script 800 Zeilen lang. Sehr schick und mit allerlei Fehlerprüfungen gespickt, dass selbst bei grober Fehlbedienung nichts schief gehen kann. Optionen werden automtatisch deaktiviert und ausgeblendet, wenn sie nicht möglich/sinnig sind oder abgedunkelt und/oder mit einer Sicherheitsbestätigung versehen, wenn sie kritischer Natur sind (z.B. bei den Einzel-Optionen: eine SHA-Liste zu überschreiben, statt nur zu prüfen).
Und ich habe eine einwandfrei funktionierende Vollautomatik-Option eingebaut,
- die erst die SHA-Liste von Laufwerk 1 prüft, bei vom Script erkannten Änderungen stoppt das Script nach der vollständigen Prüfung und man kann dann schauen ob diese Abweichungen so stimmen, weil man diese Daten z.B. selber verändert hat und dann z.B. die Differenzen ignorieren (Script weiter machen lassen aber die Liste lassen wie sie ist) oder gleich die SHA-Liste mit den aktuellen Änderungen überschreiben, damit sie wieder auf aktuellem Stand ist (oder zurück ins Hauptmenü, wo man Einzel-Optionen auswählen kann),
- dann wird die Liste von Laufwerk 2 (das Backup) überprüft, ob die Daten seit dem letzten Mal alle immernoch heile sind,
- wenn die einwandfrei ist, automatisch "rsync" durchgeführt
- und dann die SHA-Liste (Laufwerk 2) an den neuen Stand angepasst (und nochmal geprüft, das die neue Liste auch einwandfrei funktioniert).
Das Script erkennt auch, ob bereits SHA-Listen vorhanden sind und wenn nicht, wird die Prüfung ausgelassen (weils ja nix zu prüfen gibt) und wenn noch kein Backupordner existiert, RSYNC mit anderen Befehlen die für das Erstanlegen optimiert sind ausgeführt. Fehlende Ordner werden automatisch angelegt, damit es zu keinen Fehlern kommt und das Script zeigt Anomalien bzw. "Fehler" an und was es genau tut (z.B. bei der ersten Ausführung Ordner anlegen), wenn es keine kritischen Fehler sind, behebt es diese selbstständig.
Das wende ich derzeit auf meine verschlüsselten USB-Sticks an, mit denen ich extrem viel arbeite (habe immer 2 Stück, einer als schnell einsetzbares Backup, zusätzlich zu den HDDs). Dort sind sehr sensible Daten drauf und die Dinger gelten halt nicht als sehr zuverlässig. Aber mit dem Script kann ich super bequem und auch noch recht schnell nahezu perfekt die Datenintegrität waren. Macht ein Stick Probleme würde es durch das Script sofort aufallen. Dauert auch nur wenige Sekunden bis Minuten. Ich brauche nur beide Sticks einstecken, das auf dem Stick liegende Script einmal starten, "a" (für "Automatik") und Enter drücken und dann warten bis das Fenster grün aufblinkt (bzw. seine unübersehbare "FERTIG"-Meldung zeigt und das wars.
Für Daten im niedrigen zweistelligen GB Bereich ist das bestens brauchbar.
Eine Funktion die ich in den letzten Tagen entdeckt habe. Nichts für Epileptiker aber saucool um sofort einen bestimmten Status zu erfassen, selbst wenn der Blick gerade auf einem anderen Fenster oder Bildschirm liegt.
| printf "\e]11;green\e\\"; sleep 0.3; printf "\e]11;black\e\\"
|
Und wer auch Spaß an Farben hat, kann gerne das hier benutzen: (vereinfacht die Farbauswahl)
| #!/bin/bash
echo -e "TPUT setaf"
colors=256; for (( n=0;n<colors;n++ )) do printf "$(tput setaf $n)%3s$(tput sgr0) " $n; (( (n+1)%12==0 )) && echo; done
echo -e "\n\nTPUT setab"
colors=256; for (( n=0;n<colors;n++ )) do printf "$(tput setab $n)%3s$(tput sgr0) " $n; (( (n+1)%12==0 )) && echo; done
echo -e "\n"
echo -e "$(tput setaf 4)$(tput blink)blink$(tput sgr0) $(tput setaf 4)$(tput bold)bold$(tput sgr0) $(tput setaf 4)$(tput dim)dim$(tput sgr0) $(tput setaf 4)$(tput sitm)sitm$(tput sgr0) $(tput setaf 4)$(tput rev)rev$(tput sgr0) (start standout >) $(tput setaf 4)$(tput smso)smso$(tput sgr0) $(tput setaf 4)$(tput rmso)rmso$(tput sgr0) (< end standout)"
echo -e "(start underline > ) $(tput setaf 4)$(tput smul)smul$(tput sgr0) $(tput setaf 4)$(tput rmul)rmul$(tput sgr0) (< end underline) $(tput setaf 4)$(tput invis)invis$(tput sgr0) (<invis)"
|
Das habe ich mir nach viel unbefriedigender Rumsucherei teilweise selbst gebastelt, damit man genau sieht, wie die Farben auf dem eigenen Monitor aussehen (da zumindest die einstelligen Zahlen wol auf den Systemen stark abweichen oder sich durch Updates verändert haben, im Netz weiß man ja oft nicht wie alt die Daten und Bilder dort sind).
[edit]
Zoner schrieb:
Kannst du mir noch einmal helfen, wie ich das Script abändern muss, damit es bei der Prüfung alle Zeilen die mit "#" beginnen ignoriert?
Habe das jetzt so gelöst:
1
2
3
4
5
6
7
8
9
10
11
12
13 | #! /bin/bash
cat sha256sums.txt | while read line;do
if [ ${line:0:1} != '#' ]
then
datei=$(echo ${line#*' '})
sha_saved=$(echo ${line%%' '*})
sha_now=$(sha256sum "$datei" | cut -d ' ' -f1)
if [ ! "$sha_now" == "$sha_saved" ];then
echo "$datei wurde geändert"
fi
fi
done
|
Damit sind für mich erstmal sämtliche Fragen erledigt.