Backup von wichtigen Systemdateien und eigene SMART-Logs erzeugen

Status
Für weitere Antworten geschlossen.

botharg

Benutzer
Mitglied seit
19. Okt 2009
Beiträge
48
Punkte für Reaktionen
0
Punkte
12
Hallo an Alle!

Nachdem ich nun seit geraumer Zeit bestimmte Funktionen unter meiner DS-Haube haben wollte, aber nirgends genau gefunden habe was ich suche, habe ich nun in einer Hau-Ruck Aktion angefangen kleine Shellscripte zu schreiben, die (momentan zumindest) schonmal anfangen das zu erfüllen, was ich eigentlich haben will. :cool:
Ich muß dazu sagen, eigentlich hate ich bisher meine Scripte immer nur für/unter Windows geschrieben (und man sollte es nicht glauben, aber auch die Commandshell von Windows ist seit Jahren besser für manche Aufgaben geeignet als so manches grafisches Programmlein...;)) und immer einen recht eindeutigen Bogen um die Linux Shell gemacht, auch wenn ich mit Linux an sich schon seit Jahren gerne arbeite (auch auf der Shell, aber halt nicht mittels Scripten).
Seit ich nun meine DS109 habe (September 2009) mußte ich zwangsläufig immer mal wieder die Konsole bemühen, und auch hier befiel mich irgendwann die Erkenntnis: effizientes Arbeiten geht häufig nicht ohne ein Script oder zumindest ein ordentlich definiertes Alias.

Die zwei folgenden Scripte entstanden hauptsächlich aufgrund "schlechter" Erfahrung mit meiner DS - oder vielmehr mit der darin enthaltenen Platte.
Ursprünglich hatte ich ein Bundleangebot DS109 mit 2TB WD-green-irgendwas gekauft (ohne zuvor im Inet zu gucken, was es für Erfahrungen mit den WD Platten gibt, der Kauf war mal wieder ein "jetzt-musses" Entschluß).
Und wie es nunmal so ist (auch wenn man es schon aus beruflichen Gründen eigentlich besser weiß): "oooch, mein Backup mach ich erst, wenn alles läuft wie ich es will..." :eek:
Dieser Entschluß und die fatale Eintscheidung den Großteil meiner Daten gleich auf die neue Platte zu verschieben (sonst hab ich ja dann alles doppelt...:eek:) führte dann zu der Erkenntnis: Wenn JETZT die neue Platte abraucht nützt es auch nix, sich selbst in den Ar... zu beissen (auch wenn man das irgendwie schaffen sollte)! Aber genau das tat die Platte natürlich auch....

Zwar hab ich meine Daten alle wieder bekommen, allerdings auch einen WIRKLICH unnötig RIESIGEN Haufen zusätzliche Arbeit. Diese Erfahrung brachte mich zu der Erkenntnis: Ich brauche unbedingt ständig aktuelle Informationen über die Smartwerte meiner Platte(n), und zwar ohne mich dazu immer ins Interface einloggen zu müssen.
Ich möchte also (das habe ich schon fertig gebracht, wenn auch nicht sehr elegant), daß mir in regelmässigen Abständen die Smartwerte der Platte (zum Nachverfolgen) in einem Verzeichnis abgelegt werden, auf das ich auch per Samba/FTP/usw. und als nicht Admin Zugriff habe.
Ausserdem möchte ich einen "besonderen" Hinweis, wenn sich die Werte (abgesehen von den Betriebsstunden) ändern (hab ich auch hinbekommen).
Wenn so eine Änderung auftritt, möchte ich gerne eine eMail mit diesen Werten (das fehlt mir noch, aber um den Weg momentan weiterzuverfolgen, bin ich zu Müde).

Script 1 sieht also aus wie folgt und liegt in "/root"

Rich (BBCode):
#!/bin/sh

smartlog=/volume1/homes/admin/synology/smartwerte
smartdiff=$smartlog/smart_sda_diff.info
mkdir $smartlog

