Backup für NAS

schorsch_76

FreeBSD Fanboy
Hallo zusammen,

ich hab einen kleinen Rechner mit Mini ITX Board und einer SSD als NAS laufen. Dort hab ich FreeBSD 11.2 amd64 drauf. Als Filesystem kommt hier ZFS zum Einsatz.

Ich hab hier alle meine Daten zentral liegen was auf der eine Seite schön ist, aber auf der anderen Seite doof ist (Single Point of Failure, aka Daten futsch). Das sind 105 GB. Da das Gehäuse sehr begrenzen Raum bietet um Raid zu fahren (nur eine Platte möglich), such ich gerade eine Lösung für das Backup Problem.

Als Randbedingung hätte ich gern:
  • automatisches Backup. Manuell wird immer wieder vergessen. Wenn du es brauchst, hast du es nicht gemacht...
  • mindestens wöchentliche Backups.
1. Jetzt hab ich bei Hetzner einen Rootie laufen auf dem ich Platz habe. Mein Upload von daheim ist nur nicht optimal. 1 MBit/s Upload. Das würde mir gefallen, aber 105 GB upload mit 1MBit/s :eek: Kann ich mit ZFS inkrementelle Backups machen? zfs send since ....? Das ist glaub ich unrealistisch wegen dem begrenzten Upload. 105 * 1e9 * 8 / 1e6 / 60 / 60 / 24 = 9.7 Tage Upload. Wäre aber schön da die Daten nicht am Ort gesichert sind. Wenn das backup gebraucht wird, ist der Download wieder das Problem. 10 MBit/s = 1 Tag Download.

2. Eine externe USB Platte + cron job. Wenn das Ding immer an ist ist es kein Backup.... aber besser als nur eine Platte.

3. Eine externe Festplatte mit Netzteil + Zeitschaltuhr + cron Job.

Fein wäre, wenn der Rechner die Platte an und aus schalten könnte ... (per Script).

Was würdet ihr mir raten? Wie macht ihr das Backup eures NAS?

Schönes Wochenende!

Gruß
Georg
 
2.Rechner irgendwo im Haus nur für diesen Zweck. Aufwecken vom NAS aus mit WOL, Backup fahren, nach (sehr reichlich bemessenem) Zeitablauf per Cronjob wieder ausschalten. Da ich nur einmal wöchentlich Backup fahre, spielt der Stromverbrauch vom Backuprechner keine Rolle, es tut also ein älteres Modell,was eigentlich schon ausrangiert ist.
 
Also normal kannst du für paar Euro Gebühr auch eine Festplatte an deinen Hoster schicken und die schließen sie für dich an. Dann wäre ein initiales Backup schon mal schnell dort (oder muss sich zumindest nicht durch die Leitung pressen).

Ich fahre Backups per externer Platte. Eine ist immer angeschlossen und macht tägliche Backups. Zusätzlich gibt es noch zwei andere Platten von denen eine bei mir im Haus lagert und die andere außer Haus gelagert wird. Einmal im Monat wird die bei mir befindliche Angeschlossen, ein Monatsbackup drauf gefahren und dann mit der extern gelagerten getauscht. (Dieser Rhythmus ist zumindest die Theorie ;) ).
Die externe Platte braucht nicht so viel Strom, dass man sie abstöpseln müsste (wie ich finde).

Ich dachte ZFS kann inkrementelle Snapshots senden...? Hab ich nie gemacht, daher bin ich nicht sicher.

Alternativ ist natürlich die Frage ob du wirklich das komplette Dateisystem sichern musst oder ob du nur bestimmte Dateien sichern willst/musst. Mit entsprechenden Backuptools wie z.B. restic kannst du dann auch inkrementell sichern. z.B. könnte man hergehen und sagen, alles was Lebenswichtig ist wird per Tool auf deinen Remoterechner gesichert. Alles was "unschön aber verschmerzbar" wäre wenn man es verliert liegt nur lokal auf dem Backup.
 
@Nonpareille : Danke das ist eine gute Idee :) Ich muss mal schauen, ich glaub in meinem HW Schrank sollte noch was liegen.... Werde mal probieren ob das Teil WOL kann.

@Rakor : Danke! Das werde ich jetzt mal auf die schnelle machen. ein kleines Script anpassen das auf meinem Server die Backups macht und dann auf die Backup Platte schiebt und rotiert.

Das läuft schon eine Zeit lang mit dem NAS, aber aus irgendeinem Grund bin ich heute drauf gekommen: "Schei...! Du hast ja keinerlei Backup! Nicht mal Raid1." :apaul:
 
