Systemlaufwerks-schonende Backups mithilfe rsync

feissmaik
Entwickler Team
Beiträge: 2576
Registriert: So 17. Apr 2011, 11:39
Been thanked: 1 time
Kontaktdaten:

Systemlaufwerks-schonende Backups mithilfe rsync

Beitrag von feissmaik »

Mit rsync werden in diesem Fall nur die Dateien kopiert, die sich verändert haben.
Wenn man einmal ein komplettes Image erstellt hat und dann nur noch mit rsync arbeitet, wird nicht jedesmal nochmal alles kopiert sondern wie bereits erwähnt nur das was sich seither verändert hat..
Das geht vorallem auch in den meisten Fällen wesendlich schneller als jedesmal ein komplettes Image zu erzeugen

1) Einmalig ein Image mit " dd " erstellen, in diesem Beispiel wird das " if " Laufwerk nach /mnt/usbstick/Backup_sda.img geschrieben:

Code: Alles auswählen

dd if=/dev/sda of=/mnt/usbstick/Backup_sda.img
2) Ein Verzeichnis für den 3.Schritt erstellen:

Code: Alles auswählen

mkdir -p /mnt/Backup
3) Das erstellte Image mounten (einbinden):

Code: Alles auswählen

mount -o loop /mnt/usbstick/Backup_sda.img /mnt/Backup
4) Das Programm "rsync" installieren:

Code: Alles auswählen

apt-get install rsync
5) Script /root/rsync_backup.sh erstellen zum regelmässigen backupen mit rsync:

Code: Alles auswählen

#!/bin/bash
# Simple backup with rsync

## Create Log? [0=no , 1=yes]
LOG=1

## Log also verbose (--dry-run) rsync output? [0=no , 1=yes]
# NOTE: Logfile can get very big!
VERBOSE=0

## Wheres the Imagefile to get mounted?
IMAGE="/mnt/usbstick/BACKUP/rpi.img"

## MountPoint where Backuped-Image is mounted
MOUNTPOINT="/mnt/Backup"

## Exclude Dirs/Files (these dirs/files dont get backuped) (space seperated)
EXCLUDE="/mnt/usbstick"


# -------------------------------------------------------------- #
# >>> >> >  DO NOT MESS WiTH ANYTHiNG BELOW THiS LiNE!  < << <<< #
# -------------------------------------------------------------- #


for EX in $EXCLUDE ; do
    [ -z "$EXCL" ] && EXCL="--exclude=$EX" || EXCL="$EXCL --exclude=$EX"
done

#- variables
LOGFILE=/var/log/$(basename $0).log
RSYNCopt="-aR --update --exclude=$MOUNTPOINT --exclude=$IMAGE --exclude=/proc --exclude=/sys $EXCL"


#- functions


# check and write log / also echo message to console
_LOG() {
    [[ "$1" =~ "\r\n" ]] && echo -e "$1"
    message="$1"
    if [ $LOG = "1" ]; then
        _DT=$(date +"%d.%m.%Y %H:%M:%S")
        echo -e "[$_DT] $message" >> $LOGFILE
    fi
}


#- main code


[ "$VERBOSE" = 1 ] && RSYNCopt="--dry-run $RSYNCopt"

MOUNTED=$(mount | grep "$MOUNTPOINT");

if [ -z "$MOUNTED" ]; then
    _LOG "$MOUNTPOINT not mounted. Mounting $IMAGE to $MOUNTPOINT\r\n"
    [ ! -d "$MOUNTPOINT" ] && mkdir -p $MOUNTPOINT
    mount -o loop $IMAGE $MOUNTPOINT
fi

if [ "${MOUNTPOINT:${#MOUNTPOINT}-1:1}" != "/" ]; then
  MOUNTPOINT=$MOUNTPOINT/
fi


_LOG "rsync $RSYNCopt / $MOUNTPOINT\r\n"
if [ "$VERBOSE" = 1 ]; then
    rsync $RSYNCopt / $MOUNTPOINT >> $LOGFILE 2>&1
else
    rsync $RSYNCopt / $MOUNTPOINT
fi


exit 0
6. Das Script ausführbar machen:

Code: Alles auswählen

chmod +x /root/rsync_backup.sh
7. Zur Kontrolle das Script ausführen:

Code: Alles auswählen

/root/rsync_backup.sh
8. Das Script in die Crontab eintragen. In diesem Beispiel wird es ein mal jede Woche, Montag Morgen um 03:00 ausgeführt:
nano /etc/crontab

Code: Alles auswählen

0 3 * * 1       /root/rsync_backup.sh >/dev/null 2>&1


Wer an sein Gerät immer nur einen USB-Stick oder Festplatte anschliest kann ausserdem sein System so einstellen dass das Device immer automatisch beim einstecken, eingehängt (mounted) und beim abziehen auch wieder ausgehängt (unmounted) wird - letzteres ist ebenfalls wichtig da es sonst haufenweise Fehlermeldungen in den Systemlogs verursacht
Spoiler
Show
1) udev Regel anlegen:

Code: Alles auswählen

nano /etc/udev/rules.d/99-usbautomount.rules
Mit folgendem Inhalt:

Code: Alles auswählen

ACTION=="add", SUBSYSTEMS=="usb", KERNEL=="sd?1", RUN+="/bin/mount /dev/%k /mnt/usbstick"
ACTION=="remove", SUBSYSTEMS=="usb", KERNEL=="sd?1", RUN+="/bin/umount /dev/%k"
Das ist eine sehr einfach gehaltene Regel, damit ein x-beliebiger USB-Stick immer nach /mnt/usbstick eingebunden wird..

2) udev neu starten:

Code: Alles auswählen

/etc/init.d/udev restart
3) mount-point (Verzeichnis wohin der Stick gemounted wird) anlegen:

Code: Alles auswählen

mkdir -p /mnt/usbstick
4) USB-Stick mit einer FAT32 Partition formatieren, einstecken und mit dem Befehl

Code: Alles auswählen

mount
prüfen ob obiges funktioniert


Das funktioniert in der Form aber nur mit einem USB-Stick/HDD. Wer mehrere nutzten möchte, muss die udev-Regel anpassen bzw anhand genauerer Merkmale das Device unterschieden
Du musst nicht kämpfen um zu siegen

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast