Quantcast
Aktuelles
Digital Eliteboard - Das Digitale Technik Forum

Registriere dich noch heute kostenlos, um Mitglied zu werden! Sobald du angemeldet bist, kannst du auf unserer Seite aktiv teilnehmen, indem du deine eigenen Themen und Beiträge erstellst und dich über deinen eigenen Posteingang mit anderen Mitgliedern unterhalten kannst! Zudem bekommst du Zutritt zu Bereichen, welche für Gäste verwehrt bleiben

Registriere dich noch heute kostenlos, um Mitglied zu werden! Sobald du angemeldet bist, kannst du auf unserer Seite aktiv teilnehmen, indem du deine eigenen Themen und Beiträge erstellst und dich über deinen eigenen Posteingang mit anderen Mitgliedern unterhalten kannst! Zudem bekommst du Zutritt zu Bereichen, welche für Gäste verwehrt bleiben

Sicherung einer kompletten SD-Card (USB) auf einem QNap

marc1974

Freak
Registriert
13. November 2016
Beiträge
251
Reaktionspunkte
34
Punkte
88
Immer wieder suchte ich eine Möglichkeit meinen USB-Stick oder meine SD-Card vom Raspberry schnell und einfach zu sichern. Meistens mußte man dazu die Karte oder den Stick auf einem anderen PC einlesen (unter Windows WinDiskImager).
Da mir das alles zu fummelig war und der Raspberry auch während dieser Zeit nicht genutzt werden kann, hier mal ein HowTo um den Raspberry im laufenden Betrieb zu sichern.
Dazu gibt es natürlich auch raspiBackup...aber dies hier war einfach umzusetzen.
Wahrscheinlich ist das auch adaptierbar auf ner Fritzbox oder Synology:

Gelöst habe ich das ganze durch Anlage eines NFS Verzeichnisses auf dem QNap.
Hierzu muß zuerst der Dienst NFS auf dem QNap gestartet werden. Systemsteuerung!
Du musst Regestriert sein, um das angehängte Bild zusehen.


Hierzu lege ich über die Systemsteuerung des QNap zuerst ein Verzeichnis RaspberrySicherung auf dem entfernten NAS (hier Qnap an) Dazu klicken wir auf Erstellen und geben dem Orner den Namen RaspberrySicherung
Du musst Regestriert sein, um das angehängte Bild zusehen.


danach habe ich extra einen Benutzer Raspberry in der Systemsteuerung erstellt
Du musst Regestriert sein, um das angehängte Bild zusehen.


um ihm im nächsten Schritt explizit nur einen Zugriff auf dieses Verzeichnis zu geben - Dies gelingt nach dem Erstellen des Benutzers "Raspberry" durch einen Klick auf die Symbole rechts (Freigabeordner):
Du musst Regestriert sein, um das angehängte Bild zusehen.

Wir geben dem User Raspberry quasi einen Zugriff Lesen/Schreiben auf den Ordner RaspberrySicherung

Jetzt sind der Orner und der User angelegt und wir können uns nun auf die Einrichtung von NFS auf dem Raspberry kümmern.
Hierzu erstellen wir im Verzeichnis /mnt die gewünschte Ordnerstruktur

sudo mkdir -p /mnt/nas/Qnap

Danach öffnen wir fstab mit

sudo nano /etc/fstab
und fügen folgende Zeile ein am Ende ein, um das Verzeichnis für NFS später zu mounten

//192.xxx.xxx.xxx/RaspberrySicherung /mnt/nas/Qnap cifs username=Raspberry,password=deinpasswort,_netdev,x-systemd.automount

gefolgt von

sudo mount -a

Überprüfen können wir nun mit:
ls -la /mnt/nas/Qnap

Scheint funktioniert zu haben, oder?
Qnap und Raspberry haben jetzt zumindest ein gemeinsames Verzeichnis und können aufeinander zugreifen.

Jetzt benötigen wir ein Script, welches den Backupprozess startet. Das habe ich mir im Netz geschnappt und meinen Bedingungen angepasst. Ich habe einen USB Stick und sichere den kompletten Stick während des Betriebs auf dem NAS.

Wir erstellen nun eine Datei mit dem Namen "BackupScript.sh" in /home/pi/backup
und fügen folgendes ein:

#!/bin/bash

SUBDIR=raspberrypi_backup
DIR=/mnt/nas/Qnap/$SUBDIR

echo "Starting RaspberryPI backup process!"

# First check if pv package is installed, if not, install it first
PACKAGESTATUS=`dpkg -s pv | grep Status`;

if [[ $PACKAGESTATUS == S* ]]
then
echo "Package 'pv' is installed."
else
echo "Package 'pv' is NOT installed."
echo "Installing package 'pv'. Please wait..."
apt-get -y install pv

# Check if backup directory exists
if [ ! -d "$DIR" ];
then
echo "Backup directory $DIR doesn't exist, creating it now!"
mkdir $DIR

# Create a filename with datestamp for our current backup (without .img suffix)
OFILE="$DIR/backup_$(date +%Y%m%d_%H%M%S)"

# Create final filename, with suffix
OFILEFINAL=$OFILE.img

# First sync disks
sync; sync

# Shut down some services before starting backup process
echo "Stopping some services before backup."
service apache2 stop
service cron stop

# Begin the backup process, should take about 1 hour from 8Gb SD card to HDD
echo "Backing up USB to QNap."
echo "This will take some time depending on your USB size and read performance. Please wait..."
SDSIZE=`blockdev --getsize64 /dev/sda`;
pv -tpreb /dev/sda -s $SDSIZE | dd of=$OFILE bs=1M conv=sync,noerror iflag=fullblock

# Wait for DD to finish and catch result
RESULT=$?

# Start services again that where shutdown before backup process
echo "Start the stopped services again."
service apache2 start
service cron start
If command has completed successfully, delete previous backups and exit
if [ $RESULT = 0 ];
then
echo "Successful backup, previous backup files will be deleted."
rm -f $DIR/backup_*.tar.gz
mv $OFILE $OFILEFINAL
echo "Backup is being tarred. Please wait..."
#tar zcf $OFILEFINAL.tar.gz $OFILEFINAL
#rm -rf $OFILEFINAL
echo "RaspberryPI backup process completed! FILE: $OFILEFINAL"
exit 0
Else remove attempted backup file
else
echo "Backup failed! Previous backup files untouched."
echo "Please check there is sufficient space on the HDD."
rm -f $OFILE
echo "RaspberryPI backup process failed!"
exit 1

Angepasst werden mussten: SUBDIR und DIR, sowie Textausgaben und sda für den USB Stick, sowie services, welche während des Backupprozesses gestoppt und nachher wieder gestartet werden müssen - und ob das file .tar gepackt werden soll.

Wenn ihr eine SD-Karte nutzt müßt ihr sda durch den Devicenamen eurer SD-Karte ergänzen.
Dann wird Zeile 52 in
pv -tpreb /dev/mmcblk0 -s $SDSIZE | dd of=$OFILE bs=1M conv=sync,noerror iflag=fullblock
geändert.

Das Script kann nun nach
chmod 777 /home/pi/backup/BackupScript.sh
mit
sudo ./BackupScript
direkt ausprobiert, oder aber in die crontab mit

sudo crontab -e
automatisiert werden.

Hierzu ist dann folgende Zeile einzufügen:
PATH=/usr/sbin:/usr/bin:/sbin:/bin
01 03 * * 1,7 /home/pi/backup/BackupScript.sh >>/home/pi/backup/sicherung 2>&1
Eine Minute nach 3 an jedem Tag im Monat, in jedem Monat am Tag 1 und 7 der Woche das Script ausführen.
/home/pi/backup/sicherung 2>&1 erstellt eine Sicherung im angegebenen Ordner.

Das Ergebnis ist eine IMG-Datei auf dem NAS - also dem gemounteten Ordner auf dem Raspi, den man mit Win32Diskimager jederzeit zurückschreiben kann.

Was mir momentan noch fehlt ist die Löschung der alten Datei - dafür brauche ich nun kurz einen Linux-Fuchs von hier ;-)
 

Anhänge

Du musst angemeldet sein, um die Anhangsliste zu sehen.
Zuletzt bearbeitet:
Hallo Marc1974 vielen Dank für die Anleitung und hatte heute endlich mal Zeit gefunden, das nach zu machen.

Ähnliche Voraussetzung nur Sd Karte im Raspi und eine Synology.

Soweit so gut, aber irgendwo ist bei mir wohl der Wurm drin, denn ich bekomme folgende Meldung beim starten des Scripts:

Code:
pi@raspberrypi:~/backup $ sudo ./BackupScript.sh          
Starting RaspberryPI backup process!
./BackupScript.sh: Zeile 70: Syntax Fehler: Unerwartetes Dateiende.


Hier meine
#!/bin/bash

SUBDIR=RaspberrySicherung
DIR=/mnt/nas/Synology/$SUBDIR

echo "Starting RaspberryPI backup process!"

# First check if pv package is installed, if not, install it first
PACKAGESTATUS=`dpkg -s pv | grep Status`;

if [[ $PACKAGESTATUS == S* ]]
then
echo "Package 'pv' is installed."
else
echo "Package 'pv' is NOT installed."
echo "Installing package 'pv'. Please wait..."
apt-get -y install pv

# Check if backup directory exists
if [ ! -d "$DIR" ];
then
echo "Backup directory $DIR doesn't exist, creating it now!"
mkdir $DIR

# Create a filename with datestamp for our current backup (without .img suffix)
OFILE="$DIR/backup_$(date +%Y%m%d_%H%M%S)"

# Create final filename, with suffix
OFILEFINAL=$OFILE.img

# First sync disks
sync; sync

# Shut down some services before starting backup process
echo "Stopping some services before backup."
service apache2 stop
service cron stop

# Begin the backup process, should take about 1 hour from 8Gb SD card to HDD
echo "Backing up USB to Synology."
echo "This will take some time depending on your SD size and read performance. Please wait..."
SDSIZE=`blockdev --getsize64 /dev/sda`;
pv -tpreb /dev/mmcblk0 -s $SDSIZE | dd of=$OFILE bs=1M conv=sync,noerror iflag=fullblock

# Wait for DD to finish and catch result
RESULT=$?

# Start services again that where shutdown before backup process
echo "Start the stopped services again."
service apache2 start
service cron start
If command has completed successfully, delete previous backups and exit
if [ $RESULT = 0 ];
then
echo "Successful backup, previous backup files will be deleted."
rm -f $DIR/backup_*.tar.gz
mv $OFILE $OFILEFINAL
echo "Backup is being tarred. Please wait..."
#tar zcf $OFILEFINAL.tar.gz $OFILEFINAL
#rm -rf $OFILEFINAL
echo "RaspberryPI backup process completed! FILE: $OFILEFINAL"
exit 0
Else remove attempted backup file
else
echo "Backup failed! Previous backup files untouched."
echo "Please check there is sufficient space on the HDD."
rm -f $OFILE
echo "RaspberryPI backup process failed!"
exit 1

Freue mich über Hilfe ,weil ich diese Idee einfach genial finde.

Mfg holgi82
 
Hast du dem Script die ausreichenden Rechte gegeben? Probiere mal chmod 777 oder aber, wenn es nicht läuft den pi als Eigentümer aufzunehmen.
Anbei mal mein Script...Syntax bedeutet ja eher da ist irgendwas falsch vom Wortlaut:

#!/bin/bash
SUBDIR=raspberrypi_backup
DIR=/mnt/nas/Qnap/$SUBDIR

echo "Starting RaspberryPI backup process!"

# First check if pv package is installed, if not, install it first
PACKAGESTATUS=`dpkg -s pv | grep Status`;

if [[ $PACKAGESTATUS == S* ]]
then
echo "Package 'pv' is installed."
else
echo "Package 'pv' is NOT installed."
echo "Installing package 'pv'. Please wait..."
apt-get -y install pv
fi

# Check if backup directory exists
if [ ! -d "$DIR" ];
then
echo "Backup directory $DIR doesn't exist, creating it now!"
mkdir $DIR
fi
#Delete Dir
rm -f $DIR/backup_*.*
# Create a filename with datestamp for our current backup (without .img suffix)
OFILE="$DIR/backup_$(date +%Y%m%d_%H%M%S)"

# Create final filename, with suffix
OFILEFINAL=$OFILE.img

# First sync disks
sync; sync

# Shut down some services before starting backup process
echo "Stopping some services before backup."
service apache2 stop
service cron stop

# Begin the backup process, should take about 1 hour from 8Gb SD card to HDD
echo "Backing up USB to QNap."
echo "This will take some time depending on your USB size and read performance. Please wait..."
SDSIZE=`blockdev --getsize64 /dev/sda`;
pv -tpreb /dev/sda -s $SDSIZE | dd of=$OFILE bs=1M conv=sync,noerror iflag=fullblock

# Wait for DD to finish and catch result
RESULT=$?

# Start services again that where shutdown before backup process
echo "Start the stopped services again."
service apache2 start
service cron start

#If command has completed successfully, delete previous backups and exit
if [ $RESULT = 0 ];
then
echo "Successful backup, previous backup files will be deleted."
rm -f $DIR/backup_*.tar.gz
mv $OFILE $OFILEFINAL
echo "Backup is being tarred. Please wait..."
#tar zcf $OFILEFINAL.tar.gz $OFILEFINAL
# rm -rf $OFILEFINAL
echo "RaspberryPI backup process completed! FILE: $OFILEFINAL"
exit 0
# Else remove attempted backup file
else
echo "Backup failed! Previous backup files untouched."
echo "Please check there is sufficient space on the HDD."
rm -f $OFILE
echo "RaspberryPI backup process failed!"
exit 1

Zum Ändern NUR Notepad++ verwenden, wenn Du windows benutzt!
 
Zuletzt bearbeitet:
Hallo marc1974,

Habe alles am Pi gemacht über nano.... chmod777 ebenfalls gemacht. ich benutze am Pc Windows aber bei solchen Sachen notepad++. Somit alles vorhanden. Ich mache einfach das Script nochmal über notepad++ und teste alles neu.

Vielen Dank für deine Hilfe ;-)
Holgi82
 
So es gibt Neuigkeiten.

Eben nochmal alles über Notepad++ gemacht, dann kam folgende Fehlermeldung: /bin/bash^M. Da ich nicht wirklich programmieren kann und ich in Sachen Linux ein absoluter Anfänger bin, befragte ich google, was mir sagte das irgendwie windows Zeilenendungen reingekommen sind.

Nochmals wie beim ersten mal alles über putty reingemacht in das BackupScript und siehe da es läuft.

Es wurde das Backup auf meiner Synology gespeichert, mußte es nur noch zu .img umbenennen und ich hab ein fertiges Image.

Obwohl alles durchlief stand bei Putty dennoch dieser Fehler drin:
Code:
Starting RaspberryPI backup process!
Package 'pv' is installed.
Stopping some services before backup.
Warning: Unit file of apache2.service changed on disk, 'systemctl daemon-reload'                                                                                         recommended.
Backing up USB to Synology.
This will take some time depending on your USB size and read performance. Please                                                                                         wait...
14,8GiB 0:22:42 [11,2MiB/s] [========================================================================================================================>] 100%
15193+1 Datensätze ein
15194+0 Datensätze aus
15932063744 Bytes (16 GB) kopiert, 1370,72 s, 11,6 MB/s
Start the stopped services again.
Warning: Unit file of apache2.service changed on disk, 'systemctl daemon-reload' recommended.
./BackupScript.sh: Zeile 74: Syntax Fehler: Unerwartetes Dateiende

Was aber denke ich nicht weiter tragisch sein sollte.
Vielen Dank für diese tolle Idee und gute Beschreibung. Würde nochmal einen Danke Button drücken, geht aber leider nicht :happy-emoji:

MfG Holgi82
 
Ich vermute mal, dass hier eine 1:1 Kopie der SD Karte / USB Stick gemacht wird?

Das Skript nimmt daher denke ich den vollen Platz der SD Karte auf dem NAS ein.

Als kleine Erweiterung kann ich noch PiShrink empfehlen. PiShrink verkleinert das Image auf nur die benötigte Größe.
So kann schnell aus einer 32GB Karte ein 2 GB Image erstellt werden. Nimmt nicht nur weniger Platz ein zum Speichern, sondern so kann man dieses Image auch auf einer kleineren SD Karte wiederherstellen.

Nur so als kleine Ergänzung
 
Zurück
Oben