Ich hab mal für lau nen altes LTO-4 bekommen, da sichere ich alle paar Wochen/Monate drauf (je nach dem ob ich das Gefühl habe das es wichtige änderungen gab) - ein Band habe ich davon immer extern gelagert.

Eine einzelne Platte oder einen einzelnen Rechner würde ich weniger empfehlen. Die gängisten verluste die ich so "mitbekommen" habe sowohl Privat sind Diebstähle (Die Einbrecher nehmen ggf. auch die Backupplatten mit) oder Wasserschäden, Brände e.t.c.). Diebstähle kommen sogar in meiner gefühlten Statistik noch deutlich vor verstorbenen Festplatten.
 
Ich habe verwende hierfür ZPaq. Das erste Backup ist entsprechend groß, die inkrementellen je nach Datenumsatz sehr klein. Ich speichere das ganze bei Amazon Glacier. Lässt sich in 5 Zeilen per Script automatisieren.
 
@CommanderZed: lass mich raten: Du wohnst in einer Gegend, wo es viele Rauschgiftsüchtige gibt und damit Beschaffungskriminalität? Da mag das so sein.
Meine Erfahrungen sind allerdings andere. Gut, Einbrüche hat ich noch keinen, leg auch keinen Wert drauf, aber Rohrbruch schon einigemale und auch Überschwemmung - ohne dass dabei Festplatten draufgingen, obwohl die Brühe sogar auf den Rechner tropfte. Einfach abgeraucht sind mir aber schon mehr als genug Festplatten. Nach meiner Kenntnis geben sich die Profibanden aus Polen und Rumänien, die hier manchmal tätig sind, auch nicht mit Desktop-Rechnern ab. Die nehmen allenfalls einen Laptop mit.
Sicherung außer Haus ist natürlich immer besser, aber die Möglichkeit dazu hat nun mal nicht jeder, bzw. nicht mit vertretbarem Aufwand.

Edit: Typho
 
Ja das weiß ich auch :)... Bei Raid1 ist wenigstens gegen den Ausfall einer Platte ein Kraut gewachsen.... Aber nicht mal das hatte ich :apaul:
 
Dieser Rhythmus ist zumindest die Theorie
Das ist vielleicht das größte Problem bei dieser Frage.
Backup-Strategien scheitern bei mir stets an meiner eigenen Bequemlichkeit und nicht an den technischen Möglichkeiten.

Man kann sich natürlich zu seinem ersten auch ein zweites und drittes Backup anlegen und dann diese an unterschiedliche Orte in der Welt verteilen, eine verschlüsselte Kopie erstellen und in einer Cloud lagern und vielleicht auch noch alles ausdrucken, was geht und bei einem Notar hinterlegen.

Mein NAS ist mein Backup-System.
Darauf laufen mehrere Festplatten in ZFS, mit Redundanz = eine Platte.
Auf meinem PC läuft auch ein ZFS, mit Redundanz = zwei Platten.

Man mag darüber streiten, ob eine Platte Redundanz bei einem NAS ausreichend ist, aber das war damals auch durch knappes Budget diktiert. Es hat sich seit einem knappen Jahrzehnt bewährt, aber ich würde heute wenigstens eine Redundanz von zwei Platten nehmen.

Das Backup vom Backup mache ich nur gelegentlich und manuell auf externe USB-Platten (womit ich dann die Redundanz des Systems pro Platte (externes Medium) jeweils um eins erhöhe).
Ich habe unterschiedliche Methoden getestet und für mich persönlich ist auch nach vielen Neuerungen immer noch rsync das Mittel der Wahl. Auch meine regelmäßigen Sicherungen zum NAS laufen über einen rsync per cron.

Mit diversen externen Platten habe ich unterschiedliche Dateisysteme probiert.
Mit FreeBSD kann ich ZFS nutzen und habe eine externe Platte in ZFS angelegt, wobei die natürlich Redundanz = 0 hat!
Die Probleme mit den Daten auf der Platte sind aber durchaus vorhanden.
Niemand nutzt hier außer mir FreeBSD und deshalb kann niemand diese Daten direkt verwenden. Ich muss immer erst die Platte bei mir einbinden und dann Dateien kopieren. ZFS ändert sich, FreeBSD ändert sich und ich muss jedesmal die Befehle nachlesen, wie ich mit dieser Platte umgehen muss. Ich brauche sie ja nur selten. Häufiger misslingt es mir dann, den Pool wieder sauber zu exportieren. Vermutlich, weil ich mit irgendwas noch darauf zugreife, das ich im Moment nicht sehe und wofür ich dann auch nicht die geduld habe, es zu finden.

