Ehoco.nl

Home Automation

How-toRaspberryUITGELICHT

Automatische Raspberry Pi backup – complete image

Vroeg of laat geven de SD-kaarten van de Raspberry Pi’s problemen, bijvoorbeeld door stroomuitval en door verkeerde instellingen. Zodra je je Raspberry Pi hebt voorzien van Raspbian en eventueel Domoticz wil je natuurlijk een Raspberry Pi backup hebben voor het geval er iets fout gaat en je Raspberry niet meer boot.

In dit artikel leggen we uit hoe je een automatische Raspberry Pi backup kunt instellen. Het doel is om de backup iedere nacht om 03.00 uur te laten uitvoeren en de Raspberry Pi Backup weg te schrijven naar een folder op je NAS door middel van een NFS share (uiteraard kun je ook een USB-stick of externe harddisk gebruiken). Daarnaast willen we dat de Raspberry Pi gewoon blijft draaien tijdens de backup en dat je de Raspberry Pi backup direct op een nieuwe SD-kaart kunt restoren. We gaan beginnen!

Benodigdheden

Maak een de folder aan op je Raspberry Pi. Ik heb gekozen voor /mnt/backup, maar het mag een willekeurig folder zijn:

Mounten na reboot

Uiteraard willen we dat de mount naar je NAS na een reboot van de Raspberry Pi ook aanwezig is. Hiervoor dienen we een wijziging aan te brengen ins fstab:


Voeg onderstaande regel toe:

  • 192.16.8.2.157 -> IP-adres van je NAS
  • Backups/Backup_Raspberry_Pi -> de folder op je NAS die je wilt mounten
  • /mnt/backup -> de folder op je Raspberry Pi
  • comment=systemd.automount -> hiermee geven we aan dat de mount alleen plaatsvindt als er om gevraagd wordt. Aangezien ik alleen de WLAN-interface op de Raspberry gebruikt moest ik deze voorwaarde toevoegen, aangezien de Raspberry Pi na een reboot wilde mounten, terwijl de Wi-Fi-verbindig nog niet opgestart was.
  • username=pietje -> gebruikersnaam van je NAS
  • password=puk -> wachtwoord van je NAS

Test de mount met commando:


Als er een fout in fstab zit krijg je dit te zien. Eventueel kun je onderstaand commando gebruiken om bijvoorbeeld te controleren dat je gebruikersnaam en wachtwoord correct zijn:


Corrigeer eventuele fouten en download vervolgens hier het script. Pak het script uit met een extracter (bv. WinRar) en plaats het .sh-bestand in een folder naar keuze. Ik heb het script op mijn NAS geplaatst, zodat ik het ook kan gebruiken voor mijn andere Raspberry Pi’s.

Maak het script uitvoerbaar:

Crontab

De laatste stap is om het script toe te voegen aan crontab. Aangezien het script uitgevoerd moet worden als root moeten we de root crontab wijzigen:


Voeg onderstaande regel toe (let op dat je de locatie wijzigt naar de folder waar je het script hebt opgeslagen):


Er wordt nu iedere nacht om 3 uur een backup van de SD-kaart van je Raspberry Pi gemaakt.

 

Variabelen in het script

Het gebruikte script heeft twee variabelen, namelijk backup_path en retention_days. De eerste is de locatie waar de backup wordt opgeslagen, de tweede is het aantal dagen dat een backup wordt bewaard. Deze twee waarden kun je zelf aanpassen.

