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

Shell skript für Backup

OP
N

Nostrike

Newbie
robi schrieb:
Hab mal ein Demo geschrieben, wie man mit Labeln umgehen kann. Benötigt Paket mt_st ( ist meiner Meinung nach viel besser als mt) Durch die Interaktive Führung ist es jedoch nicht für Cronjobs geeignet, also selbst Kopf anstrengen. Admin soll verzeihen wenn der Code etwas länger ist, aber Funktionalität braucht etwas Platz und beim Buckup kommt es nicht darauf an, am Freitag die Sicherung auf Band zu bekommen, sondern sie Monatag noch zu finden und auch lesen zu können.

robi
Code:
#! /bin/bash 
# Demoscript zum Umgang mit Label auf Magnetbaendern
# interaktiv Labeln, Sichern, Einlesen und Scannen von einem oder
# mehreren Verzeichnissbaeumen
# ! Bitte erst grundlich mit eurer HW testen bevor ihr euch darauf verlasst !
# ! keine Garantie auf Fehlerfreiheit !

BLKSIZE=65536
PROGRAM=CPIO
BANDNAME=`date +%A`
ARCHIV=Test
DATUM=`date +%D`
RECHNER=`uname -n`
SAVEDIR="<Band ist leer>"

LABEL=/tmp/.label_script1.dat
LABELNEU=/tmp/.label_script2.dat
LOADSLEEP=15

LOAD=False
DATE=`date +%A`  
STATUS=0
ANTWORT=Q

#Label als Datei anlegen
echo -e "DATUM $DATUM\nPROGRAM $PROGRAM\nBLKSIZE $BLKSIZE\nBANDNAME $BANDNAME\nARCHIV $ARCHIV\nRECHNER $RECHNER\nSAVEDIR $SAVEDIR" > $LABELNEU

#wenn schon geladen dann entladen
STATUS=`mtst -f /dev/nst0 status  | grep ONLINE | wc -l`
if [ "$STATUS" = 1 ] ; then 
   echo "altes Band erkannt, wird entladen"
   mtst -f /dev/nst0 offline
fi

Hallo robi,

da ich jetzt erst mal im Urlaub war komm ich erst jetzt dazu Dein Script anzuwenden und durchzukauen.

Hab da gleich mal paar Fragen:
1.) habe das Script bis hierhin mal probiert!
a.) Labelneu wird noch angelegt
b.) es erfolgt aber keine Abrage, wenn schon ein Band drin ist oder läuft das nur mit dem ganzen Script?
c,) wenn ja wo ist dann der Verweis?

Kannst Du mir das mal erklären

2.) läuft das bis hierher auch mit mt oder nur mit mt_st

Danke
Peter
 
A

Anonymous

Gast
das mt Kommando bringt leider bei nicht geladener Cartridge eine I/O-ERROR und keinerlei Erklärungen warum, kannst du ausprobieren ohne Cartridge mt -f DEVICE status.
Nur mit mtst -f DEVICE status erhältst du überhaupt eine Meldung in der du erkennen kannst, dass das Laufwerk überhaupt richig angeschlossen ist. Desshalb ist das ganze Script auch mit mtst aufgebaut. Das mt kann zwar vieles auch machen, aber zB. die Ausgaben sind nicht so optimal.

Je nach dem ob in der Ausgabe von mtst oder mt ein ONLINE irgendwo erscheint( ausprobieren mit und ohne Cartridge), sollte am Ende dieses Scriptabschnittes eine 0 oder 1 in STATUS stehen. bei geladenem Band wird das Band ausgeworfen.

Hinweis: Ich werde wohl heute abend eine neue und gut strukturierte Überarbeitung des Scriptes hier ablegen, in der schon alle benötigten Funktionen eingearbeitet sind. Auch sind einige Fehler und Unschärfen beseitigt.

robi
 
A

Anonymous

Gast
Als nächstes sollten wir das Logging und Reportsystem in unser script einfügen.
Als Homedir für unser Backup setzen wir jetzt entgültig /root/backup fest.
Wir leiten die Ausgaben der cpio um, und zwar beim Schreiben in eine Datei mit BANDNAME.log und beim restore in restoreDATUM.log, und obendrein alle wichtigen Statusänderungen im Script selbst in der Datei backup.log.
Damit haben wir jetzt alles bei zusammen, wir können nachvollziehen was sich derzeit auf jedem Band befindet und wissen, wann wir welche Datei zurückgespielt haben, und haben Übersicht was mit unseren Bändern wann so alle passiert ist.

Nur stossen wir jetzt entgültig auf ein Problem, unser Script würde jetzt so unübersichtich werden, dass wir uns in 3 Tagen selbst nicht mehr zurechtfinden, also bleibt nur eines, strukturieren. Gleichzeitig werden wir einige kleine Fehler und Ungenauigkeiten damit beseitigen, die Lesbarkeit verbessern, und eine vernünftige Ablaufsteuerung und Ausgabe organisieren. Für alle die jetzt die Nase entgültig von der Programmiererei voll haben, hier das fertige Backup-Script. Ist zwar noch nicht ganz 100% ausgetestet und vollkommen, aber immerhin sollte es für die gebräuchlichsten manuellen Backup- und Restorearbeiten vollkommen ausreichen. "mehr braucht kein Mensch" Ausprobieren und melden, wenn bei irgend jemand was nicht läuft. Das Ganze wird jetzt langsam etwas zu komplex, als das man als Newbie in der Scripterei jeden einzelnen Gedankengang und Hintergrund für jede Option aus dem Script noch herauslesen könnte.

robi
Code:
#! /bin/bash 
# Demoscript V 1.0 -  Umgang mit Label auf Magnetbaendern
# interaktiv Labeln, Sichern, Restore und Scannen von einem oder
# mehreren Filesystemen mit Reportsystem und zahlreichen Möglichkeiten
# ! Bitte erst grundlich mit eurer HW testen bevor ihr euch darauf verlasst !
# ! keine Garantie auf Fehlerfreiheit !

#---------------Global verwendete Variablen-------------------------
DAY=`date +%d_%m_%g`
BACKUPDIR=/root/backup
LOGFILE="$BACKUPDIR"/backup.log
BACKUPLOG=
RESTORELOG="$BACKUPDIR/restore$DAY.log"

BLKSIZE_NEU=65536
BLKSIZE=
PROGRAM=CPIO
BANDNAME=
ARCHIV=Test
DATUM=`date +%D`
RECHNER=`uname -n`
SAVEDIR="<Band ist leer>"

LABEL=/tmp/.label_script1.dat
LOADSLEEP=5
LOAD=0  
STATUS=0

###########MENUE + STATUS ausgeben##############
function backup_status()
{
 echo
 echo 
 echo "****************************Backup****************************"
 echo -e "* Cartridge  : \c"
 if [ $STATUS = 1 ] ; then echo -e "geladen      \c"
   if [ $LOAD = 1 ] ; then echo " Bandname : $BANDNAME"
      echo "* Rechnername : $RECHNER      Datum : $DATUM"
      echo "* Verzeichnisse :  $SAVEDIR"
   else echo " kein Label" ; fi
 else echo "ungeladen" ; fi
 echo "**************************************************************"
 echo "  L  = Band Laden                  U  = Band entladen"
 echo "  N  = Band Labeln                 S  = Band scannen"
 echo "  W  = Daten sichern               R  = Daten wiederherstellen"
 echo "  A  = Log für Band ansehen        Q  = Programm beenden"
 echo -e "__________________________________ihre Wahl :  \c"
}

###########Band anfordern#####################
function backup_load()
{
 STATUS=`mtst -f /dev/nst0 status | grep ONLINE | wc -l`
 while [ $STATUS = 0 ]; do 
    echo -e "\aBitte Band einlegen und mit ENTER bestaetigen; \c" 
    read i 
    sleep $LOADSLEEP
    STATUS=`mtst -f /dev/nst0 status | grep ONLINE | wc -l`
 done
 TIME=`date`
 echo "$TIME    Band geladen" >> $LOGFILE
 mtst -f /dev/nst0 rewind 
 mtst -f /dev/nst0 setblk 0
 SAVEDIR="<Band ist leer>"
}

###########Band entladen######################
function backup_unload()
{
if [ "$STATUS" = 1 ] ; then 
   echo "Band wird entladen"
   mtst -f /dev/nst0 offline
   TIME=`date`
   echo "$TIME    Band entladen" >> $LOGFILE
   STATUS=0
   LOAD=0
   rm $LABEL 2>/dev/null
   BANDNAME=
fi
}

###########Label lesen########################
function backup_readLabel()
{
 if [ $STATUS = 1 ] ; then
   rm $LABEL 2>/dev/null
   mtst -f /dev/nst0 rewind
   dd if=/dev/nst0 of=$LABEL count=1 2>/dev/null
   PROGRAM=`grep PROGRAM $LABEL 2>/dev/null | cut -f2 -d" "`
   TIME=`date`
   if [  -e "$LABEL"  -a  "$PROGRAM" = "CPIO" ] ; then
     echo "Label erkannt"
     BLKSIZE=`grep BLKSIZE $LABEL | cut -f2 -d" " `
     BANDNAME=`grep BANDNAME $LABEL | cut -f2 -d" " `
     DATUM=`grep DATUM $LABEL | cut -f2 -d" "`
     RECHNER=`grep RECHNER $LABEL | cut -f2 -d" "`
     SAVEDIR=`grep SAVEDIR $LABEL | cut -f2- -d" "`
     echo "$TIME    Label erkannt" >> $LOGFILE
     cat $LABEL >> $LOGFILE
     BACKUPLOG="$BACKUPDIR"/"$BANDNAME".log
     LOAD=1
   else
     LOAD=0
     rm $LABEL 2>/dev/null
     SAVEDIR="<Band ist leer>" 
     echo "$TIME    kein Label erkannt" >> $LOGFILE
     BANDNAME=
   fi
 fi
}

###########Label schreiben####################
function backup_writeLabel()
{
 if [ $STATUS = 1 ] ; then

   if [ -z $BANDNAME ] ; then
     echo -e "geben sie eine Bandnamen ein : \c"
     read BANDNAME
   fi
   BLKSIZE="$BLKSIZE_NEU"
   PROGRAM=CPIO
   ARCHIV=Test
   DATUM=`date +%D`
   RECHNER=`uname -n`
   BACKUPLOG="$BACKUPDIR"/"$BANDNAME".log
   echo -e "DATUM $DATUM\nPROGRAM $PROGRAM\nBLKSIZE $BLKSIZE\
\nBANDNAME $BANDNAME\nARCHIV $ARCHIV\nRECHNER $RECHNER\nSAVEDIR $SAVEDIR" > $LABEL
   mtst -f /dev/nst0 rewind 
   dd if=$LABEL of=/dev/nst0  2>/dev/null
   TIME=`date`
   echo "$TIME    Band neu gelabelt" >> $LOGFILE
   mtst -f /dev/nst0 weof
   LOAD=1
   cat $LABEL > $BACKUPLOG
   echo -e "\n\n" >> $BACKUPLOG
   touch -t "200001010000" -m $BACKUPLOG
 fi
} 

#########Sicherung################################
function backup_write()
{
 echo "Welches Verzeichnis moechten sie sichern? Geben sie den/die kompletten"
 echo "Path der/des Verzeichnis - zwischen Verzeichnissen jeweils 1 Leerzeichen :"
 read SAVEPATH
 SAVEDIR=
 for i in "$SAVEPATH"
  do
     if [ -d $i ] ; then SAVEDIR="$SAVEDIR $i"
     else echo "$i ist kein Verzeichniss"
     fi
  done      
 echo -e  "\nMoechten sie eine Vollsicherung oder eine Differenzsicherung ?"
 echo -e "\ageben sie 0 oder die Anzahl der Tage ein  : \c"
 typeset -i SAVETYP
 read SAVETYP
 SAVEFLAG=
 if [ $SAVETYP -ne 0 ]; then
    SAVEFLAG="-ctime -$SAVETYP"  
 fi
 backup_writeLabel
 for i in $SAVEDIR
 do
   TIME=`date`
   echo -e "$TIME   $i wird gesichert \c" >> $LOGFILE
   echo "Sicherung von $i wird vorgenommen"
   find $i $SAVEFLAG -mount | cpio -ovcC$BLKSIZE  > /dev/nst0 2>> $BACKUPLOG
   if [ $? = 0 ] ; then echo "OK" >> $LOGFILE
   else echo "NOT OK" >> $LOGFILE
   fi
 done
}

