• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

[solved] Sicherungsscript

roemi

Advanced Hacker
Hallo,

nachdem meine Baustelle "Server" nun langsam zum Ende kommt, mach ich nun das nächste Loch auf.

Der Server läuft als Fileserver. Auf Ihm liegen alle Datei auf die die gesamte Familie zugreift (Spielerei, ich weis). Parallel sichere ich Teile aus dem Home der einzelnen Maschinen.
Das Verzeichnis mit den Dateien auf dem Server packe ich einmal am Tag auf meinen Client (ab und an wird dann gebrannt).
Bisher hat das alles "Konserve" für mich erledigt.

Nun habe ich Server und Client's so eingerichtet das der erste Client der gestartet wird den Server aufweckt und dieser sich um 23:59 wieder schlafen legt.

Ich möchte nun das der Server nach dem booten die Laufwerke der aktiven Clients einbindet und dann automatisch die Files packt und kopiert.
Das geht aber eben nur mit aktiven Clients.

Was ist mit denen die erst später eingeschaltet werden?

Ich könnte nun per Cron alle halbe Stunde fragen ob ein Pc hinzugekommen ist. Ist das der Fall, dann soll er sichern.
Dann aber fragt er ja auch alle halbe Stunde die bereits vorhandenen Clients ab und sichert die auch immer wieder.

Zusammengefasst steht sich meine Idee so dar:

Server startet.
Per Crontab (alle halbe Stunde) die aktivien Clients abfragen
Jeden aktiven Client EINMAL sichern
Wenn mein Client dazu kommt auch ein Sicherung der Server eigenen Dateien

Alternativ

Per Anacron auf dem Client nach dem starten x-Minuten warten,
mount der Verzeichnisse des Servers und dann Start von Konserve.

Konserve scheint aber nur dann automatisch zu sichern wenn es durch das System (aktiv im Systray) gestartet wird. Wenn ich es per hand starte erfolgt keine Sicherung (das habe ich bis dato noch nicht verstanden und auch dazu nichts gefunden).

Da auf dem Server kein X läuft geht alles nur per Script.

Bisher habe ich zusammengeklaut:
Code:
#!/bin/bash
ping -c4 <ip>

if [ $? -eq 1 ]; then
   #Einbinden des Backupverzeichnisses
   mount ..
   #Wechseln dorthin
   cd /backup
   #Löschen des neun Wochen alten Backups
   rm -rdv Backup-`date +%F '--date=63 days ago'`
   #Erstellen des neuen Backupverzeichnisses mit Datumsangabe im Namen
   BCK_DIR="Backup-`date +'%F'`"
   mkdir "$BCK_DIR"
   #Wechseln in das neue Verzeichnis
   cd "$BCK_DIR"
   #Erstellen der Backuparchive
   #Datei/Verzeichnis 1
   tar -czf /pfad/zum/sicherungsziel/verzeichnis/home.tar.gz /pfad/zur/zu/sichernde/datei  
   #Datei/Verzeichnis 2
   tar -czf /pfad/zum/sicherungsziel/verzeichnis/home.tar.gz /pfad/zur/zu/sichernde/datei  
   #Datei/Verzeichnis 3
   tar -czf /pfad/zum/sicherungsziel/verzeichnis/home.tar.gz /pfad/zur/zu/sichernde/datei
   #....

fi

Liege ich damit richtig?
Wie verhindere ich eine doppelt Sicherung?
Hat man eine bessere Idee?
 

admine

Ultimate Guru
roemi schrieb:
Wie verhindere ich eine doppelt Sicherung?
Der Server legt nach der erfolgreichen Sicherung ein File mit aktuellem Datum irgendwo an, welches du auf Vorhandensein beim nächsten Durchlauf testen kannst.
 
OP
roemi

roemi

Advanced Hacker
Also bis dato habe ich mir gebaut:
Code:
v_tage=14                  # Tage die ein Backup erhalten bleibt
v_ziel="/backup"           # Hauptzielverzeichnis der Sicherungen
v_linda_local="/home"      # Locales Zielverzeichnis fuer mount
v_linda_quelle="/dev/hda3" # Verzeichnis das eingebunden werden soll

# Ins Backupverzeichnuis wechseln
cd $v_ziel;

#Alle Backups loeschen die aelter als v_tage sind
rm -rdv *-`date +'%F' '--date='$v_tage' days ago'`;

# Neuer Name fuer Sicherung erstellen
v_backup="linda-`date +'%F'`";

# Pruefen ob heute bereits eine Sicherung gemacht wurde
if  [ ! -e $v_backup ]; then

# Wenn nein, dann versuchen Quelle zu mounten
  if ! [ -b $v_linda_local ]; then
    mount $v_linda_quelle $v_linda_local;
    if (( $? )); then
# Quelle geht nicht zu mounten
      echo "fehler";
    else
# Quelle geht zu mounten, dann Zielverzeichnis erstellen
      mkdir $v_backup;
# Ins Verzeichnis wechseln
      cd $v_backup;