Deshalb und aus verschiedenen anderen Gründen entschied ich mich schließlich für NTFS als Austausch-Dateisystem und damit auch als das Dateisystem für Backups von meinem NAS.
Das FUSE-Modul und NTFS-3G werden gelegentlich wegen Datenverlust kritisiert, aber ich habe damit seit etlichen Jahren nur positive Erfahrungen gemacht. Dabei
-lege ich Dateisysteme nur in einem Windows-System an und nutze sie anschließend übergreifend.
-repariere ich diese Dateisysteme nur unter einem Windows.
-akzeptiere, dass die Unix-Rechte an Dateien verloren gehen (ich sichere ja keine Systemdateien und daher geht das gut).

rsync hat das delta-CP im Blut. Es ist dafür gemacht.
Und es ist nicht auf bestimmte Dateisysteme angewiesen. Wenn es die Unix-Dateirechte nicht übertragen kann, gibt es Fehlermeldungen aus, aber es arbeitet trotzdem effizient und überträgt die Deltas zu jeder Datei ins Ziel.

105G sind ein Schmarren. Oder wie sagt man das?
Für ca. 20 oder 25€ sah ich letztens einen kleinen USB3-Stick mit 68G.
 
So, mein script vom Server hat mir nicht gefallen, da die Fehlercodes nicht geprüft wurden. Jetzt hab ich ein neues mit Abfrage der Fehlercodes und 7 Tages zfs snapshots und automatischem löschen alter Backups geschrieben.

Was haltet ihr davon?

Code:
#!/bin/sh

# parameter
ZFSROOT=zroot
TARGET_DISK=/dev/gpt/GELI-NAS-Backup
TARGET_PATH=/mnt/USB3.0-1T
KEY=/root/scripts/nas-backup.key
DAYS_TO_KEEP_SNAPSHOTS=7
ESTIMATED_SNAPSHOT_SIZE_GB=160

# runtime variables
STEP=10
SUCCESSUL=0
DATE_AGO=""
SNAPSHOT_NAME_AGO=""
SNAPSHOT_FILENAME_AGO=""

check_for_error()
{
        RET_VAL=$1
        STEP_OK=$2
        STEP_NOK=$3
        if [ $RET_VAL -eq 0 ] ; then
                echo "                              [ OK     ]"
                STEP=$STEP_OK
        else
                echo "                              [ Failed ]"
                STEP=$STEP_NOK
        fi
}

date_x_days_ago()
{
        DAYS_BACK=$1

        SECS_SINCE_EPOCH=`date +%s`
        SECS_BACK=$(($DAYS_BACK * 24 * 3600))
        TARGET_SECS=$(($SECS_SINCE_EPOCH-$SECS_BACK))
        TARGET_DATE=`date -r $TARGET_SECS +%F`
        DATE_AGO="$TARGET_DATE"
}

snapshot_name_x_days_ago()
{
        DAYS_BACK=$1
        date_x_days_ago $DAYS_BACK
        SNAPSHOT_NAME_AGO="$ZFSROOT@$DATE_AGO"
}

snapshot_filename_x_days_ago()
{
        DAYS_BACK=$1
        snapshot_name_x_days_ago $DAYS_BACK
        SNAPSHOT_FILENAME_AGO="$TARGET_PATH/$SNAPSHOT_NAME_AGO.zfs.gz"
}

# force a unmounted usb and detached geli
umount $TARGET_PATH                     > /dev/null 2>&1
geli detach "$TARGET_DISK".eli  > /dev/null 2>&1