##########Einlesen#################################
function backup_read()
{
 if [ $LOAD = 0 ] ; then backup_readLabel; fi
 echo -e "folgende Verzeichnisse sind gesichert:\n$SAVEDIR\n"
 echo "waehlen sie mit J/N die Verzeichnisse aus die sie auspacken wollen"
 echo
 OPTION=
 PATTERNFILE=
 RECOVERHOMEDIR=
 SAVEPATH=
 HALTDIR=0
 INCTXT=
 RELATIV=0
 for i in $SAVEDIR
 do
  echo -e "$i     :\c"
  EINGABE=
  while [ -z "$EINGABE" ]; do read EINGABE; done
  if [ "$EINGABE" = "J" -o "$EINGABE" = "j" ]; then 
    SAVEPATH="$SAVEPATH $i" 
    HALTDIR=1
  fi
 done
 if [ $HALTDIR = 0 ] ; then SAVEPATH=$SAVEDIR ; fi
 echo -e "\nfolgende Verzeichnisse werden bearbeitet :\n$SAVEPATH\n"
 echo -e "gegebenenfalls die Patterndatei zur Auswahl der Dateien :\c"
 read PATTERNFILE
 if [ -n "$PATTERNFILE" -a -f "$PATTERNFILE" ] ; then 
    OPTION="--pattern-file=$PATTERNFILE"
    echo -e "$PATTERNFILE wird zum filtern der Files in $SAVEPATH herangezogen\n"
    INCTXT="teilweise" 
 else
    echo -e "Alle Dateien in $SAVEPATH werden zurückgespielt\n"
    INCTXT="vollständig"
 fi
 echo -e "relativ zu welchem Verzeichniss sollen die Files abgelegt werden :\c"
 read RECOVERHOMEDIR
 if [ -n "$RECOVERHOMEDIR" -a -d "$RECOVERHOMEDIR" ] ; then 
    OPTION="$OPTION --no-absolute-filenames"
    echo -e "die Files werden relativ zu $RECOVERHOMEDIR abgelegt\n"
    RELATIV=1 
 else
    echo -e "Alle Dateien werden in ihren ursprünglichen Verzeichnissen erstellt\n"
    RELATIV=0
 fi
 mtst -f /dev/nst0 asf 2
 echo -e "moechten sie wirklich die Sicherung zurueckspielen <J/N> : \c" 
 EINGABE=
 while [ -z "$EINGABE" ]; do read EINGABE; done
 if [ "$EINGABE" = "J" -o "$EINGABE" = "j" ] ; then
 echo -e "RESTORE von $SAVEPATH \n\n" >> $RESTORELOG
 for i in $SAVEDIR
  do
    echo $SAVEPATH | grep -q $i 
    if [ $? =  0 ]; then
      TIME=`date`
      echo -e "$TIME   $i wird $INCTXT zurückgespielt \c" >> $LOGFILE
      echo " $i wird $INCTXT zurückgespielt"
      if [ "$RELATIV" = 1 ] ; then cd $RECOVERHOMEDIR ; fi
      cpio -i $OPTION -cvdumC$BLKSIZE < /dev/nst0 2>> $RESTORELOG
      if [ $? = 0 ] ; then echo "OK"  >> $LOGFILE
         else echo "NOT OK" >> $LOGFILE
      fi
      mtst -f /dev/nst0 fsf 1
    else
      mtst -f /dev/nst0 fsf 1
    fi
  done
 fi
}

########SCANNEN###########################################
function backup_scan()
{
  if [ $LOAD = 0 ] ; then backup_readLabel ;fi
  mtst -f /dev/nst0 asf 2
  for i in $SAVEDIR
    do
      TIME=`date`
      echo -e "$TIME   $i wird gescannt \c" >> $LOGFILE
      cpio -ivctC$BLKSIZE < /dev/nst0
      if [ $? = 0 ] ; then echo "OK"  >> $LOGFILE
        else echo "NOT OK" >> $LOGFILE
      fi
      mtst -f /dev/nst0 fsf 1
   done
}

#-----------------------BEGIN SCRIPT-----------------------
MENUE=
backup_load
backup_readLabel
while [ "$MENUE" != "Q"  -a "$MENUE" != "q" ] 
  do
  backup_status
  read MENUE
  case "$MENUE" in
    [lL])  backup_load ; backup_readLabel ;;
    [uU])  if [ $STATUS = 1 ] ; then backup_unload ; fi ;;
    [nN])  if [ $STATUS = 1 ] ; then 
           SAVEDIR="<Band ist leer>"
           backup_writeLabel ; fi ;;
    [sS])  if [ $LOAD = 1 -a "$SAVEDIR" != "<Band ist leer>" ] 
         then backup_scan ; fi ;;
    [wW])  if [ $LOAD = 1 ] ; then backup_write ; fi ;;
    [rR])  if [ $LOAD = 1 -a "$SAVEDIR" != "<Band ist leer>" ] 
         then backup_read ; fi ;;
    [aA])  if [ $LOAD = 1 -a -f "$BACKUPLOG" ] ; then 
           more $BACKUPLOG ; fi ;;
    [qQ])  echo " Programm ENDE" ;;
    *)  echo " !!! ungültigeEingabe !!!" 
  esac
done
 
A

Anonymous

Gast
Bevor wir jetzt entgültig mit der Entwicklung unseres Cronjob-Scrips beginnen, wollen wir festlegen was unsers Script alles können soll, fangen wir also an und erfinden eine Konfigurationsdatei. /root/backup/backup.conf
Wir bleiben auf alle Fälle bei einem localem Bandlaufwerk mit manuellem Bandwechsel, die 3 Anwender, die einen Wechsler oder eine Jukebox haben und kein Profi-Backupprogramm, mögen mir verzeihen, und wir wollen unseren Cronjob genau einmal am Tag( abends nach Feierabend) starten, und beschränken uns auf Filesystemsicherungen.
Viele Backupkonzepte haben Löcher wie ein Schweizer Käse, und besonders dann, wenn wie bei uns die Bänder vor der automatischen Sicherung per Hand in das Laufwerk müssen. Da kann es schon mal vorkommen, dass eine wichtige Vollsicherung ausfällt, weil einfach vergessen wurde vor dem Feierabend eine Cartridge einzulegen. Dagegen wollen wir was unternehmen und wir wollen auch was dagegen unternehmen, wenn eine Vollsicherung mal ausgefallen sein sollte. Wir wollen unsere zu sichernden Filesysteme einzeln konfigurieren können, da die verschiedenen Filesysteme ja auch unterschiedlich starken Veränderungen unterliegen. Wir wollen Vollsicherungen und Diff-Sicherungen zur letzten Vollsicherung machen. Auch soll berücksichtig werden, dass bestimmte Filesysteme nicht immer gemountet sind. Wir wollen sie mounten, wenn wir sich brauchen. Das Auffinden der richtigen Cartridge für ein spezielles Restore wird ja durch unser Logsystem schon unterstützt, wir wollen das aber noch etwas ausbauen, damit wir schnell für jedes Filesystem die letzte Vollsicherung finden. Unser Script soll mit einer variablen Anzahl von Cartridges umgehen können und uns jederzeit die Möglichkeit einräumen neue Bänder dazu zukonfigurieren bzw. auch Bänder für längere Zeit für die weitere Benutzung zu sperren, damit wir sie zB in den Safe einlagern können. Das Backup soll das jeweils für die bevorstehende Sicherung erforderliche Band selbst bestimmen.
Ich lege mal für unser Demo BAND00 - BAND99 als mögliche Bandnamen fest. Es sollen Bänder erst nach einer mindest einzuhaltenden Sperrfrist wieder benutzt werden dürfen. Und damit wir uns entgültig von den einzeiligen tar-Cronjobs der anderen LINUX-Anwender unterscheiden, wollen wir eine Möglichkeit einbauen, um vor dem Backup ein Script zu starten mit dem wir unseren Rechner beruhigen könnten, also zB. Datenbank herunterfahren, NFS stoppen, Webserver anhalten oä. und natürlich auch nach der Sicherung ein Script zum starten der angehaltenen Services.