for log in `ls $smartlog/*.txt | tail -1`; do last=$log; done
smartctl -d marvell -A /dev/sda >$smartlog/smart_sda_`date +%Y%m%d_%H%M%S`.txt
# smartctl -d marvell -A /dev/sda | egrep 0x >$smartlog/smart_sda_`date +%Y%m%d_%H%M%S`.txt
# fuer diejenigen, die die Werte einfach ohne Kopf haben wollen, egrep deshalb, weil das DS-"grep" zumindest bei mir nicht hinhaut
for log in `ls $smartlog/*.txt | tail -1`; do curr=$log; done

chmod -R 777 $smartlog
chown -R admin:home $smartlog

diff -iwB -I Hours $last $curr >> $smartdiff
vgl1=`basename $last`
vgl2=`basename $curr`

if [ "$smartdiff" -nt "$last" ]; then echo $vgl1 mit $vgl2 >> $smartdiff; fi

Was sollte vorbereitet sein:
* der Pfad für "smartlog" (jeder wie er es haben will)

Was wird (über IPKG oder sonstwie) gebraucht:
* diffutils: ipkg install diffutils

Was macht das Teil:
Zuerst wird in der Variable "smartlog" festgelegt, wo das "LOG-Verzeichnis" für die Smartwerte liegt und in "smartdiff" wird definiert, wie das "Delta"-File heissen soll, also das, in dem die geänderten Werte (letztes zum aktuellen Log) stehen.
Dann wird noch der Pfad angelegt (wobei ich momentan auch noch ein Problem habe, da Linux offenbar keinen kompletten, nicht existenten Pfad anlegen kann). Im Zweifel sollte man diesen Pfad also selber schnell erstellen, der "mkdir" Befehl kann dann getrost entfernt oder die Ausgabe nach "/dev/null" umgeleitet werden.
* Die letzte (Datum) Logdatei wird festgestellt ("last") - das führt zu einem Fehler, wenn noch keine existiert, ist aber nicht weiter tragisch.
* Die SMART-Werte der Platte "SDA" (das muß evtl. entsprechend abgeändert werden) werden abgerufen und in eine Datei mit Zeitstempel geschrieben.
* Es wird die letzte (also nun die aktuelle) Logdatei gesucht ("curr")
* Damit auch jeder Benutzer (der Zugriff auf (hier) das Synology-Verzeichnis hat) was mit den Logs anfangen kann, werden die Berechtigungnen angepasst (chmod/chown), wobei bei "chown" zumindest die Gruppe ("home") für jeden individuell angepasst werden muß.
* Mit "diff" wird nach Unterschieden in den beiden letzten Dateien ("last" und "curr") gesucht, wobei die Betriebsstunden sinnvollerweise ignoriert werden. Das Ergebnis (so es eines gibt) landet in der Datei "smartdiff" (wurde am Anfang festgelegt)
* Nun gucken wir noch ob die "smartdiff"-Datei neuer ist (nach Änderungszeit), als die "last"-Log, was nur dann der Fall ist, wenn Diff Unterschiede festgestellt hat. Ist das der Fall wird an die "smartdiff"-Log angehängt, von welchen beiden Vergleichen die Unterschiede stammen. Damit hat man auch gleich einen gewissen Überblick, welcher Zeitraum zwischen den Änderungen liegt.

Damit ist das Shellscript einsatzbereit. Wie man das Teil letztendlich nennt ist völlig egal. Ich würde den Code hier abkopieren, die Shell öffnen (putty), im "/root"-Verzeichnis sollte man sowieso sein, "touch smartwerte.sh" eingeben, den Editor seiner Wahl (ich nehme am liebsten Joe (ipkg install joe) nehmen, weil der Wordstar (Gott bin ich alt!!!) kompatibel ist - Ich liebe Klammern, merkt man das?), und fügt per rechten Mausklick in das Putty-Fenster den zuvor kopierten Code ein.
Noch abspeichern und den Editor beenden.

Eine Frage zwischendurch: Kann es sein (auf meiner DS ist das tatsächlich so), dass ein "chmod +x" hier in der Busybox nicht nötig ist? Auch das "#!/bin/sh" am Anfang ist tatsächlich nicht notwendig, wenn das Script per "sh 'script.sh'" aufgerufen wird...

Ich habe das Script in die "rc.local" eingetragen (/bis/sh /root/'script.sh'), damit bei jedem Start der DS die Werte aktualisiert werden, und als Job in die "crontab", damit jeden Tag zumindest einmal die Werte aktualisiert werden, da meine DS nicht ohne besonderen Grund neu startet.


Notwendigkeit für Script 2:
Man macht diverse Veränderungen an neuralgischen Linux Dateien (eigentlich immer die Selben) aber was man eigentlich ändert, dokumentiert natürlich niemand (ja ich weiß, das SOLLTE man).
Ich möchte also, daß alle Dateien, in denen ich eigene Änderunge/Anpassungen vornehme, nachvollziehbar an einen "sicheren" (sprich anderen...) Ort kopiert werden - und zwar ohne daß ich alle Dateien ständig manuell kopieren muß.
Meine (funktionierende aber da wenig elegante, also vorläufige) Lösung sieht wie folgt aus:

Rich (BBCode):
#!/bin/sh

bkpdir=/volume1/homes/admin/synology/settings/cfgbkp\_`date +%Y%m%d_%H%M`
mkdir $bkpdir 2>&1 > /dev/null

for file in $(ls /usr/syno/etc/smb.conf; ls /etc/rc.local; ls /etc/profile; ls /root/.profile; ls /root/*.sh; ls /root/*.txt; ls /etc/crontab;);
   do
      filebase=`basename $file`
      cp $file $bkpdir/$filebase\_`date +%Y%m%d_%H%M%S`
done
/opt/bin/ipkg list_installed >$bkpdir/installed_ipkg\_`date +%Y%m%d_%H%M%S`.txt

chmod -R 777 $bkpdir
chown -R admin:home $bkpdir

Was sollte vorbereitet sein:
* der Pfad für "bkpdir" (jeder wie er es haben will), mit Ausnahme des Teils mit Zeitstempel, also idF. "/volume1/homes/admin/synology/settings/"

Was wird (über IPKG oder sonstwie) gebraucht:
* soweit ich das überblicke, nix

Was macht das Teil:
* Das Backupverzeichnis wird festgelegt und dazu noch ein Zeitstempel (pro Aufruf, gilt für alle nachfolgenden Zeilen)
* Das gerade festgelegt Verzeichnis (eigentlich nur der Teil mit dem Datum) wird erstellt
* Per Schleife wird abgearbeitet, welche Datei (vollständiger Pfad) weiterverarbeitet werden soll. Diesen Teil empfinde ich als besonders unelegant, weil ich das unter Windows definitiv besser gelöst hätte, aber hier krieg ichs irgendwie noch nicht gebacken. Aber es funktioniert zumindest. Wichtig ist das hier nicht die Dateien an sich benutzt werden, sondern ein Befehl initiiert wird (das "ls") der nach der Datei sucht - damit die Schleife ordentlich abgearbeitet werden kann. Wichtig dabei ist jeweils das abschliessende ";".
* Wenn das entsprechende File gefunden wurde, wird im zuvor festgelegten Verzeichnis "bkpdir" die Datei plus Zeitstempel abgelegt. Eigentlich sollten hier nur die Dateien landen, die eine Änderung erfahren haben... aber leider krieg ich das nicht hin.
* Die installierten IPKG Pakete werden in eine Textdatei gelistet
* Damit auch jeder Benutzer (der Zugriff auf (hier) das Synology-Verzeichnis hat) was mit den Logs anfangen kann, werden die Berechtigungnen angepasst (chmod/chown), wobei bei "chown" zumindest die Gruppe ("home") für jeden individuell angepasst werden muß.

Ich habe mir dieses Script ebenfalls in der crontab eingetragen und lasse es einmal pro Woche laufen.

Wichtig: Wer manuell Einträge in die "crontab" macht, muß den Dienst danach neu starten, damit das auch funktioniert (und natürlich alles beachten was für die Bearbeitung der crontab sonst so geschrieben wurde).

Gruß an Alle .. Platz geht aus:eek:
 
Zuletzt bearbeitet:

botharg

Benutzer
Mitglied seit
19. Okt 2009
Beiträge
48
Punkte für Reaktionen
0
Punkte
12
Als zweiter Teil des Beitrags, da ich im ersten keinen Platz mehr hatte:
Bin natürlich nur allzu erfreut, wenn jemand was zu den Scripten beitragen kann, zB. sie etwas zu "verschönern" oder schon eine Lösung für den Mailversand hat...
 

itari

Benutzer
Mitglied seit
15. Mai 2008
Beiträge
21.900
Punkte für Reaktionen
14
Punkte
0
Sehr schön :)

zum 1. Skript gibt es etwas ähnliches seit Jahren ... ist auch hier irgendwo im Forum: Anzeige der Temperaturen als Histogramm inklusive Mail-Versand.

zum 2. Skript hatte ich mal etwas ähnliches als 3rdparty-apps geschrieben (Stichwort Firmware-Repository).

Ich hab diese Anmerkungen jetzt nicht geschrieben, um dich zu demotivieren, sondern um dir Beispiele an die Hand zu geben, wo du auch rein schauen kannst. :)

Die Frage, die du dir auch noch stellen solltest, ist, wie du mit der Verwertung deiner Skripte umgehen willst. Ich habe ja alle meine Skripte unter die GPL3 gestellt, so dass dies bei mir immer geklärt ist. Vielleicht schaust dir das an und macht es genauso.

Itari
 

botharg

Benutzer
Mitglied seit
19. Okt 2009
Beiträge
48
Punkte für Reaktionen
0
Punkte
12
hmm, auf was Du Dich unter 1) beziehst habe ich zwar auch schon mal (grob:eek:) angetestet, entsprach allerdings nicht so ganz meinen Wünschen, da es mir wirklich nur um die puren, sich veränderten Smartwerte ging. Ganz besonders um die error, uncorrectable, und pending Werte, welche bei der alten Platte eben (im Nachhinein ausgelesen) schön hoch waren.
Die Temperatur und andere Dinge sind mir dabei nicht so wichtig. Gerade die Temp ist eh immer ok gewesen, bei sämtlich Platten hier (und da stehen ne Menge rum)

Zu 2) hab ich jetzt so speziell noch nix gefunden, hab aber auch nicht sooo tief danach gesucht. Ich werd aber mal nach dem Firmware Repository suchen.

Was die Verwertung der Skripte anbelangt: Ich will damit weder was verdienen noch anderen die Dinger vor die Nase halten und sagen: ällabätsch, meins :p
Von mir aus kann jeder damit machen was er will, ich hoffe ja auch drauf, daß der eine oder andere was daran verbessern kann oder evtl. dadurch irgenwo einen neuen Ansatz sieht oder irgendwas davon woanders verwendet werden kann. So mach ich das ja auch.

Was muß ich denn genau machen wenn ich meine Scripte unter GPL3 stellen will? Hast Du da zufällig nen Tip oder auch ne URL? :D

***edit
Ich hab gerade nach "Firmware repository" gesucht, sofern (davon gehe ich aus) Du das hier meintest: Das mach ja weeeesentlich mehr als mein script. Ich hatte bisher eigentlich nicht vor das ganze Zeug zu "backupen".
Wahrscheinlich bin ich Windows geschädigt, aber da ich eh nur eine private DS betreibe (mit sehr überschaubarer Benutzerzahl) richte ich meine DS bei Notwendigkeit lieber "frisch" ein, und umgehe damit Probleme die evtl. Inkompatibilitäten bereiten. Sichern will ich eigentlich nur daß was ich selber 'reingezaubert hab und nicht irgenwo nachlesen kann. Heißt installierte .spk's kann ich immer wieder laden, IPKG lässt sich wieder installieren, nur weiß ich natürlich nicht, was ich alles dazu installiert hab, also brauch ich nur die Liste mit dem was installiert wurde.
Um auf Nummer Sicher zu gehen vor einem Update oder "größeren" Eingriff lege ich mir sowieso ein RAW Abbild der Platte an.
 
Zuletzt bearbeitet:

itari

Benutzer
Mitglied seit
15. Mai 2008
Beiträge
21.900
Punkte für Reaktionen
14
Punkte
0
Hi botharg,

zu 1) klaro, dein Skript hat eine andere Intention ... ich meinte, du könntest dort etwas erfahren, wie man das mit der Mail lösen könnte ...

zu 2) auch klaro, auch hier hat dein Skript andere Intentionen ... war jetzt auch nur der Tipp wegen Anregungen ...

zu GPL3: *guck*

Wie machst du das mit dem raw-Abbild?

Noch ein Tipp:

statt:

Rich (BBCode):
for file in $(ls /usr/syno/etc/smb.conf; ls /etc/rc.local; ls /etc/profile; ls /root/.profile; ls /root/*.sh; ls /root/*.txt; ls /etc/crontab;);

kannst auch schreiben:
Rich (BBCode):
for file in /usr/syno/etc/smb.conf /etc/rc.local /etc/profile /root/.profile /root/*.sh /root/*.txt /etc/crontab ;

Itari
 

jahlives

Benutzer
Mitglied seit
19. Aug 2008
Beiträge
18.275
Punkte für Reaktionen
4
Punkte
0
zu 1) klaro, dein Skript hat eine andere Intention ... ich meinte, du könntest dort etwas erfahren, wie man das mit der Mail lösen könnte ...
Wenn die Mailstation aktiviert ist dann reicht ein einfaches
Code:
echo $MAILCONTENT | /usr/syno/mailstation/sbin/sendmail -f "$MAILFROM" -t "$MAILTO"
sendmail erwartet eine komplette Email, also inkl Header. Wenn jetzt also $MAILCONTENT der Output des Scripts ist, dann muss man davor noch die Header setzen. Dazu habe ich bei mir ein Template
Code:
  [FONT=&quot]From: ALERT <you@yourdomain.tld>[/FONT]
  [FONT=&quot]To: <receiver@receive.tld>[/FONT]
  [FONT=&quot]Subject: Whatever subject you want[/FONT]
Wichtig ist, dass die Datei mit zwei Zeilenendzeichen beendet wird, sonst fällt sendmail auf die Schnauze.
Wenn man den Script Output auch in einer Datei hat, dann kann man die Email z.B. so verschicken
Code:
cat /path/to/header/tepmlate /path/to/outputFile | /usr/syno/mailstation/sbin/sendmail -f "$MAILFROM" -t "$MAILTO"
 

botharg

Benutzer
Mitglied seit
19. Okt 2009
Beiträge
48
Punkte für Reaktionen
0
Punkte
12
Danke euch zwei für die Anworten itari und jahlives!

itari:
die Schleife habe ich angepasst, funktioniert so natürlich auch wunderbar. Ich weiß momentan allerdings auch nicht wie ich auf den dreh mit "ls" gekommen bin, Deine Lösung ist irgendwie naheliegender...

Was das raw-Abbild anbelangt: Ich zaubere schnell meine Platte aus dem Gehäuse, hänge sie an nen Adapter mache mit "dcfldd" ein Backup der ersten zwei Partitionen (sys und swap) in je ein Abbild und kopiere vom Datenbereich die DS-"interna", also die "@..." Verzeichnisse und Daten. Die Daten an sich habe ich auf einer Backupplatte liegen und deshalb mach ich mir die Arbeit nicht. Ehrlichgesagt mach ich mir diese Arbeit nur deshalb, weil ich aktuell noch keine 2TB Backupplatte habe (nur 1.5). Wenn ich demnächst endlich die 2. 2TB Platte hab, werde ich die komplette Platte "klonen". Das jedoch immer nur, wenn ich was wirklich tiefgreifendes machen will/muß.
"dcfldd" nehm ich deswegen, weil ich damit nicht extern splitten muß (was ich in der Regel bei 2GB tue) und wesentlich mehr Infos kriege als mit "dd".

Was das GPL3 Statement anbelangt:
1) reicht es / darf ich das, wenn ich Deinen Text kopiere und alles was geändert werden muß ändere
2) soweit es meine Scripte hier anbelangt, geht es nur um die so getroffene Aussage bezüglich der GPL3 Lizenz, ich muß darauf also nicht jedesmal erneut hinweisen, richtig?

jahlives:
Das mit der Mailstation hatte ich zwar nach dem Kauf der DS eine Zeitlang überlegt, allerdings hab ich davon Abstand genommen sie zu installieren, da ich eigentlich keinen wirklichen Grund habe einen Mailserver zu betreiben. Außerdem ist mir (soweit ich das Thema dann verfolgt habe) der Aufwand zu groß den ich betreiben muß, weil ich (respektive meine DS) nur über DynDNS mit der weiten Welt kommuniziere. Ausserdem muß ich dann ja zwangsläufig noch ein "Tor" aufmachen...
Mit anderen Worten: Mailstation läuft nicht, ich hatte da irgenwie mehr in die Richtung geschielt, welche Synology sowieso zu nutzen scheint, was die Statusmails anbelangt. Irgendwie senden die ja auch; Werde dazu mal den ersten Hinweis von itari versuchen weiterzuverfolgen.
 

jahlives

Benutzer
Mitglied seit
19. Aug 2008
Beiträge
18.275
Punkte für Reaktionen
4
Punkte
0
Du kannst den Postfix so einrichten, dass er nur via localhost kommuniziert. So kann die DS selber Emails via sendmail verschicken, sonst aber niemand. Von aussen ist diese Installation nicht erreichbar, da der Postfix auf 127.0.0.1 lauscht und sonst nirgends
 

botharg

Benutzer
Mitglied seit
19. Okt 2009
Beiträge
48
Punkte für Reaktionen
0
Punkte
12
ok, aber dazu MUSS die Mailstation installiert und eingerichtet sein, oder? Ich geb' zu bei "postfix" klingelt bei mir nämlich noch garnix.
Werd mich bei Gelegenheit wohl doch mal näher mit dem Mailstation-Thread beschäftigen müssen...
 

jahlives

Benutzer
Mitglied seit
19. Aug 2008
Beiträge
18.275
Punkte für Reaktionen
4
Punkte
0
ok, aber dazu MUSS die Mailstation installiert und eingerichtet sein, oder? Ich geb' zu bei "postfix" klingelt bei mir nämlich noch garnix.
Werd mich bei Gelegenheit wohl doch mal näher mit dem Mailstation-Thread beschäftigen müssen...
Das mailstation.spk muss installiert und gestartet werden. Im DSM selber musst du aber nichts einstellen für die Mailstation. Das geht dann über Einträge direkt in der main.cf von Postfix.
Letzendlich musst du dort Postfix so einstellen, dass er nur Verbindungen auf 127.0.0.1 erlaubt. Das dürfte am schnellsten über die Config Var mynetworks gehen (hat in der Config afaik ein Beispiel für die Einstellung). Also etwas wie mynetworks = 127.0.0.0/8
Danach kannst du eine Variable Namens smtpd_client_restrictions setzen mit dem Wert permit_mynetworks,reject

Damit werden alle Verbindungsversuche die nicht von localhost kommen verworfen. Postfix kannst du manuell so starten
Code:
/usr/syno/mailstation/sbin/postfix start
 

botharg

Benutzer
Mitglied seit
19. Okt 2009
Beiträge
48
Punkte für Reaktionen
0
Punkte
12
hmmm, scheint ja recht einfach zu sein ...:(
Was den "postfix" Neustart anbelangt: ich vermute mal, der muß nach einem DS-Neustart auch neu gestartet werden, also am besten in die rc.local eintragen?
Und weiter heißt daß, ich kriege auf diese Weise jede Info, die ich mir nach diesem Muster zusammenstricke? Und genutzt werden die Infos die ich in der "Benachrichtigung"-seite eingetragen habe?
Da muß ich mich nacher mal dranmachen... die DS läuft viel zu zickenfrei! ;)
 
Status
Für weitere Antworten geschlossen.
 

Kaffeautomat

Wenn du das Forum hilfreich findest oder uns unterstützen möchtest, dann gib uns doch einfach einen Kaffee aus.

Als Dankeschön schalten wir deinen Account werbefrei.

:coffee:

Hier gehts zum Kaffeeautomat