# run the statemachine
while [ $STEP -gt 0 ]
do
        case $STEP in
                10)
                        echo "Check backup Key"
                        if [ -f "$KEY" ]; then
                                STATUS=0
                        else
                                STATUS=1
                        fi
                        check_for_error $STATUS 15 80
                        ;;
                15)
                        echo "Check disk available"
                        if [ -e "$TARGET_DISK" ] ; then
                                STATUS=0
                        else
                                STATUS=1
                        fi
                        check_for_error $STATUS 20 80
                        ;;
                20)
                        echo "Attach Geli"
                        geli attach -p -k "$KEY" "$TARGET_DISK"
                        check_for_error $? 30 80
                        ;;

                30)
                        echo "Mount Geli device"
                        mount "$TARGET_DISK".eli "$TARGET_PATH"
                        check_for_error $? 35 70
                        ;;

                35)
                        echo "Check free space on backup disk"

                        media_size=`diskinfo $TARGET_DISK | cut -w -f 3`
                        estimated_snapshot_size_byte=$(($ESTIMATED_SNAPSHOT_SIZE_GB*1024*1024*1024))
                        max_allowed_used_space=$(($media_size - $estimated_snapshot_size_byte))


                        used_size=`du -cs "$TARGET_PATH" | tail -n 1 | cut -f 1`
                        while [ $used_size -ge $max_allowed_used_space ]
                        do
                                # try to keep at least one old snapshot
                                for i in `seq 365 2`
                                do
                                        snapshot_name_x_days_ago $i

                                        if [ -f "$SNAPSHOT_FILENAME_AGO" ]; then
                                                echo "Delete $SNAPSHOT_FILENAME_AGO"
                                                rm "$SNAPSHOT_FILENAME_AGO"
                                                break
                                        fi
                                done

                                used_size=`du -cs "$TARGET_PATH" | tail -n 1 | cut -f 1`
                        done


                        check_for_error $? 40 60
                        ;;

                40)
                        echo "Creating snapshot and backup"
                        # just dummy for test
                        snapshot_filename_x_days_ago 0
                        file_name=$SNAPSHOT_FILENAME_AGO

                        snapshot_name_x_days_ago 0
                        SNAPSHOT=$SNAPSHOT_NAME_AGO

                        zfs snapshot -r $SNAPSHOT
                        echo "   gzipping $SNAPSHOT to $file_name"
                        zfs send -R $SNAPSHOT | gzip > $file_name
                        true
                        STATUS=$?
                        if [ $STATUS -eq 0 ]; then
                                SUCCESSUL=1
                        fi
                        check_for_error $STATUS 50 60
                        ;;

                50)
                        echo "Droping old snapshots"
                        for i in `seq $DAYS_TO_KEEP_SNAPSHOTS 365`
                        do
                                snapshot_name_x_days_ago $i
                                zfs destroy -r $SNAPSHOT_NAME_AGO > /dev/null 2>&1 && echo "    dropped $SNAPSHOT_NAME_AGO"
                        done
                        # no error if it does not exists
                        check_for_error 0 60 60
                        ;;

                60)
                        echo "Unmount Geli device"
                        umount "$TARGET_PATH"
                        check_for_error $? 70 70
                        ;;

                70)
                        echo "Detach Geli"
                        geli detach "$TARGET_DISK".eli
                        check_for_error $? 80 80
                        ;;

                80)
                        if [ $SUCCESSUL -eq 1 ] ; then
                                echo "Backup successful"
                        else
                                echo "Backup failed"
                        fi
                        STEP=0
                        ;;

                *)
                        echo "undefined step"
                        STEP=0
                        ;;
        esac
done

# force a unmounted usb and detached geli
umount $TARGET_PATH                     > /dev/null 2>&1
geli detach "$TARGET_DISK".eli  > /dev/null 2>&1
 
Diese 105 GB scheinen nicht viel.... im Vergleich zu Daten einer Firma. Ich habe schon Männer weinen gesehen da sie der Frau erklären mussten das die Bilder der Kinder der letzten 5 Jahre weg waren. Alles nur auf dem Rechner gelegen. Nicht mal eine USB Platte.

Auf dem NAS liegen alle Sicherungen der Handy Bilder (Foldersync automatisch am Wochenende), meine Bürodokumente, meine Konto Datenbanken der letzten 15 Jahre., etc. Ich arbeite am Desktop mit Windows, Linux und FreeBSD. Auch am Laptop diese 3 OS. Der VDR läuft auch, die Frau hat auch ihren Laptop. Deshalb die zentrale Ablage der Daten .... und jetzt eben die Sicherung, daß ich nicht auch weinen muß. ;)

Ein Raid1 reicht nicht für Datensicherheit. Auf dem Server ist mir auch schon während dem Raid1 rebuild die "gute" Platte abgeschmiert. Daz gibts auch hier im Forum genug Fälle wo das nachzulesen ist. (Nicht meiner ;) ) Das Raid1 hat mir aber auch hier schon gute Dienste geleistet. Soweit ich mich erinnere, sind im Lauf der Jahre Daheim und auf dem Server 5 oder 6 Platten gestorben. Unzählige Platten in der Arbeit....

Den NAS hab ich auf FreeBSD umgestellt, da ich hier die snapshots nutzen wollte aber nicht aktiv umgesetzt habe. Siehe die ganzen Crypto Trojaner die auch Netzlaufwerke verschlüsseln. Ich hoffe das ich das jetzt umgesetzt habe :)
 
Zurück
Oben