Ne ganze Menge, ist aber gar nicht so schlimm, denn durch die strukturierte Programmierung unseres Interaktiven Scriptes haben wir schon einen guten Pool mit den wichtigsten Funktionen, den wir nur noch etwas bearbeiten müssen, damit es in unser Cronjob-Script passt.

Hier jetzt die backup.conf . Ausgelegt ist sie als Includedatei, die dann in unsere Scripte eingebunden werden kann.
die einzelnen Abschnitte sind glaube ich bestens dokumentiert, so dass ich darauf nicht eingehen muss.
Code:
#Konfigurationsdatei für Backup über cronjobs

BACKUPDIR="/root/backup"
LOGFILE="$BACKUPDIR"/backup.log

#Script das zur Beruhigung unseres Rechner vor dem Backup ausgeführt werden soll
PRE_BACKUP_SCRIPT=

#Script das nach dem Backup ausgeführt werden soll
POST_BACKUP_SCRIPT=

#Pattern zum Auffinden der Bänder die für cronjobs freigegeben sind
BANDNAMEPATTERN="BAND??"

#mindest Anzahl der Tage, die ein Band nicht überschrieben werden darf
MINSAVETIME=8

#Filesysteme und die Konfiguration nach der diese gesichert werden sollen
#Die Zuordnung erfolgt über FILESYSTEM[x]
#die ersten 7 Spalten sind die Wochentage von Sonntag bis Samstag
#in diesen Spalten bedeutet:
#   V eine Vollsicherung dieses Filesystems
#   D bedeutet eine Differenzsicherung zu letzten Vollsicherung 
#     soweit die letzte Vollsicherung nicht älter als Spalte 8 in Tagen ist
#     in diesem Fall Vollsicherung dieses Filesystemes
#   N keine Sicherung dieses Filesystems wenn die letzte Vollsicherung nicht
#     älter als Spalte 8 ist
#Spalte 8 wieviel Tage eine Vollsicherung maximal alt sein darf, ist die
#   letzte Vollsicherung älter dann wird nächsten Sicherung eine Vollsicherung
#SPALTE 9 steht hier ein M dann wird diese Filesystem vorher gemountet und
#   nach der Sicherung unmountet. ansonst N  ( muss in /etc/fstab eingetragen sein)
#Spalte 10 Flagdatei für dieses Filesystem wird bei Vollsicherung angelegt
#   beinhaltet den Bandnamen und der Zeitstempel dieser Datei 
#   wird zur Erzeugung der Diffsicherung benutzt
#Spalte 11 hier ist der absolute Path des Mountpoint des Filesystem anzugeben

FILESYSTEM[1]="N D D D D V N 7 N .FLAG1 / "
FILESYSTEM[2]="N D N D D V N 7 N .FLAG2 /home "
FILESYSTEM[3]="N V D D V D N 4 N .FLAG3 /usr/sql "
FILESYSTEM[4]="N N D N D N N 7 M .FLAG4 /data1 "

#Maximale Anzahl zu berücksichtigender FILESYSTEME
typeset -i MAXFILESYSTEM
MAXFILESYSTEM=4
Damit wir nun die Bänder in das Laufwerk bekommen brauchen wir noch ein weiteres HilfsScript, denn wir können ja nur noch die Bänder interaktiv mit BANDXX labeln und damit unserem Backup zur Benutzung freigeben, aber nicht mehr selbst bestimmen welches Band heute beschreiben werden soll. Wenn wir dieses Script gekonnt in einen anderem Script mit dem wir täglich arbeiten starten oder zB., so würde es bei mir gut funktionieren, in der .profile von root eintragen, dann wird jedesmal bei su - das script gestartet und jedes mal schaut unserer Script ob heute eine Sicherung gemacht werden muss, und ob schon das richtige Band geladen ist, ansonsten fordert es uns auf das entsprechende Band in das Laufwerk zu laden. Richtig plaziert wird dieses script also so lange nerven, bis die richtige Cartridge für die heutige Sicherung geladen ist.

An Funktionen brauchen wir nicht viel, eine stark zusammengestrichene Form von backup_load, backup-unload zum auswerfen der falschen Cartridge, und backup-readLabel, um den Label auf dem Band zu lesen. Eine Funktion müssen wir jedoch komplett neu erstellen. In ihr müssen wir die backup.conf auswerten und feststellen ob wir heute überhaupt ein Band benötigen. Wir testen also den entsprechenden Wochentag und ob die letzte Vollsicherungen für die einzelnen Filesysteme noch nicht zu alt sind. Dazu untersucht es die Modifikationszeitstempel der .FLAGx Dateien, diese werden vor dem Beginn der entsprechenden Filesystemsicherung jeweils neu gesetzt.

In der Ablaufsteuerung sucht das script dann die Cartridge die am längsten nicht benutzt wurde, dazu untersucht sie die Modifikationszeitstempel der BANDXX.log Dateien, also die Logdateien unserer Bänder. Ist das älteste Band nicht jünger als MINSAVETIME dann wird geprüft ob es schon im Laufwerk ist, ansonsten angefordert. Beim Neu Labeln mit unserem Script wird der Modi-Zeit-Stempel auf 01.01.2000 00.00Uhr gesetzt, damit wird dieses Band zuerst angefordert. Soll ein Band längere Zeit gesperrt bleiben dann können wir den Zeitstempel der BANDXX.log mit touch -t"Zeitstempel" -m BANDXX.log auf einen Termin in die Zukunft setzen, und unser Backup wird dieses Band vorläufig nicht anfordern.
Code:
#!/bin/bash
#Hilfsscript das uns erinnern soll eine Cartridge in das Laufwerk einzulegen
#Das Script prüft die backup.conf und ob alle Abhängigkeiten erfüllt sind
#Dieses Script kann zB in die .profile von root gestartet werden

PROGRAM=
BANDNAME=

LABEL=/tmp/.label_script1.dat
LOAD=0  
STATUS=0
BACKUP=0

. /root/backup/backup.conf

###########SICHERUNG notwendig################
function backup_require()
{
 typeset -i i
 i=1
 typeset -i DAY_OF_WEEK
 DAY_OF_WEEK=`date +"%w"`
 DAY_OF_WEEK=$DAY_OF_WEEK+1

 while [ $i -le $MAXFILESYSTEM ] 
  do
    HELPTXT=${FILESYSTEM[$i]}
    FLAGFILE=`echo $HELPTXT | cut -f 10 -d " "`
    DAYFLAG=`echo $HELPTXT | cut -f $DAY_OF_WEEK -d" "`
    if [ $DAYFLAG = "V" -o $DAYFLAG = "D" ] ; then BACKUP=1 ; fi
    DIFFLAG=`echo $HELPTXT | cut -f 8 -d" "`
    FLAG=`find $BACKUPDIR/$FLAGFILE -mtime -"$DIFFLAG" 2>/dev/null | wc -l`
    if [ $FLAG = 0 ] ; then BACKUP=1 ; fi
    i=$i+1
  done
}

###########auf Band testen#####################
function backup_test()
{
 STATUS=`mtst -f /dev/nst0 status | grep ONLINE | wc -l`
  if [ $STATUS = 1 ] ; then
      mtst -f /dev/nst0 rewind
      mtst -f /dev/nst0 setblk 0
  fi
}

###########Band entladen######################
function backup_unload()
{
if [ "$STATUS" = 1 ] ; then 
   mtst -f /dev/nst0 offline
   TIME=`date`
   echo "$TIME    Band entladen" >> $LOGFILE
   STATUS=0
   LOAD=0
   rm $LABEL 2>/dev/null
   BANDNAME=
fi
}

###########Label lesen########################
function backup_readLabel()
{
 if [ $STATUS = 1 ] ; then
   rm $LABEL 2>/dev/null
   mtst -f /dev/nst0 rewind
   dd if=/dev/nst0 of=$LABEL count=1 2>/dev/null
   PROGRAM=`grep PROGRAM $LABEL 2>/dev/null | cut -f2 -d" "`
   TIME=`date`
   if [  -e "$LABEL"  -a  "$PROGRAM" = "CPIO" ] ; then
     BANDNAME=`grep BANDNAME $LABEL | cut -f2  -d " " `
     LOAD=1
   else
     LOAD=0
     rm $LABEL 2>/dev/null 
     BANDNAME=
   fi
 fi
}

##############BEGIN###########################
backup_require
if [ $BACKUP = 1 ] ; then
  NEUBANDLOG=`ls --sort=time $BACKUPDIR/$BANDNAMEPATTERN.log  | tail -1` 
  SAVETIMETEST=`find $NEUBANDLOG -mtime +$MINSAVETIME | wc -l `
  NEUBAND=`basename $NEUBANDLOG .log`

  if [ $SAVETIMETEST = 1 ] ; then
     backup_test
     backup_readLabel
     if [ -n "$BANDNAME" -a "$BANDNAME" = "$NEUBAND" ] ; then
      echo "richtiges Band für Backup ist schon geladen"   
     else
       if [ $STATUS = 1 ] ; then backup_unload ; fi
       echo "bitte Band  $NEUBAND  für Backup einlegen"
     fi
  else
    echo "kein brauchbares Band für Backup gefunden, bitte eines zur"
    echo "Verfügung stellen sonst kann heute kein Backup durchgeführt werden" 
  fi
fi
Noch ein Wort zu den unterschiedlichen Laufwerkstypen und den möglichen Auswirkungen wenn wir Bänder längere Zeit im Laufwerk geladen lassen. Besonders bei Laufwerkstypen mit Schräg-Spur-Aufzeichnung ist es nicht ganz unkritisch Bänder länger Zeit geladen zu lassen. Es kann zu erhöhtem Verschleiss am Kopf und am Bandmaterial führen, besonders wenn wie es bei einigen älteren Typen ist, das Laufwerk nicht in einen Standby-Modus fährt, wenn es länger Zeit nicht benutzt wird.

Versucht mal folgendes. Band ist geladen:
mtst -f DEVICE lock
mtst -f DEVICE offline
bei einigen Laufwerkstypen wird das Band intern ausgefädelt aber der Entladevorgang nicht vollständig durchgeführt, es kann weder über den Entladeknopf noch über Befehl das Band entladen werden. das Lock wirkt so lange bis es mit unlock oder mit reset des Laufwerkes aufgehoben ist, das Band kann also nicht versehentlich ausgetauscht werden.
mtst -f DEVICE load
würde das Band wieder ins Laufwerk laden und wir könnten ganz normal arbeiten. Zum Schluss aber nicht vergessen
mtst -f DEVICE unlock

Einfach mal ausprobieren, ich kenne einige Laufwerkstypen bei denen funktioniert das einwandfrei. Sollte es funktionieren, dann könnt ihr das in euere Scripte mit aufnehmen, ist jedenfalls sehr schonend für Band und Laufwerk.

robi
 
A

Anonymous

Gast
So heute kommen wir zum Script für den Cron-Job, dabei müssen wir erst mal folgendes beachten, Eingabe über die Tastatur - geht nicht, alle Ausgaben die unser Script über die Standartkanäle ausgibt und wir nicht umlenken bekommen wir per mail an user@localhost zugeschickt, und die Umgebungsvariablen sind nicht alle gesetzt, da die Shell die den cronjob ausführt, nicht durch die Profile-Konfiguration gelaufen ist.

Das Script muss eine geladene Cartridge erkennen, das Label lesen können und vergleichen ob es auf diese Cartridge schreiben darf, unser conf-Datei für den heutigen Tag auswerten, den neuen Label schreiben und entsprechende der ermittelten Einstellungen die jeweiligen Filesystem mit den entsprechenden Parametern sichern und nach erfolgter Sicherung die Cartridge entladen.

Wir verwenden wieder unsere Funktionen aus den beiden anderen Scripten und ändern diese entsprechend ab.
An Umgebungsvariablen brauchen wir nicht viel, und die sollten evtl. schon gesetzt sein, aber wir setzen dennoch
export PATH=/bin:/usr/bin
export LANG=de_DE
Danach binden wir unsere config ein und legen wieder unsere schon bekannten globalen Variablen fest, die wir für das Label das Log und die Ablaufsteuerung benötigen. Hier kommen jetzt noch einige dazu:
BACKUP benutzen wir um festzulegen ob es heute ein Backup geben muss oder nicht. Die Variabelen FILESYSFLAG FILESYSMOUNT FILESYSTYTE werden wir nutzen um parallel zu der Variable SAVEDIR die wir ja aus der conifig erstellen müssen, in gleicher Art und Weise unsere Eigenschaften für die entsprechenden Filesysteme zusammenzustellen.

Die Funktionen backup_load _unload _readLabel _writeLabel ändern wir entsprechend unseren Bedürfnissen ab, Ausgaben sollen nur entstehen, wenn irgend etwas schief läuft. Funktion backup_require aus unserem Hilfscript bauen wir weiter aus, jetzt müssen wir nicht nur erkennen, ob ein Backup heute laufen muss, sondern wir müssen auch die Variablenn SAVEDIR FILESYSTEMFLAG FILESYSTEMMOUNT und FILESYSTYPE mit den richtigen Daten füllen. Aus der Funktion backup_write entfernen wir den gesammten interaktiven Bereich, erweitern aber unsere interne Schreife und gewinnen aus den Variablen FILESYSFLAG, FILESYSMOUNT FILESYSTYPE die Parameter und setzen für jedes zu sichernde Filesystem die entsprechenden Optionen. Wenn wir von einem Dateisystem eine Vollsicherung machen, dann schreiben wir in unsere FLAGFILE den Bandnamen und haben dann mit dieser File auch gleich den Zeitstempel, den wir für unsere Diff-Sicherungen für das entsprechende Filesystem benötigen.
Die Ablaufsteuerung ist recht kurz, hier sehen wir nur ob es heute eine Sicherung geben soll oder nicht und wenn ja dann schauen wir ob das Band entsprechend unserer MINSAVETIME überschrieben werden darf. Ansonsten laufen die einzelnen Funktionen hintereinander ab, und wenn wir die Variablen PRE_ oder POST_BACKUP_SCRIPT zugewiesen haben, dann werden die entsprechenden Scripte vor/nach der Sicherung gestartet.

Hier das komplette fertige Backup-Cron-Script
Code:
#!/bin/bash
# Backup-Script für den Einsatz als Cronjob-script

export PATH=/bin:/usr/bin
export LANG=de_DE

. /root/backup/backup.conf

BACKUPLOG=
BLKSIZE_NEU=65536
BLKSIZE=
PROGRAM=CPIO
BANDNAME=
ARCHIV=Test
DATUM=`date +%D`
RECHNER=`uname -n`
SAVEDIR=
FILESYSFLAG=
FILESYSMOUNT=
FILESYSTYPE=

LABEL=/tmp/.label_script1.dat
LOAD=0  
STATUS=0
BACKUP=0

###########auf Band testen#####################
function backup_load()
{
 STATUS=`mtst -f /dev/nst0 status | grep ONLINE | wc -l`
 if [ $STATUS = 0 ] ; then  
   sleep 30 
   STATUS=`mtst -f /dev/nst0 status | grep ONLINE | wc -l`
 fi
 if [ $STATUS = 1 ] ; then
   TIME=`date`
   echo "$TIME    Band geladen" >> $LOGFILE
   mtst -f /dev/nst0 rewind 
   mtst -f /dev/nst0 setblk 0
 else
   echo "$TIME Backup ist abgebrochen da kein Band geladen "
   exit 1
 fi
}

###########Band entladen######################
function backup_unload()
{
if [ "$STATUS" = 1 ] ; then 
   mtst -f /dev/nst0 offline
   TIME=`date`
   echo "$TIME    Band entladen" >> $LOGFILE
   STATUS=0
   LOAD=0
   rm $LABEL 2>/dev/null
   BANDNAME=
fi
}

###########Label lesen########################
function backup_readLabel()
{
 if [ $STATUS = 1 ] ; then
   rm $LABEL 2>/dev/null
   mtst -f /dev/nst0 rewind
   dd if=/dev/nst0 of=$LABEL count=1 2>/dev/null
   PROGRAM=`grep PROGRAM $LABEL 2>/dev/null | cut -f2 -d" "`
   TIME=`date`
   if [  -e "$LABEL"  -a  "$PROGRAM" = "CPIO" ] ; then
     BANDNAME=`grep BANDNAME $LABEL | cut -f2 -d" " `
     echo "$TIME    $BANDNAME    Label erkannt" >> $LOGFILE
     cat $LABEL >> $LOGFILE
     BACKUPLOG="$BACKUPDIR"/"$BANDNAME".log
     LOAD=1
   else
     LOAD=0
     rm $LABEL 2>/dev/null
     echo "$TIME    kein Label erkannt" >> $LOGFILE
     BANDNAME=
     echo "$TIME Backup abgebrochen da kein güldiges Label auf Band"
     exit 2
   fi
 fi
}

###########Label schreiben####################
function backup_writeLabel()
{
   mtst -f /dev/nst0 rewind
   BLKSIZE="$BLKSIZE_NEU"
   PROGRAM=CPIO
   ARCHIV=Test
   DATUM=`date +%D`
   RECHNER=`uname -n`
   echo -e "DATUM $DATUM\nPROGRAM $PROGRAM\nBLKSIZE $BLKSIZE\
\nBANDNAME $BANDNAME\nARCHIV $ARCHIV\nRECHNER $RECHNER\nSAVEDIR $SAVEDIR" > $LABEL
   mtst -f /dev/nst0 rewind 
   dd if=$LABEL of=/dev/nst0  2>/dev/null
   TIME=`date`
   echo "$TIME    $BANDNAME    Band neu gelabelt" >> $LOGFILE
   mtst -f /dev/nst0 weof
   LOAD=1
   cat $LABEL > $BACKUPLOG
   echo -e "\n\n" >> $BACKUPLOG
} 