59 gedachten over “Automatische Raspberry Pi backup – complete image

    • Ok, al veel gegoogled hierop maar vind nergens een oplossing. Suggesties zijn meer dan hartelijk welkom!
      dd: error writing ‘/mnt/backup/raspbian.img’: No space left on device
      1024+0 records in
      1023+0 records out
      4293918720 bytes (4.3 GB, 4.0 GiB) copied, 1162.23 s, 3.7 MB/s
      root@raspberry4b:~#

      Beantwoorden
  • Top tip!
    Er moe(s)t alleen geen spatie tussen “uid=1000, gid=46″…
    En vraag me ook af een ddump van een pi wel een consistente backup oplevert als je er bijvoorbeeld Domoticz op draait dat constant aan het loggen is…

    Beantwoorden
    • Je zou de services van Domoticz eerst kunnen stoppen, de backup draaien en vervolgens de services van Domoticz weer starten.

      Trouwens, ook niet onbelangrijk: Welke syntax kan het beste worden gebruikt om een eventuele restore uit te voeren?

      Beantwoorden
  • Kreeg een melding: Mount error (112): Host is down. Regel aangepast naar;
    //192.168.2.157/Backups/Backup_Raspberry_Pi /mnt/backup cifs comment=systemd.automount,defaults,rw,username=pietje,password=puk,vers=1.0,uid=1000,gid=46 0 0

    Let op: Vers=1.0 en geen spatie achter,

    Beantwoorden
  • Hi Joost,

    Het is mij uiteindelijk gelukt. Mijn images op de NAS zijn nu alles tussen de 1 MB en 28,65 MB. Een fractie van de werkelijkheid dus. Overigens heeft mijn 64 GB USB stick waar mijn RB Pi 3B+ op draait nog slechts enkel 18 GB over…

    Wat heb. ik fout gedaan? Zou dit graag werkend hebben…

    Dank & groet van een fan,
    Michel

    Beantwoorden
  • Pascal Paquay

    Ik krijg steeds deze foutmelding :
    -bash: //192.168.178.2/Public/domoticzbackup: No such file or directory

    terwijl map toch echt bestaat. Wie weet een oplossing ?

    Beantwoorden
  • Dank voor dit scripts (en de andere op deze site)! Het werkt vlekkeloos!

    Echter 1 vraag: retention_days staat bij mij op 3 dagen. Het is vandaag 20-4 en vannacht heeft het script de backup van 15-4 weg gehaald. Op dit moment staan er dus 5 backups op mijn nas (16-4 t/m 20-4). Terwijl dat er volgens mij dan 4 moeten zijn (de oudste backup zou dus max 3 dagen oud moeten zijn).

    Kan iemand toelichten hoe dit zit? Want zo goed snap ik Linux commands nog niet.

    Dank alvast!

    Beantwoorden
  • Het mounten was even lastig.
    Daarna een backup maken ging prima, tot een kleine 32 gb.
    Hiervoor heb ik het script een beetje aangepast:
    dd if=/dev/mmcblk0 bs=4M | gzip -c > $backup_path/$HOSTNAME.$(date +%Y%m%d).img.gz
    Het resultaat is een backup die 10% is van sd-kaart!

    Beantwoorden
  • Waar is de Windows machine?
    Vooropgesteld ik ben nog een Linux analfabeet maar waarom mounten als CFIS en niet als NFS?

    //192.168.2.157/Backups/Backup_Raspberry_Pi /mnt/backup nfs nolock,noatime 0 0

    Vergeet niet elke Raspberry IP-adres aan te melden als NFS op je NAS.

    Beantwoorden
    • Mounten als NFS kan ook prima. Ik gebruik nu: 192.168.2.72:/nfs/Backups/Backup_Raspberry_Pi /mnt/backup nfs comment=systemd.automount

      Beantwoorden
  • Ik heb je artikel hier ook eens geprobeerd.
    Helaas komt er niets op mijn nas te staan.

    is er ergens een logfile waar ik kan zien wat er mis gaat?

    Beantwoorden
    • Bas, uit ervaring weet ik inmiddels dat het op legio manieren fout kan gaan met als sprekend voorbeeld dat de NAS mount na een reboot uitbleef terwijl een manuele mount (sudo mount -a) perfect (alsnog) werkte. Dit valt niet direct op. Bovendien staan hierboven twee methodes beschreven voor het mounten van je NAS die zeer verschillend zijn.

      Optie 2: Kijk je als ADMIN op je NAS of met een userid zonder adminrechten? Wie weet zie je niet de userid waarmee je raspberry de NAS benadert en gaat alles toch goed. Zelf heb ik een script op de NAS gezet, deze getest voordat ik deze toevoegde in cron en toch….

      Ik maak overigens geen volledige back-up, beetje onzinnig dit dagelijks te doen maar zeker verstandig van tijd tot tijd een volledig kopie te maken van je SD-kaart; hiervoor gebruik ik overigens rpi-clone (met een kaartlezer direct aan de RPi).

      Bij het uittesten kan je beter iets ‘snellers’ uitproberen, zelf gebruik ik voor INFLUX bijgaand script die binnen een minuut klaar is:

      #!/bin/bash
      # Automate INFLUX Backups
      # =======================
      # add to /etc/fstab as one (=1) line
      # 192.168.0.200://backup/rpi/openhab /mnt/nas nfs4 rw,nolock,noauto,x-systemd.automount,x-systemd.device-timeout=5,retry=0,_netdev 0 0
      # Set Permission on your NAS: Add the RPI IP address to the NFS Host Access under Shared Folder Permissions.
      #
      # copy/create file /mnt/nas/influx_backup.sh
      # make executable sudo chmod +x /mnt/nas/influx_backup.sh
      # run manual sudo bash /mnt/nas/influx_backup.sh 10
      # schedule with sudo crontab -e with 0 3 * * * /mnt/nas/influx_backup.sh
      # create full clone to SD-card
      # rpi-clone sda -u
      # create influx copy since… (update date when on full clone)
      influxd backup -portable -since 2019-08-30T00:00:00Z /mnt/nas/influx/
      # delete all files older than retention days
      # Check to see if we got command line args
      if [ ! -z $1 ]; then
      retention_days=$1
      else
      retention_days=7
      fi
      find /mnt/nas/influx/ -mtime +$1 -exec rm {} \;
      #set time in OpenHab(ian)
      curl -X PUT –header “Content-Type: text/plain” –header “Accept: application/json” -d $(date +%Y/%m/%d-T%H:%M:%S) “http://127.0.0.1:8080/rest/items/Influx_Data/state”

      En ik moet eerlijk bekennen ik heb dit script vandaag verder geperfectioneerd toen ik erachter kwam dat het reduceren van het aantal keer dat ik mijn NAS mounte toch consequenties had. 🙂

      Beantwoorden
  • Ik ben blij met deze oplossing maar ik krijg het niet goed aan het werk.
    Ik krijg het volgende als ik het script met de hand uitvoer:

    pi@RaspDomo:/mnt/backup $ sudo ./system_backup.sh
    dd: failed to open ‘/dev/mmcblk0’: No such file or directory
    find: ‘/mnt/backup/RaspDomo.*.img’: No such file or directory
    pi@RaspDomo:/mnt/backup $

    Als ik in /dev kijk is er ook geen mmcblk0.

    Weet iemand wat ik fout doe?
    Een reactie wordt op prijs gesteld.

    Beantwoorden
  • @Bert,

    Gebruik lsblk -p om te achterhalen welk apparaat je wilt backuppen.
    Ik gebruik zelf een SSD en mijn device is sda.
    In mijn geval is de regel met dd :
    dd if=/dev/sda bs=4M | gzip -c > $backup_path/$HOSTNAME.$(date +%Y%m%d).img.gz

    Beantwoorden
  • Simpel en doeltreffend; daar hou ik wel van! 🙂 De how-to is super helder en het geheel is eenvoudig op de RPi te installeren. Tx!

    Voor de liefhebbers: op een RPi 3+ B met een 32GB Samsung Evo duurt de operatie 1 uur en 10 minuten naar een Synology DS215+ over een Gigabit netwerk.

    Beantwoorden
    • In de tussentijd is de SD kaart vervangen voor een SSD van 120GB. Dat levert een back-up op van 112 GB ondanks dat het hoofdzakelijk lege ruimte is (slechts 8GB in gebruik). Dat moet anders kunnen! En dat klopt! Het kan anders. Door de output van dd door te zetten naar GZIP kun je flink wat ruimte besparen. Bij mij is de back-up van 112GB gedaald naar 13GB. Hoe? Door in het shell script de laatste regels te vervangen voor dit:

      # Perform backup
      ## dd bs=4M conv=sparse if=/dev/sda of=$backup_path/$HOSTNAME.$(date +%Y%m%d).img
      dd bs=4M conv=sparse if=/dev/sda | gzip > $backup_path/$HOSTNAME.$(date +%Y%m%d).img.gz

      # Remove fsck trigger
      rm /boot/forcefsck

      # Delete old backups
      find $backup_path/$HOSTNAME.*.img.gz -mtime +$retention_days -type f -delete

      De laatste regel zorgt ervoor dat ook de gezipte backups netje worden verwijderd.

      Elk voordeel heb’ zijn nadeel! De back-up duurt 50% langer. Voor mij geen probleem omdat de back-up in de nacht draait.

      GUNZIP gebruik je om te restoren 😉

      Beantwoorden
      • Pffft… ik moet stoppen met het beantwoorden van mijn eigen reacties maar ja… daar ga je 😉

        De installatie van mijn Pi raakte onherstelbaar beschadigd. Tijd dus om een back-up terug te zetten. Aangezien ik mijn back-ups comprimeer is dat iets anders dan een bestandje “branden” op een SD kaart.

        Met dit commando heb ik mijn SSD van 120GB herstelt:

        gunzip –stdout “[laatste versie van de backup].img.gz” | sudo dd bs=4M of=/dev/sda

        Uiteraard zonder rechte haken. Voorbeeld: RPi3.20201020.img.gz

        En natuurlijk geldt bij het restoren ook dat het 50% langer duurt 🙁

        Beantwoorden
      • Krijg wel een gezipt bestand maar de bestand groote is het zelfde.
        en het duurt wel veel langer.

        Beantwoorden
        • Dat is vreemd! Weet je zeker dat er niet een (heel kleine) typo is jouw script zit? Als je het script bewerkt op een Windows machine dan het liefst in NotePad/Kladblok want dan komen er geen rare karakters mee waar Linux niet zo lekker mee omgaat.

          En ook even checken of jouw Pi helemaal up to date is (gzip bijvoorbeeld)

          Beantwoorden
          • ik krimp ‘m door na het backup script pi-shrink.sh vanuit de backup destination aan te roepen:
            # Shrink image
            $backup_path/pishrink.sh $backup_path/$HOSTNAME.$(date +%Y%m%d).img
            Te downloaden op https://github.com/Drewsif/PiShrink
            Het image van mijn 32 GB USB stick wordt bij mij daarmee teruggebracht tot ca 6 GB.
            Na het restoren en rebooten “unshrinkt” ie ‘m dan automatisch tot de grootte van de (nieuwe) SD kaart (of in mijn geval dus een USB stick).

          • Ik gebruik nu pishrink,dit werkt ook prima.

  • Is het ook mogelijk om de backup automatisch naar Google – OneDrive te laten gaan?

    Want dit zie ik wel heel graag gebeuren.

    Beantwoorden
    • Heb zelf zojuist liggen zoeken naar een backup oplossing voor 2 pi’s maar rclone is je antwoord. rclone kan bestanden naar clouddiensten backuppen.

      Nadeel is wel voor zover ik nu zie dat je de backup eerst elder moet opslaan op een externe usb stick/hdd of op de sd zelf.

      Beantwoorden
    • Op een Synology NAS kun je Cloud Sync gebruiken om je backup directory automatisch met een cloud provider te synchroniseren

      Beantwoorden
      • als ik de sd card formateer en de backup met windisk terugzet, start de pi niet meer op.

        end kernel panic – not syncing: no working init found try passing init =option to kernel.

        het werkte wel toen ik dit installeerde(ongeveer jaar geleden.. dacht nu na de update naar buster en domoticz laat ik het controleren of het nog werkt… maar nee dus..

        Beantwoorden
  • sudo mount.cifs //192.168.1.199/Backup/Backup_Raspberry_Pi /mnt/backup -o user=naam,pass=wachtwoord,sec=ntlmssp,uid=1000,gid=46
    Op naam en wachtwoord staan de werkelijke inlognaam en wachtwoord
    Dan krijg ik:
    mount error(16): Device or resource busy
    Refer to the mount.cifs(8) manual page (e.g. man mount.cifs)
    sudo mount-a
    mount: /etc/fstab: parse error at line 6 — ignored

    Beantwoorden
  • Hoe controleer je de voortgang van een lopende backup?

    Beantwoorden
  • Het creeren van de .img file gaat bij mij prima. Echter als ik deze probeer te writen naar een SD kaartje krijg ik de melding dat de image file corrupt is. Enig idee waar dit aan kan liggen?

    Beantwoorden
  • Alles werkt prima en het restoren van backups gaat prima. Maar ik kan (uit ervaring) vertellen dat je SQLite databse van Domoticz corrupt raakt als je ondertussen Domoticz gewoon blijft gebruiken. Niet zo heel gek natuurlijk want je file wordt stukje voor stukje weggeschreven en als er dan ondertussen iets verandert in je DB file, is de consistentie niet meer te garanderen.

    Het stoppen van Domoticz is natuurlijk een optie maar dan is het ruim een uur niet beschikbaar en dat kan vervelend zijn als je allerlei sensoren monitort. Een andere optie is vlak voor de backup even je db kopieren (cp domoticz/domoticz.db domoticz/domoticz.db.bakup). Dat duurt paar seconde en levert een stabiele backup van je DB op. Mocht je dan een keer je image terug moeten zetten, kun je direct na de restore Domoticz even stoppen en de backup van je DB terug zetten. En klaar is Kees.

    Beantwoorden
  • Copitano

    Ha Gijs,
    Vraagje n.a.v. je laatste post.
    Als je de db kopieert en na de backup terug zet ben je toch ook de data kwijt gedurende de backup?
    Of laat je domoticz dan wel gewoon doorlopen tijdens de backup?
    Co

    Beantwoorden
  • Misschien een domme vraag, maar hoe krijg ik deze backup (als dat ooit nodig is) terug op de raspi?

    Beantwoorden
  • Hallo,

    weet iemand hoe ik deze melding kan oplossen?
    mount: /etc/fstab: parse error at line 1 — ignored
    mount: /etc/fstab: parse error at line 2 — ignored
    mount: /etc/fstab: parse error at line 7 — ignored

    Beantwoorden
    • //192.168.2.157/Backups/Backup_Raspberry_Pi /mnt/backup cifs comment=systemd.automount,defaults,rw,username=pietje,password=puk,uid=1000,gid=46 0 0

      Beantwoorden
  • Getest en werkt goed, ook IMG bestand teruggezet met “USB Image Tool” op SD kaart en werkt.
    Alleen het automatische mounten na een reboot ging niet goed.
    Doordat mijn NAS server (OMV) op dezelfde PI staat was deze nog niet opgestart.
    Daarom in crontab volgende toegevoegd. @reboot sleep 20 && sudo mount -a
    Dit zorgt ervoor dat na 20sec pas de boel mount na reboot zodat de NAS server de tijd krijgt
    op te starten.

    Beantwoorden
  • Hallo! Ik krijg een foutmelding als ik het script probeer te downloaden dat het IP adres is gemarkeerd wegens mogelijke veiligheidsschendingen. Maar dat is niet mijn ip adres.

    Beantwoorden
  • Ik draai een pi4 met ssd.

    Als ik het script manueel uitvoer (sudo mnt/backup//system_backup.sh), krijg ik onderstaande foutmelding:

    dd: openen van ‘/dev/mmcblk0’ is mislukt: Bestand of map bestaat niet
    find: ‘/mnt/backup/raspberrypi.*.img’: Bestand of map bestaat niet

    Als ik df doe op de Rpi, zie ik dat de share beschikbaar is met voldoende ruimte

    Beantwoorden
    • probleem opgelost! Helaas is mijn eigen stommiteit blijvend

      Beantwoorden
  • Bij mij worden de oude backups netjes in een “recycle bin” binnen de backup map gezet…dus niet echt verwijderd. Enig idee hoe ze echt te verwijderen? Weet niet zo goed hoe ik de laatste regel van het script moet aanpassen. Zou het iets zijn met -rm…enig hulp zou fantastisch zijn :))

    Beantwoorden
  • Tof scriptje. Werkt goed hier. Ik merk alleen dat de CIFS verbinding van de Pi naar de NAS actief blijft tot een reboot van één van beide. Is er nog iets wat ik toe kan voegen aan het script om die verbinding direct na de backup te verbreken?

    Beantwoorden
  • Als ik sudo mount -a doe krijg ik een parse error in line 6 (the line starting with //192.168.0.10)

    Beantwoorden
  • Hulde!

    Wie weet mij misschien te vertellen :

    Ik heb dit script altijd goed draaien gehad ; Maar mijn raspberry draait nu op een externe SSD zonder sd card.
    Ik heb dus geen /dev/mmcblk0 ; maar verschillende partities.
    Hoe kan nu de gehele ssd disk aangeven als input?

    Beantwoorden
    • Hi Mike,

      Je kunt dat eenvoudig uitvogelen door in een terminal sudo mount uit te voeren. Mijn SSD heeft als device /dev/sda. De active partitie is bij mij sda2.

      Het commando ziet er bij mij als volgt uit:

      dd bs=4M conv=sparse if=/dev/sda of=$backup_path/$HOSTNAME.$(date +%Y%m%d).img

      Succes!

      Beantwoorden
  • Is het ook mogelijk om scriopt aan te passen zodat er ipv elke dag, eens per week een backup wordt gemaakt en zoja, hoe ?

    Beantwoorden
  • Paar dagen geleden na 2 jaar nieuwe poging gedaan om dit te installeren. Deze keer geen foutmeldingen. Echter wordt er niks gebackupt. Heb geprobeerd om script handmatig te starten maar dan krijg ik de melding : must run from root. Dit vind ik raar, want ik heb exact dezelfde map gemaakt zoals in de beschrijving namelijk /mnt/backup en daar script in gekopieerd. Vervolgens is script automatisch ook naar backup map op nas gekopieerd,geen idee waarom ?! Wie kan me op weg helpen om dit werkend te krijgen of op zijn minst dat ik kan controleren of het script zijn werk doet ??

    Beantwoorden
  • heb je wel gerunt met sudo.
    en de mappen.bestanden op 755 gezet?

    Beantwoorden
  • is het ook mogelijk om alleen een bepaalde directory te backuppen ipv de hele kaart?

    Beantwoorden
  • In de volgende regel van de auteur van dit topic zit een klein foutje.
    //192.168.2.157/Backups/Backup_Raspberry_Pi /mnt/backup cifs comment=systemd.automount,defaults,rw,username=pietje,password=puk,uid=1000, gid=46 0 0
    Voor de gid=46 staat een spatie
    //192.168.2.157/Backups/Backup_Raspberry_Pi /mnt/backup cifs comment=systemd.automount,defaults,rw,username=pietje,password=puk,uid=1000,gid=46 0 0
    De laatste regel is de juiste scheelt een hoop zoekwerk voor velen..

    Beantwoorden

Laat een antwoord achter aan Gijs Reactie annuleren

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *