Archive

Posts Tagged ‘crontab’

Automatische Sicherung von Windows Verzeichnissen

2011/12/06 Kommentare aus

Es existieren mehrere Lösungen um die Sicherung von Daten über das Netzwerk mehr oder weniger automatisiert durchzuführen, unter anderem die Open-Source Programme Bacula und Amanda. Oft ist die Komplexität dieser Programme aber zu hoch, ein von Hand erstelltes Shellskript bei weitem ausreichend.

Alleine durch die Verwendung der UNIX-Standardwerkzeuge cp, rsync sowie crontab und der Verwendung von Windows-Standardfreigaben ist jedoch  bereits ein sehr gutes und leichtgewichtiges Konzept zur automatisierten Sicherung von Benutzerdaten realisierbar:

  • Keine Änderungen an den Client-Rechnern notwendig
  • minimale Netzwerklast bei Übertragung der zu sichernden Daten
  • Erstellung von Snapshots der gesicherten Daten möglich
  • minimaler Speicherbedarf auf dem Backup-Server
  • einfache Zeitplanung der Sicherung durch Eintrag in crontab

Windows Standardfreigaben

Microsoft Windows stellt per Default für jedes lokale Laufwerk eine Standardfreigabe bereit. Diese wird über das Netzwerk einfach mit dem entsprechendem Laufwerksbuchstaben und einem darauf folgenden Dollarzeichen angesprochen, also z.B. \\CLIENT\C$ für Laufwerk C:. Windows-Freigaben die mit einem Dollarzeichen enden sind in der Netzwerkübersicht generell nicht sichtbar, können aber bei Kenntnis des genauen Freigabenamens problemlos angezeigt werden. Zu beachten ist dabei aber, dass die automatisch erstellten Standardfreigaben nur für Benutzer mit Administrator-Rechten verwendbar sind.

rsync

rsync ist ein Programm zur Synchronisation von Daten. Die Synchronisation läuft bei rsync nur in eine Richtung, also von einem Quellverzeichnis zu einem Zielverzeichnis, ab. Ein wichtiges Merkmal von rsync ist, dass es nicht nur ganze Dateien kopieren kann, sondern auch Teile von Dateien. Wurde auf dem Quell-Datenträger eine Datei verändert, werden nur die geänderten Teile der Datei auf das Zielsystem übertragen. Die Folge ist eine minimale Netzwerklast (mit einem geringem Overhead).

Hardlinks

Durch Erstellung von Hardlinks kann eine beliebige Anzahl von Snapshots der gesicherten Daten erstellt werden, ein Zugriff auf den Zustand der gesicherten Daten beispielsweise von vor einem Monat oder auch von vor nur einer Stunde ist problemlos möglich. Eine sehr wichtige Funktionalität bei unbeabsichtigten Änderungen oder eventuellem Virenbefall. Was ist eigentlich ein Hardlink? Unter Linux ist ein Hardlink nichts anderes als ein weiterer Name für eine bereits bestehende Datei. Falls die Originaldatei gelöscht wird können die darin enthaltenen Daten immer noch über den erstellten Hardlink angesprochen werden. Ein Hardlink verbraucht außer einem Inode keinen weiteren Platz auf dem Dateisystem. Dadurch lassen sich mehrere Versionen der gesicherten Daten bei minimalem Speicherbedarf vorhalten.

crontab

Durch Eintrag eine cronjobs ist die wiederkehrende Sicherung automatisch und ohne manuelle Interaktion des Administrators möglich.

Konfiguration der zu sichernden Daten

/root/shares.txt

benutzer1://WORK1/D$/foo/bar
benutzer2://WORK2/C$/MeinVerzeichnis
benutzer3://WORK3/C$/Daten/benutzer3/Back_Me_Up
benutzer4://WORK4/C$/Verzeichnis/Nutzerdaten