#######SICHERUNG notwendig? FLAGS setzen ########
function backup_require()
{
 typeset -i i
 i=1
 typeset -i DAY_OF_WEEK
 DAY_OF_WEEK=`date +"%w"`
 DAY_OF_WEEK=$DAY_OF_WEEK+1

 while [ $i -le $MAXFILESYSTEM ] 
  do
    HELPTXT=${FILESYSTEM[$i]}
    DIFFLAG=`echo $HELPTXT | cut -f 8 -d" "`
    MOUNTFLAG=`echo $HELPTXT | cut -f 9 -d " "` 
    FLAGFILE=`echo $HELPTXT | cut -f 10 -d " "`
    FILESYSTEM=`echo $HELPTXT | cut -f 11 -d " "`
    DAYFLAG=`echo $HELPTXT | cut -f $DAY_OF_WEEK -d" "`
    FLAG=`find $BACKUPDIR/$FLAGFILE -mtime -"$DIFFLAG" 2>/dev/null | wc -l`
    if [ \( $DAYFLAG = "V" -o $DAYFLAG = "D" \) -o \( $FLAG = 0 \) ] ; then 
      BACKUP=1
      SAVEDIR="$SAVEDIR $FILESYSTEM"  
      FILESYSFLAG="$FILESYSFLAG $FLAGFILE"
      FILESYSMOUNT="$FILESYSMOUNT $MOUNTFLAG"
      if [ $FLAG = 0 ] ; then FILESYSTYPE="$FILESYSTYPE V"
        else FILESYSTYPE="$FILESYSTYPE $DAYFLAG" ; fi
    fi
    i=$i+1
  done
}

#########Sicherung################################
function backup_write()
{
 SAVEFLAG=
 typeset -i LOOP
 LOOP=1

 backup_writeLabel
 
 for i in $SAVEDIR
 do
   FLAGFILE=`echo $FILESYSFLAG | cut -f $LOOP -d " "`
   MOUNTFLAG=`echo $FILESYSMOUNT | cut -f $LOOP -d " "`
   DAYFLAG=`echo $FILESYSTYPE | cut -f $LOOP -d " "`
   if [ $MOUNTFLAG = M ] ; then mount $i 2>/dev/null >/dev/null ; fi
   if [ $DAYFLAG = D ] ; then SAVEFLAG="-cnewer $BACKUPDIR/$FLAGFILE" 
     else 
       echo "$BANDNAME" > $BACKUPDIR/$FLAGFILE
       SAVEFLAG=
   fi
   TIME=`date`
   echo -e "$TIME    $BANDNAME    $i wird gesichert \c" >> $LOGFILE
   find $i $SAVEFLAG -mount | cpio -ovcC$BLKSIZE  > /dev/nst0 2>> $BACKUPLOG
   if [ $? = 0 ] ; then echo "OK" >> $LOGFILE
     else echo "NOT OK" >> $LOGFILE  ;  fi
   if [ $MOUNTFLAG = M ] ; then umount $i 2>/dev/null >/dev/null ; fi
   LOOP=$LOOP+1
 done
}

############## BEGIN #################################
backup_require
if [ $BACKUP = 1 ] ; then
  backup_load
  backup_readLabel
  SAVETIMETEST=`find "$BACKUPDIR/$BANDNAME.log" -mtime +$MINSAVETIME | wc -l`
  if [ $SAVETIMETEST = 0 ] ; then
    TIME=`date`
    echo "$TIME Backup abgebrochen da eingelegtes Band noch schreibgeschützt"
    exit 3
  fi 
  if [ -n $PRE_BACKUP_SCRIPT ] ; then $PRE_BACKUP_SCRIPT ; fi
  backup_write
  backup_unload
  if [ -n $POST_BACKUP_SCRIPT ] ; then $POST_BACKUP_SCRIPT ; fi
fi


Somit haben wir jetzt unser komplettes Backup-Konzept fertig. Es besteht aus 3 Scripten einem Config-File einem ganz einfachen Crontabeintrag( 30 22 * * * /root/backup/backup_cron.sh ). Daneben haben wir eine backup.log in der die wichtigsten Aktionen des gesammten Backupsystems gelogt werden, für jedes Band eine BANDNAME.log in der jeweils die aktuellen Dateinamen der Dateien auf diesem Band stehen und dessen Zeitstempel wir zur Ermittlung eines möglichen Beschreibens dieses Bandes heranziehen, und wir haben für jedes Filesystem eine ./FLAGX Datei, in der steht für das dazugehörige Dateisystem die Cartridge auf der der letzte Vollbackup gemacht wurde, den Zeitstempel dieser FLAG-Dateien nutzen wir als Zeitstempel für unsere Diff-Sicherungen. Daneben können wir noch eine Pattern Datei (Namen nicht festgelegt) mit den Pattern für geziehltes Restore einzelner Dateien anlegen, sowie noch Scripte starten die vor oder nach unserem Backup ausgeführt werden sollen. Als Demo recht umfangreich aber noch längst nicht ausgereift oder gar vollkommen, aber das kann ja jeder so anpassen und erweitern wie er es für richig hält.

Ich habe in den anderen Scripten schon einige Kinderkrankheiten gefunden und beseitigt, aber es sind mit Sicherheit noch kleinere und größere Fehler in den Scripten, bei diesem Umfang nicht zu verhindern. Ich habe die letzte Woche ausgiebig alle Funktionen unter Normalbedingungen ausprobiert und getestet, also wenn ihr die jetzige Fassung der 4 Dateien von diesem Server kopiert und euch an einige Hinweise in meinen Postings haltet, die conf-Datei entsprechen anpasst, dann sollte es mit jedem SCSI-Tapelaufwerk zum laufen kommen.

robi
 

kunu

Newbie
Hallo Robi,
habe folgendes Problem:
Verwende ein Compac digital Datastore.

Kann das Band (/dev/st0) labeln, Daten sichern und rücksichern, log ansehen. Das Ganze aber nur solange ich das Band nicht entlade oder neu einlesen lasse.

Die Daten stehen zwar am Band, da das Label aber nicht gelesen werden kann, komme ich nicht mehr ran.

Es gibt folgende Ausgabe:
[root@fedora tmp]# dd if=/dev/st0 count=1
dd: Lesen von â /dev/st0â : Eingabe-/Ausgabefehler
0+0 Datensätze ein
0+0 Datensätze aus

gibt es da einen Tipp von dir?
 
A

Anonymous

Gast
Hallo kunu

