Ich möchte euch hier ein kleines Script vorstellen mir dem ihr automatisiert Daten vom RaspberryPI in ein NAS-Speicher schreibt
In meinem letzten Artikel Eigenbau NAS habe ich euch gezeigt wie ihr ein NAS mit einem RaspberryPI realisieren könnt. Jetzt gehen wir einen Schritt weiter und schreiben automatisiert Daten in das NAS
User Berechtigungen ändern
um einen Transfer der Daten benötigen wir zunächst ein bash-script backup.sh um die gepackten Dateien in das NAS zu transportieren.
Hierzu loggen wir uns per ssh auf unseren RaspberryPI ein. Wir benutzen putty.
Als erstes wird die Datei /etc/sudoers bearbeitet. Hierfür verwenden wir entweder den Linuxeditor vi oder den visudo. Der visudo ist von der Handhabung ähnlich wie der nano.
sudo visudo
Hier sucht man die Zeilen mit dem Inhalt:
# User privilege specification %sudo ALL=(ALL:ALL) ALL
und ergänzt direkt darunter den folgenden Inhalt
usr ALL=(ALL) NOPASSWD: ALL
Mit ctrl+o und Enter werden die Änderungen gespeichert und mit ctrl+x wird der Editor wieder verlassen.
Damit die Änderungen aktiv werden, sollte ein Neustart ausgeführt werden.
sudo reboot
Nun müssen noch weitere Packages nachinstalliert werden damit künftig die Daten auf dem NAS transportiert werden können.
sudo apt-get update && sudo dpkg --configure -a && sudo apt-get -f install && sudo apt-get -y install cifs-utils curl libcurl3
Backup-Script
nun wird das Backup-Script erstellt. Hierzu folgender Code:
sudo touch /home/pi/backup.sh && sudo chmod 700 /home/pi/backup.sh && sudo chown -R usr:root /home/pi/backup.sh
#!/bin/bash mountIp="192.168.3.10" mountDir="backup" mountUser="admin" mountPass="password" mountSubDir="/home/pi" localMountPoint="/Q/backup" #optional backupsMax="0" localBackupDir="/backup" pushoverUser="" pushoverToken="" ################################### if [ ! -e "$localBackupDir" ] then echo "$localBackupDir wird erstellt" mkdir -p "$localBackupDir" else echo "$localBackupDir bereits vorhanden" fi tar --exclude=backup -cvzf "/$localBackupDir/$(date +%y%m%d_%H%M%S)_backup.tar.gz" "/home/pi" &>/dev/null if ! ping -c 1 $mountIp then echo "$mountIp nicht erreichbar, stop" exit else echo "$mountIp erreichbar" fi localIp=$(hostname -I|sed 's/\([0-9.]*\).*/\1/') if [ ! -e "$localMountPoint" ] then echo "$localMountPoint wird erstellt" mkdir -p "$localMountPoint" else echo "$localMountPoint bereits vorhanden" fi if [ "$(ls -A $localMountPoint)" ] then echo "$localMountPoint nicht leer, kein Mounten notwendig" else echo "$localMountPoint leer, Mounten starten" vorhanden="0" while read line do mountComplete="//$mountIp/$mountDir $localMountPoint cifs username=$mountUser,password=$mountPass,iocharset=utf8,sec=ntlm 0 0" echo "mountComplete: $mountComplete" if [ `echo "$line" | grep -c "$mountComplete"` != 0 ] then echo "/etc/fstab: Eintrag bereits vorhanden: $mountComplete" vorhanden="1" break fi done < "/etc/fstab" if [ "$vorhanden" != "1" ] then echo "/etc/fstab: Eintrag wird ergänzt: $mountComplete" echo "$mountComplete" >> "/etc/fstab" fi echo "Mounts werden aktualisiert" mount -a sleep 3 fi if [ "$(ls -A $localMountPoint)" ] then if [ ! -e "$localMountPoint/$mountSubDir/$localIp" ] then mkdir -p "$localMountPoint/$mountSubDir/$localIp" else echo "$localMountPoint/$mountSubDir/$localIp existiert bereits" fi find "$localBackupDir" -name '*backup.tar.gz' | while read file do fileSize="0" fileSizeMB=$(du -h $file) fileSizeMB=${fileSizeMB%%M*} filename=${file##*/} echo "$filename ($fileSizeMB MB) wird in den Backupordner verschoben" #mv "$file" "$localMountPoint/$mountSubDir/$localIp/$filename" cp "$file" "$localMountPoint/$mountSubDir/$localIp/$filename" rm "$file" echo "Backup backup $filename" echo " backupMB $fileSizeMB" done else echo "Mounten hat anscheinend nicht geklappt, skip." exit fi #Löschen alter Backups if [[ "$backupsMax" != "" && "$backupsMax" != "0" ]] then backupsCurrent=`ls -A "$localMountPoint/$mountSubDir/$localIp" | grep -c "_backup.tar.gz"` backupsDelete=$(($backupsCurrent-$backupsMax)) if [ "$backupsDelete" -gt "0" ] then echo "$backupsCurrent Backups vorhanden - nur $backupsMax aktuelle Backups werden vorgehalten - $backupsDelete Backups werden gelöscht" ls -d "/$localMountPoint/$mountSubDir/$localIp/"* | grep "_backup.tar.gz" | head -$backupsDelete | xargs rm else echo "$backupsCurrent Backups vorhanden - bis $backupsMax aktuelle Backups werden vorgehalten" fi backupsCurrent=`ls -A "$localMountPoint/$mountSubDir/$localIp" | grep -c "_fhem_backup.tar.gz"` echo "Mount wieder unmounten" umount "$localMountPoint"
Dabei muss jeder die Werte am Anfang des Scripts:
mountIp=“192.168.3.10″
mountUser=“admin“
mountPass=“password“
mountDir=“backup“
mountSubDir=“/home/pi“
mit den Login-Daten des eigenen NAS anpassen. In diesem Beispiel wird vorausgesetzt, dass eine Freigabe namens „backup“ auf dem NAS zur Verfügung steht, welche vom Benutzer „admin“ per cifs (Windows Freigabe) zugegriffen werden kann.
Der Eintrag:
localMountPoint=“/M/R_Daten“
ist das lokale Verzeichnis auf dem Linux-System, welche auf die NAS-Freigabe verlinkt.NAS