Die zu sichernden Daten sind zentral in einer einfachen Textdatei konfiguriert. Angegeben wird hier durch Doppelpunkt getrennt der Benutzername und das zu sichernde Verzeichnis im UNC Format (Vorsicht bei Leer- oder Metazeichen). Es ist empfehlenswert die angeführten Benutzer vorher auch im System anzulegen – die gesicherten Daten können dem Benutzer dann beispielsweise als Netzwerkfreigabe seines Heimatverzeichnisses read-only bereitgestellt werden.

Shellskript zur Sicherung der konfigurierten Verzeichnisse

/root/backup.sh

#!/bin/bash
for line in `cat /root/shares.txt`; do
 USERNAME=`echo $line | cut -d: -f1`
 SHARE=`echo $line | cut -d: -f2`
 DIRECTORY=`basename "$SHARE"`
echo "$USERNAME $SHARE $DIRECTORY"

 /bin/mount -t cifs -o ro,credentials=/etc/samba/.smbcredentials $SHARE /mnt/tmp
 if [ $? -eq 0 ]; then
 trap "/bin/umount -l /mnt/tmp; exit" INT TERM EXIT
 /usr/bin/rsync -a --delete /mnt/tmp/ /home/$USERNAME/$DIRECTORY
 /bin/umount /mnt/tmp
 trap - INT TERM EXIT
 fi
done

Für jede Zeile in shares.txt wird der Benutzername, die Netzwerkfreigabe sowie das darauf zu sichernde Verzeichnis in entsprechende Variablen gespeichert und daraufhin durch den echo-Befehl auf der Konsole ausgegeben. Danach wird versucht, die angegebene Freigabe in das Dateisystem einzubinden. Besonders anzumerken bei diesem mount-Befehl ist die Verwendung des credentials-Parameters – Zugangsdaten werden dabei in einer externen Datei (hier: /etc/samba/.smbcredentials) abgelegt anstatt im Shellskript angeführt zu sein. Der Aufbau dieser Datei ist recht einfach:

username=Administrator
password=Pa$$w0rd
domain=ARBEITSGRUPPE

Falls der mount-Befehl erfolgreich war werden die zu sichernden Daten via rsync in das lokale Verzeichnis /home/<Benutzername> übertragen und die Netzwerkfreigabe danach wieder aus dem Dateisystem ausgehängt. Die Verwendung des trap-Befehls stellt hier sicher, dass die Netzwerkfreigabe auf jeden Fall aus dem Dateisystem ausgehängt wird, also auch bei Abbruch des Shellskripts.

Shellskript zur Erstellung von Snapshots

/root/snapshot_backup.sh

#!/bin/bash
for line in `cat /root/shares.txt`; do
 USERNAME=`echo $line | cut -d: -f1`
 SHARE=`echo $line | cut -d: -f2`
 DIRECTORY=`basename "$SHARE"`

 echo "removing oldest snapshot: 4"
 rm -rf /home/$USERNAME/snapshot4_${DIRECTORY}
 echo "moving snapshots: 3 -> 4, 2 -> 3, 1 -> 2"
 mv /home/$USERNAME/snapshot3_${DIRECTORY} /home/$USERNAME/snapshot4_${DIRECTORY}
 mv /home/$USERNAME/snapshot2_${DIRECTORY} /home/$USERNAME/snapshot3_${DIRECTORY}
 mv /home/$USERNAME/snapshot1_${DIRECTORY} /home/$USERNAME/snapshot2_${DIRECTORY}
echo "creating snapshot 1"
 echo "cp -al /home/$USERNAME/$DIRECTORY /home/$USERNAME/snapshot1_${DIRECTORY}"
 cp -al /home/$USERNAME/$DIRECTORY /home/$USERNAME/snapshot1_${DIRECTORY}
done