war ein bissel im Urlaub, desshalb erst heute deinen Hilferuf gelesen.
Dein Laufwerk kenne ich nicht habe das ganze mit verschiedenen Exabyte, DAT, LTO und DLT sowie einigen High End Geräten getestet.
Folgendes verstehe ich nicht so ganz, verwendest du die Programme so wie ich sie hier abgelegt habe, oder hast du Änderungen vorgenommen, da bei meinen Programmen das Band eigentlich nach dem Beschreiben entladen werden müsste??
Der dd Befehl sollte wie du ihn hier abgelegt hast sollte am Bandanfang funktionieren. Wenn nicht dann solltest du mal in die /var/log/messages sehen ob da Fehlermeldungen vom kernel und st0 eingetragen sind, Wenn ja, dann mal bitte senden.
ebenso mal bitte die Ausgaben von mtst -f /dev/nst0 status senden und mal vor dem dd-Befehl mtst -f /dev/nst0 rewind und mtst -f /dev/nst0 setblk 0 versuchen. Wenn in der Fehlermeldung in der Messages Sensebyte also eine ganze Reihe von Hexzahlen drinn stehen sollten, brauche ich bitte noch eine möglichst genaue Bezeichnung deines Laufwerkes, Hersteller, Type usw. oder den Ausdruck von scsiinfo -i /dev/nst0 , ( möglich das scsiinfo evtl nicht installiert ist und desshalb nicht funktioniert)

robi
 

kunu

Newbie
Hallo Robi
ich verwende das script vom 29.09.2004 von dir. Einzige Änderungen sind, dass das Device bei mir st0 heisst und ich mache die Abfrage nur mit mt (dort liegt vermutlich das Problem). Wollte mtst ( rpm -i mt-st-0.8-1.i386.rpm ----- package mt-st-0.8-1 is already installed) installieren ist aber offensichtlich schon vorhanden. Kann es aber leider nicht finden.

scsiinfo wollte ich installieren, scheint aber sehr alt zu sein, jedenfalls werde ich mit dem Nachinstallieren von fehlenden Abhängigkeiten nicht fertig. Vermute aber den Fehler weder beim Laufwerk (eigentlich ein hundsgewöhnliches 20G (kompressed 40G) dat-laufwerk für DDS4 Bänder.

Gruß Kunu
 
A

Anonymous

Gast
Das Problem könnte wirklich von mt ausgelöst werden. Die Scripte sich allesamt auf mtst aufgebaut und einige verwenden auch Optionen die nicht in mt implementiert sind. Auch werden Ausgaben von mtst ausgewertet die unter mt ganz anders aussehen und die Ablaufsteuerung im Script behindern könnten. mtst seht bei mir im Verzeichniss /usr/bin/
Wenn es bei dir Probleme bei der Installation geben sollte, dann mal im Bereich Install und YAST suchen wie man defekte Pakete (und oder RPM-Datenbank) repariert. mtst sollte für die scripte hier schon funktionieren, und ist obendrein für SCSI-Laufwerke wesentlich besser geeignet.

scsiinfo brauchst du nicht. Ich hoffe nur es handelt sich um ein SCSI-DAT und nicht um ein IDE-DAT das nur über SCSI-Emulation läuft, das kann ich wegen Mangels Hardware nicht testen und hier kann ich mir vorstellen, dass evtl nicht alles richtig funktioniert. Aber der Knoten /dev/st0 müsste schon ein echtes SCSI-Laufwerk sein.

Der Knoten /dev/st0 ist ein Knoten der das Band zurück zum Bandanfang spult, wenn der Konten geschlossen wird. Da es sich um ein Script handelt wird der Knoten natürlich bei jedem Befehl neu geöffnet und geschlossen und dabei würde bei diesem Konten das Band jedes mal wieder zurückgespult und damit die gerade geschriebenen Daten wieder überschrieben. Der /dev/nst0 arbeitet mit dem selbem Laufwerk, der einzige Unterschied, hier wird beim Schließen des Knotens nicht zurückgespult, und genau das benötigen wir in unseren Scripten, sonst überschreibt ja unsere Sicherung auch das Label, im dümmsten Fall ist das Band leer, wenn du es aus dem Laufwerk holst, es steht nur ein EOF (END OF FILE) drauf, auch das kann diesen dd Fehler verursachen.

Versuche mal das mit mtst und /dev/nst0 hinzubekommen. Ansonsten schau mal in die /var/log/messages, wenn dort Fehlermeldungen stehen kann ich daraus schließen was hängt.

robi
 

dos

Newbie
gibt es dieses script noch und wo kann man es bekommen?

oder sind die code-schnipsel in diesem thema letztendlich der gesamte inhalt des scripts?
 
A

Anonymous

Gast
dos schrieb:
gibt es dieses script noch und wo kann man es bekommen?

oder sind die code-schnipsel in diesem thema letztendlich der gesamte inhalt des scripts?

Das gesamte Thema wurde hier stark zusammengestrichten, es war ursprünglich sehr viel umfangreicher und hat die gesamte Entwicklungsgeschichte komplett und sehr ausführlich dargestellt.

Das Endergebnis besteht aus 3 Scripten und einer Konfigdatei.

1. Script für interaktive Benutzung im Beitrag vom 29.09. 22.31 uHR
2. Hilfsscript für die Erinnerung am richtigen Tag das richte Band einzulegen. im Beitrag vom 03.10 13.30 Uhr
3. im selben Beitrag ist die Konfigurationsdatei
4. Script für den Einsatz mit Cronjobs im Beitrag vom 9.10 20.30 Uhr

Im Homeverzeichnis von root ein Verzeichnis backup anlegen, diese Dateien dort hinkopieren. Ich hoffe das im stark zusammengestichen Beitrag noch genügend Hinweise enthalten sind, wie man das alles praktisch einrichten und praktikabel bedienen muss. Ich habe jetzt nicht genügend Zeit das zu überprüfen, wenn du irgendwelche Fragen hast, ich stehe dir hier zu Verfügung, bei mir läuft dieses Konzept in fast unveränderter Form auf 2 Rechnern noch immer aktiv.


robi
 

dos

Newbie
wieso wurde denn der Beitrag zu stark zusammengefasst?

Ich werde alles mal ausprobieren und melde mich bei Bedarf. Vielen Dank schonmal dafür.
 
A

Anonymous

Gast
dos schrieb:
wieso wurde denn der Beitrag zu stark zusammengefasst?
Dieser Beitrag war wohl der Grund das letztens die Festplattenprobleme aufgetreten sind. :lol: :lol: :lol: :lol: mir fällt es aber auch immer so schwer mit kurz zu fassen.
Sammelt sich im Laufe der Zeit ganz schön was zusammen, da muss man auch mal auf etwas verzichten können.

robi
 
Oben