# Quelle packen und kopieren
      tar -czf linda_home.tar.gz /home/michael;
# Quelle umounten
      umount $v_linda_local
    fi;
  fi; 
fi;

cd $v_ziel;

# ping auf req.michael und wenn true dann

BCK_DIR="michael-`date +'%F'`"
if [ ! -e $BCK_DIR ]; then
  mkdir $BCK_DIR;
  cd $BCK_DIR;
  tar -czf michael_home.tar.gz /home/michael;
fi;

cd $v_ziel;

Das ganze will ich noch so bauen das ich die zu sichernde Pfad aus Dateien auslese.

Datei "michael"
verz1
verz2
...
verz n

Datei "linda"
verz1
verz2
...
verz n

Die Dateien auslesen, funzt recht gut.
Aber wie kann ich ein Verzeichnis auslesen?
 
OP
roemi

roemi

Advanced Hacker
Oki, war gerade etwas knapp.

Ich stelle mir vor das ich entsprechend den Rechner die ich sichern will je eine Datei anlege. Der Name der Datei entspricht dem Rechner.
Inhalt: Die zu sichernden Dateien.

Erste Schleife soll nun alle sich im Verzeichnis befindliche Dateien mit Namen auflisten.
In dieser Schleife dann der Inhalt der entsprechenden Datei.

Und dann das og. Script.

Also müsste ich die Dateien mit Do loop durchgehen.
 
OP
roemi

roemi

Advanced Hacker
Zu Blöd :D
cd /daten/backup/default
for i in *;
do
echo "xx " $i;
if [ $i <> "mr_readfile" ]; then
cat "$i" | while read j;
do
echo "$j";
done;
fi;
done;

Damit habe ich eigentlich alles zusammen
 
<> - sind wir in BASIC-Land? IMHO sollte das != sein. Und $i solltest du auch in Anführungszeichen setzen, wegen den Spaces und so.
 
OP
roemi

roemi

Advanced Hacker
Sodele, mein funktionierendes Werk.
#!/bin/bash
#
#v_default="/daten/backup/default" # Hier liegen die Files in denen festgehalten wird was gesichert wird
v_default="/home/michael/backup_default"
v_ziel="/backup"
v_tage=14
#v_mount="/zu_sichern"
#
#cd $v_ziel
#
#Alle Backups loeschen die aelter als v_tage sind
rm -rdv $v_ziel/`date +'%F' '--date='$v_tage' days ago'`;
#
# Sicherungshauptverzeichnis benennen
v_sichverz=$v_ziel/`date +'%F'`;
#
# Pruefen ob heute bereits ein Verzeichnis angelegt wurde
if [ ! -e $v_sichverz ]; then
mkdir $v_sichverz;
fi;
#
# Logfile benennen
v_log=$v_sichverz"/backup.log"
echo " " >> $v_log;
echo "Beginn `date`" >> $v_log;
#
cd $v_default
#
# Verzeichnis Default durchlaufen
for v_name in *;
do
#
# Neuer Name fuer Sicherung erstellen
v_backup=$v_name;
#
# Sicherungsunterverzeichnis benennen
v_sichunterverz=$v_sichverz"/"$v_backup;
#
# Ins Backupverzeichnis wechseln
cd $v_sichverz;
#
# Pruefen ob heute bereits eine Sicherung gemacht wurde
if [ ! -e $v_backup.tgz ]; then
v_sicherung="nein"
else
v_sicherung="ja"
fi;
#
if [ $v_sicherung == "nein" ]; then
#
# Pruefen ob locale Sicherung oder ueber Netz
cat $v_default/$v_name | while read v_aufgaben;
do
v_quelle=`echo $v_aufgaben | cut -d " " -f 1`;
v_verzeichnis=`echo $v_aufgaben | cut -d " " -f 2`;
#
if [ $v_quelle == "server" ]; then
#
# Packen und kopieren der lokalen Datein/Verzeichnisse
tar -czf $v_sichunterverz.tgz $v_verzeichnis;
if (( $? )); then
echo "Fehler beim packen von " $v_name " geloescht">> $v_log;
rm -rdv $v_sichunterverz.tgz;
else
echo "Erfolgreiche Sicherung von " $v_name >> $v_log;
fi;
#
else
#
# Packen und kopieren der entfernten Dateien / Verzeichnisse
ssh -T root@$v_quelle "tar czf - $v_verzeichnis" > $v_sichunterverz.tgz
if (( $? )); then
echo "Fehler beim packen von " $v_name " geloescht">> $v_log;
rm -rdv $v_sichunterverz.tgz;
else
echo "Erfolgreiche Sicherung von " $v_name >> $v_log;
fi;
fi;
done;
fi;
done;
echo "Ende `date`" >> $v_log;

Für jedes zu sicherndes Verzeichnis gibt es eine Datei in der steht "was" und "woher".

Edit 05.07.07.11:55 Code ausgetauscht (nun mit Fehlermeldung / Protokoll)

Edit 07.07.07.10:32 Nochmal ausgetauscht. Jetzt mit ssh!
 
Oben