Dieses Shellskript ist ähnlich aufgebaut wie das vorige. Nach Auslesen der in shares.txt definierten Verzeichnisse wird der älteste existierende Snapshot (in diesem Fall Nummer 4) gelöscht, Snapshot Nummer Drei wird umbenannt zu Snapshot Nummer Vier, Zwei zu Drei und Eins zu Zwei. Danach wird ein Snapshot des aktuellen Datenbestands unter mit der Bezeichnung snapshot1 angelegt. Wir erinnern uns, durch die Erstellung von hardlinks wird fast kein zusätzlicher Platz auf der Festplatte beansprucht, die Erstellung der Snapshots sollte sehr schnell vonstatten gehen.

Zeitsteuerung durch Eintrag in crontab

Die Skripte können durch Erstellung eines cronjobs sehr einfach automatisiert ausgeführt werden. Der crontab lässt sich durch Aufruf des Befehls crontab -e bearbeiten.

00 12 * * * /root/backup.sh
00 14 * * 5 /root/snapshot_backup.sh

In diesem Fall wird die Sicherung der Nutzerdaten täglich um 12:00 Uhr ausgeführt sowie jeweils Freitags ein Snapshot des aktuellen Zustands der gesicherten Daten angelegt.

mit cron und at die Aufgabenplanung konfigurieren

2010/12/26 Kommentare aus

Der cron-Daemon ist eine Jobsteuerung von Unix bzw. unixartigen Betriebssystemen wie Linux, BSD oder Mac OS X, die wiederkehrende Aufgaben (cronjobs) automatisch zu einer bestimmten Zeit ausführen kann.

Häufig führt der Cron-Daemon wichtige Programme für die Instandhaltung des Systems aus, wie zum Beispiel Dienste für das regelmäßige Archivieren und Löschen von Logdateien.

Crontab

Der Begriff selbst leitet sich ab von griechisch chronos = die Zeit und lat. tabula = die Tafel, oder das Brett und bedeutet demnach soviel wie „Stundenplan“. Die auszuführenden Befehle werden in einer benutzereigenen Tabelle gespeichert, der sogenannten crontab. Diese Tabelle besteht aus sechs Spalten; die ersten fünf dienen der Zeitangabe (Minute, Stunde, Tag, Monat, Wochentag), alle weiteren Zeichen bis zum Zeilenumbruch werden als der auszuführende Befehl aufgefasst. Die einzelnen Spalten werden durch Leerzeichen oder Tabulatoren getrennt.

Beispiel einer Crontab:

#M    S   T M W    Befehl
5     *   * * *    /usr/bin/message.sh    # fünf Minuten nach jeder vollen Stunde
*/5   *   * * *    /usr/bin/message.sh    # alle 5 Minuten
59    23  * * 0    gzip /var/log/messages # einmal pro Woche Sonntags um 23:59 Uhr
0     0   * * *    gzip /var/log/auth.log # täglich um 00:00 Uhr
20,30 1   * * 1-5  /usr/bin/work.sh       # Montags bis Freitags jeweils um 01:20 und 01:30

Die Struktur ist wie folgt zu verstehen:

* * * * * auszuführender Befehl
┬ ┬ ┬ ┬ ┬
│ │ │ │ │
│ │ │ │ └──── Wochentag (0-7) (Sonntag =0 oder =7)
│ │ │ └────── Monat (1-12)
│ │ └──────── Tag (1-31)
│ └────────── Stunde (0-23)
└──────────── Minute (0-59)

Um den einen cronjob zu erstellen führen Sie den Befehl crontab aus:

crontab –e              # eigenen crontab erstellen/ändern
crontab –e –u alice     # alice’s crontab ändern

at

at Führt Kommandos zur bestimmten Zeit aus.

atq Listet die momentan laufenden Jobs des Benutzers auf, root darf die laufenden Jobs aller Benutzer anzeigen. Die Ausgabe erfolgt im Format: Job Nummer, Datum, Stunde, Queue, und Benutzername.

atrm beendet Jobs, durch ihre Jobnummer identifiziert.

batch führt Befehle aus wenn die Systemauslastung es erlaubt, d.h. wenn die durchschnittliche Systemauslast unter 0,8 fällt, oder den Wert der atd beim Starten übergeben wurde.

Kategorien:RHCSA Schlagwörter: , , , ,