In dem letzten Artikel zu dem Thema raspiBackup habe ich kurz mein Vorgehen beschrieben, um meine Raspberry’s automatisch zu sichern. Da bei dem Pi das Restore relativ einfach ist (Austausch SD-Karte), habe ich natürlich mein neues Backup direkt versucht wiederherzustellen. Leider kam direkt ein Fehler, dass die SD-Karte zu klein wäre. Ich habe 2 x 32GB SD-Karten die nicht wirklich identisch groß sind. Die eine ist ca. 29,4 GB und die andere 29,8 GB. Ich habe zu dem Problem kurz mit dem Entwickler gesprochen und dabei kam heraus, dass ich nicht der einzige bin, der dieses Problem hat. Leider gibt es im Script noch keine Funktion die Größe anzupassen. Daher habe ich ein eigenes Wrapperscript zur Wiederherstellung eines rsync Backups geschrieben. Dieses Script setze ich auf einem kleinen System ein, welches nur für die Wiederherstellung der Pi’s gedacht ist.
Fehler – Die Ziel SD Karte ist zu klein
root@backup-pi:~# raspiBackup.sh -d /dev/sda /media/nas/backup/rsync-wz/pi/pi-rsync-backup-20160710-231219 --- RBK0009I: backup-pi: raspiBackup.sh V0.6.1.2 um Tue 12 Jul 23:43:04 BST 2016 gestartet --- RBK0128I: Logdatei ist /root/raspiBackup.log --- RBK0116I: Konfigurationsd atei /usr/local/etc/ raspiBackup.con f wird benutzt ??? RBK0105E: Die Ziel SD Karte ist zu klein. Minimum erforderlich: 32009355264 bytes - Verfügbar: 31674335232 bytes
Wrapperscript – raspiBackupRestore
Die oberen Zeilen sollten auf die aktuellen Gegebenheiten angepasst werden.
#Config autoMount=true localMountPoint="/media/nas/backup" ipNAS="192.168.xxx.xxx" shareNAS="backup" backupName="pi-backup"
Solltet die Automountfunktion genutzt werden, müssen die Zeilen 2-5 angepasst werden. Allerdings habe ich gemerkt, dass es nicht wirklich praktisch ist, weil die Autovervollständigung ja nicht funktioniert, wenn das Verzeichnis noch nicht eingegangen ist. Aber vielleicht hat der Entwickler durch diesen Beitrag ja eine gute Idee, um die Verkleinerungsfunktion direkt in sein Script einzubauen.
Auf meinem NAS habe ich eine NFS Freigabe eingerichtet, um das rsync Backup nutzen zu können.
Zeile 3 ist der lokale Mountpunkt auf dem Backupsystem.
Zeile 4 ist die IP des NAS, auf dem die Backups gespeichert sind und auf dem der NFS Server läuft.
Zeile 5 ist das freigegebene NFS Verzeichnis auf dem NAS.
[adrotate banner=“1″]
Die Zeile 7 ist auf jeden fall anzupassen. Das ist der Name des gesicherten Pi’s mit angehängten „-backup“. Ich habe einfach mal in die Verzeichnis Struktur von raspiBackup geschaut, um die genaue Bezeichnung herauszufinden.
So, genug geschrieben, unten ist das Script zum kopieren und anpassen und hier ist der direkte Download. Nach dem Download das .txt entfernen und ausführbare Rechte vergeben. Ich habe es in /usr/local/bin/raspiBackupRestore gespeichert.
mv ./raspiBackupRestore.txt /usr/local/bin/raspiBackupRestore chmod 755 /usr/local/bin/raspiBackupRestore
Der Aufruf des Scripts ist ähnlich dem von raspiBackup.
raspiBackupRestore /dev/sda /media/nas/backup/rsync-wz/pi/pi-rsync-backup-20160710-231219
Script
#!/bin/bash # # # Dieser Code enthält Codeteile aus # https://www.linux-tips-and-tricks.de/raspiBackup.sh # Copyright (C) 2013-2016 framp at linux-tips-and-tricks dot de #Config autoMount=true localMountPoint="/media/nas/backup" ipNAS="192.168.233.2" shareNAS="backup" backupName="pi-backup" ###### function calcSumSizeFromSFDISK() { # sfdisk file name local file="$1" local partitionregex="${dev}[p]?([0-9]+).*start=[^0-9]*([0-9]+).*size=[^0-9]*([0-9]+).*Id=[^0-9a-z]*([0-9a-z]+)" local sumSize=0 while read line; do if [[ -z $line ]]; then continue fi if [[ $line =~ $partitionregex ]]; then local p=${BASH_REMATCH[1]} local start=${BASH_REMATCH[2]} local size=${BASH_REMATCH[3]} local id=${BASH_REMATCH[4]} if [[ $id == 85 || $id == 5 ]]; then continue fi if [[ $sumSize == 0 ]]; then sumSize=$((start+size)) else (( sumSize+=size )) fi fi done < $file (( sumSize *= 512 )) echo "$sumSize" } function restoreSdCard () { echo "Backup......" /usr/local/bin/raspiBackup.sh -d $restoreDev $rootPathOfBackup } function readAnswer() { read -p "Vorgang fortsetzen? ([j]a/[n]ein)" answer answer=${answer:0:1} # first char only answer=${answer:-"n"} # set default no if [ "$answer" != "j" ];then exit 10 fi } function correctSFdisk () { local partitionregex="${dev}[p]?([0-9]+).*start=[^0-9]*([0-9]+).*size=[^0-9]*([0-9]+).*Id=[^0-9a-z]*([0-9a-z]+)" local lineNo=0 local sumSize=0 tac $rootPathOfBackup/${backupName}.sfdisk| while read line; do (( lineNo++ )) if [[ -z $line ]]; then continue fi if [[ $line =~ $partitionregex ]]; then local p=${BASH_REMATCH[1]} local start=${BASH_REMATCH[2]} local size=${BASH_REMATCH[3]} local id=${BASH_REMATCH[4]} if [[ $id == 85 || $id == 5 ]]; then continue fi if [[ $start == 0 ]]; then continue else sizeRestoreSdCardSectors=$(blockdev --getsz $restoreDev) newSizeLastPartition=$(( $sizeRestoreSdCardSectors - $start )) sed -i'.rBR.org' "s/$size/$newSizeLastPartition/g" $rootPathOfBackup/${backupName}.sfdisk break fi fi done } #main # if [ $# != 2 ]; then echo -e "\nUSAGE: $(basename $0) <BLOCKDEVICE TO RESTORE> <PATH TO raspiBackup Dir>\n" exit 1 fi if [ $autoMount ]; then if [ ! -d ${localMountPoint} ]; then mkdir -p ${localMountPoint} fi if [ $(mount | grep -i "$localMountPoint" | wc -l) != "1" ]; then mount.nfs ${ipNAS}:/${shareNAS} ${localMountPoint} if [ $? != 0 ]; then echo "Mount fehlerhaft!!!" fi fi fi rootPathOfBackup="$2" restoreDev=$1 if [ ! -f $rootPathOfBackup/$backupName.sfdisk ] || [ ! -f $rootPathOfBackup/$backupName.fdisk ]; then echo "$rootPathOfBackup/$backupName.sfdisk $rootPathOfBackup/$backupName.fdisk" echo -e "\nKein Backupverzeichniss oder kein Backup mit dem Namen $backupName gefunden." exit 3 fi sizeOrginalSdCard=$(calcSumSizeFromSFDISK $rootPathOfBackup/${backupName}.sfdisk|sed 's/^[ \t]*//;s/[ \t]*$//') sizeRestoreSdCard=$(blockdev --getsize64 $restoreDev|sed 's/^[ \t]*//;s/[ \t]*$//') if (( $sizeOrginalSdCard > $sizeRestoreSdCard )); then sizeRestoreSdCardGB=$(($sizeRestoreSdCard / 1024 / 1024 / 1024)) echo "Backup wird auf $restoreDev wiederhergestellt. Dieses Device ist ca. $sizeRestoreSdCardGB GB gross." readAnswer correctSFdisk #correct Fdisk sed -i'.rBR.org' "s/$sizeOrginalSdCard/$sizeRestoreSdCard/g" $rootPathOfBackup/pi-backup.fdisk restoreSdCard else readAnswer restoreSdCard fi