FHEM Backup, Mounten CIFS funktioniert nicht

Begonnen von sxx128, 20 April 2020, 07:36:37

Vorheriges Thema - Nächstes Thema

sxx128

Hallo zusammen,

ich hab mir die halbe die Nacht um die Ohren geschlagen und komme nicht weiter. Ziel ist es ein automatisiertes Backup von FHEM jede Nacht durchzuführen. Gehalten habe ich mich an folgende Anleitung:

https://www.meintechblog.de/2015/05/fhem-howto-automatisches-backup-auf-externem-nas/

und folgendes BackupScript das ich an meine Bedingungen angepasst habe:



#!/bin/bash

mountIp="192.168.2.3"
mountDir="fhembackup"
mountUser="fhem"
mountPass="meinpasswort"
mountSubDir="rpi/fhem"
localMountPoint="/Q/backup"

#optional
backupsMax="0"
localBackupDir="/backup"
pushoverUser=""
pushoverToken=""
###################################

perl /opt/fhem/fhem.pl 7072 "setreading FHEM.Backup info backup starting now"

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)_fhem_backup.tar.gz" "/opt/fhem" &>/dev/null

if ! ping -c 1 $mountIp
then
echo "$mountIp nicht erreichbar, stop"
perl /opt/fhem/fhem.pl 7072 "set FHEM.Backup error"
perl /opt/fhem/fhem.pl 7072 "setreading FHEM.Backup info $mountIp not found"
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 '*fhem_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"
if [[ "$pushoverToken" != "" && "pushoverUser" != "" ]]
then
curl -s -F "token=$pushoverToken" -F "user=$pushoverUser" -F "title=FHEM $localIp" -F "message=Backup mit $fileSizeMB MB wird erstellt" https://api.pushover.net/1/messages.json
fi
#mv "$file" "$localMountPoint/$mountSubDir/$localIp/$filename"
cp "$file" "$localMountPoint/$mountSubDir/$localIp/$filename"
rm "$file"
perl /opt/fhem/fhem.pl 7072 "set FHEM.Backup off"
perl /opt/fhem/fhem.pl 7072 "setreading FHEM.Backup backup $filename"
perl /opt/fhem/fhem.pl 7072 "setreading FHEM.Backup backupMB $fileSizeMB"
perl /opt/fhem/fhem.pl 7072 "setreading FHEM.Backup info backup done"
done
else
echo "Mounten hat anscheinend nicht geklappt, skip."
exit
fi

#Löschen alter Backups
if [[ "$backupsMax" != "" && "$backupsMax" != "0" ]]
then
perl /opt/fhem/fhem.pl 7072 "setreading FHEM.Backup backupFilesMax $backupsMax"
backupsCurrent=`ls -A "$localMountPoint/$mountSubDir/$localIp" | grep -c "_fhem_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 "_fhem_backup.tar.gz" | head -$backupsDelete | xargs rm
else
echo "$backupsCurrent Backups vorhanden - bis $backupsMax aktuelle Backups werden vorgehalten"
fi
else
perl /opt/fhem/fhem.pl 7072 "setreading FHEM.Backup backupFilesMax no limit"
fi

backupsCurrent=`ls -A "$localMountPoint/$mountSubDir/$localIp" | grep -c "_fhem_backup.tar.gz"`
perl /opt/fhem/fhem.pl 7072 "setreading FHEM.Backup backupFiles $backupsCurrent"


echo "Mount wieder unmounten"
umount "$localMountPoint"



Wenn ich das Backupscript starte erhalte ich folgende Fehlermeldung in  der kern.log


No dialect specified on mount. Default has changed to a more secure dialect, SMB2.1 or later (e.g. SMB3), from CIFS (SMB1). To use the less secure SMB1 dialect to access old servers which do not support SMB3 (or SMB2.1) specify vers=1.0 on mount.


Daraufhin habe ich die SMB Version in dem Script angepasst:


mountComplete="//$mountIp/$mountDir $localMountPoint cifs username=$mountUser,password=$mountPass,iocharset=utf8,vers=1.0,sec=ntlm 0 0"



Die Fehlermeldung im kern.log ist immer noch die selbe:


No dialect specified on mount. Default has changed to a more secure dialect, SMB2.1 or later (e.g. SMB3), from CIFS (SMB1). To use the less secure SMB1 dialect to access old servers which do not support SMB3 (or SMB2.1) specify vers=1.0 on mount.


Zum guten Schluss habe ich dann noch


sec=ntml


auf


sec=ntmlssp


ohne Erfolg umgestellt.


Was immer funktioniert ist wenn ich folgendes zum testen probiere:


sudo mount -t cifs -o user=fhem //192.168.2.3/fhembackup  /mnt/testmountpoint


Wenn ich diesen Befehl absetzt kommt postwenden die Passwortabfrage und ich kann das mounten und habe Zugriff. Also ist das Share ja grundsätzlich erreichbar und mit den Anmeldedaten des Users scheint auch alles zu passen. Ich bin mit meinem Latein am Ende. Habt ihr eine Idee was ich noch prüfen könnte? Vielen Dank für eure Hilfe.

Grüße
sxx128






Hardware: Raspberryy PI 4
CC1101-USB-Lite 868MHz/Culfw-1.66
HM-MOD-RPI-PCB
Komponenten: Homematic/Homematic IP/Zigbee
PiVCCU

sash.sc

Raspi 4B+ Bullseye ;LaCrosse; HomeMatic; MapleCUL; ZigBee; Signalduino ESP32 ; Shellys; MQTT2; Grafana mit Influxdb

Wernieman

Und brauchst Du wirklich ein smb V1.0??
Geht nicht ein neueres?
- Bitte um Input für Output
- When there is a Shell, there is a Way
- Wann war Dein letztes Backup?

Wie man Fragen stellt: https://tty1.net/smart-questions_de.html

sxx128

#3
Hallo zusammen,

nein ich brauch kein SMBV1 ich habe das aufgrund der Logeinträge einfach mal so probiert um zu einem Ergebnis zu kommen. Ich habe mir den verlinkten Thread angeschaut und folgendes in dem Script angepasst:


do
mountComplete="//$mountIp/$mountDir $localMountPoint cifs username=$mountUser,password=$mountPass,iocharset=utf8 0 0"
echo "mountComplete: $mountComplete"


Wenn ich das Backupscript händisch aussführe bekomme ich folgende Fehlermeldung:


mount error(13): Permission denied
Refer to the mount.cifs(8) manual page (e.g. man mount.cifs)
mount error(13): Permission denied
Refer to the mount.cifs(8) manual page (e.g. man mount.cifs)
mount error(13): Permission denied
Refer to the mount.cifs(8) manual page (e.g. man mount.cifs)
mount error(13): Permission denied
Refer to the mount.cifs(8) manual page (e.g. man mount.cifs)
mount error(22): Invalid argument
Refer to the mount.cifs(8) manual page (e.g. man mount.cifs)
mount error(22): Invalid argument
Refer to the mount.cifs(8) manual page (e.g. man mount.cifs)
mount error(13): Permission denied
Refer to the mount.cifs(8) manual page (e.g. man mount.cifs)
mount error(13): Permission denied
Refer to the mount.cifs(8) manual page (e.g. man mount.cifs)
mount error(13): Permission denied
Refer to the mount.cifs(8) manual page (e.g. man mount.cifs)
mount error(13): Permission denied
Refer to the mount.cifs(8) manual page (e.g. man mount.cifs)
mount error(13): Permission denied
Refer to the mount.cifs(8) manual page (e.g. man mount.cifs)
mount error(13): Permission denied
Refer to the mount.cifs(8) manual page (e.g. man mount.cifs)
mount error(22): Invalid argument
Refer to the mount.cifs(8) manual page (e.g. man mount.cifs)
mount error(16): Device or resource busy
Refer to the mount.cifs(8) manual page (e.g. man mount.cifs


Im kern.log werde ich auch noch immer angemault das es Probleme gibt mit der SMB Version.

Das witzige ist aber das Backup wird erstellt und die Backupfiles liegen auf dem NAS in dem entsprechenden Verzeichnis? Jetzt bin ich völlig verwirrt. Habt ihr eine Idee ?



Grüße
sxx128

Hardware: Raspberryy PI 4
CC1101-USB-Lite 868MHz/Culfw-1.66
HM-MOD-RPI-PCB
Komponenten: Homematic/Homematic IP/Zigbee
PiVCCU

yersinia

viele Grüße, yersinia
----
FHEM 6.4 (SVN) on RPi 4B with RasPi OS Bookworm (perl 5.36.0) | FTUI
nanoCUL->2x868(1x ser2net)@tsculfw, 1x433@Sduino | MQTT2 | Tasmota | ESPEasy
VCCU->14xSEC-SCo, 7xCC-RT-DN, 5xLC-Bl1PBU-FM, 3xTC-IT-WM-W-EU, 1xPB-2-WM55, 1xLC-Sw1PBU-FM, 1xES-PMSw1-Pl

sash.sc

Zitat von: sxx128 am 20 April 2020, 08:21:42
Hallo zusammen,

nein ich brauch kein SMBV1 ich habe das aufgrund der Logeinträge einfach mal so probiert um zu einem Ergebnis zu kommen. Ich habe mir den verlinkten Thread angeschaut und folgendes in dem Script angepasst:


do
mountComplete="//$mountIp/$mountDir $localMountPoint cifs username=$mountUser,password=$mountPass,iocharset=utf8 0 0"
echo "mountComplete: $mountComplete"


Wenn ich das Backupscript händisch aussführe bekomme ich folgende Fehlermeldung:


mount error(13): Permission denied
Refer to the mount.cifs(8) manual page (e.g. man mount.cifs)
mount error(13): Permission denied
Refer to the mount.cifs(8) manual page (e.g. man mount.cifs)
mount error(13): Permission denied
Refer to the mount.cifs(8) manual page (e.g. man mount.cifs)
mount error(13): Permission denied
Refer to the mount.cifs(8) manual page (e.g. man mount.cifs)
mount error(22): Invalid argument
Refer to the mount.cifs(8) manual page (e.g. man mount.cifs)
mount error(22): Invalid argument
Refer to the mount.cifs(8) manual page (e.g. man mount.cifs)
mount error(13): Permission denied
Refer to the mount.cifs(8) manual page (e.g. man mount.cifs)
mount error(13): Permission denied
Refer to the mount.cifs(8) manual page (e.g. man mount.cifs)
mount error(13): Permission denied
Refer to the mount.cifs(8) manual page (e.g. man mount.cifs)
mount error(13): Permission denied
Refer to the mount.cifs(8) manual page (e.g. man mount.cifs)
mount error(13): Permission denied
Refer to the mount.cifs(8) manual page (e.g. man mount.cifs)
mount error(13): Permission denied
Refer to the mount.cifs(8) manual page (e.g. man mount.cifs)
mount error(22): Invalid argument
Refer to the mount.cifs(8) manual page (e.g. man mount.cifs)
mount error(16): Device or resource busy
Refer to the mount.cifs(8) manual page (e.g. man mount.cifs


Im kern.log werde ich auch noch immer angemault das es Probleme gibt mit der SMB Version.

Das witzige ist aber das Backup wird erstellt und die Backupfiles liegen auf dem NAS in dem entsprechenden Verzeichnis? Jetzt bin ich völlig verwirrt. Habt ihr eine Idee ?



Grüße
sxx128
Hatte das gleiche Problem nach einem System update bzw neu Installation. Von jessie nach buster. Danach funktionierte das erstmal nicht mehr.

Schaue anbei mal in den genannten thread. Danach funktionierte es bei mir wieder. Hatte mich auch an die gleiche Anleitung gehalten.

Gesendet von meinem MI 9 mit Tapatalk

Raspi 4B+ Bullseye ;LaCrosse; HomeMatic; MapleCUL; ZigBee; Signalduino ESP32 ; Shellys; MQTT2; Grafana mit Influxdb

sxx128

Hallo

in den von dir verlinkten ?

Grüße
und Danke für die Hilfe ..

sxx128
Hardware: Raspberryy PI 4
CC1101-USB-Lite 868MHz/Culfw-1.66
HM-MOD-RPI-PCB
Komponenten: Homematic/Homematic IP/Zigbee
PiVCCU

Otto123

#7
Zitat von: sxx128 am 20 April 2020, 07:36:37

sudo mount -t cifs -o user=fhem //192.168.2.3/fhembackup  /mnt/testmountpoint


Wenn ich diesen Befehl absetzt kommt postwenden die Passwortabfrage und ich kann das mounten und habe Zugriff. Also ist das Share ja grundsätzlich erreichbar und mit den Anmeldedaten des Users scheint auch alles zu passen. Ich bin mit meinem Latein am Ende. Habt ihr eine Idee was ich noch prüfen könnte? Vielen Dank für eure Hilfe.

Grüße
sxx128
Dann mach doch den Mount über die fstab hinterlege ordentlich Deine credentials. Da braucht es dann auch kein sudo und keine credentials im Script.

Ich habe das mit dem Backup auch mal gemacht, mein Script braucht kein Telnet was ja per default nicht mehr definiert ist. Nur falls Du irgendwann mit dem hier nicht weiter kommst.

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

sash.sc

Zitat von: sxx128 am 20 April 2020, 09:17:29
Hallo

in den von dir verlinkten ?

Grüße
und Danke für die Hilfe ..

sxx128
Jepp. Hier in der 2. Antwort

Gesendet von meinem MI 9 mit Tapatalk

Raspi 4B+ Bullseye ;LaCrosse; HomeMatic; MapleCUL; ZigBee; Signalduino ESP32 ; Shellys; MQTT2; Grafana mit Influxdb

sxx128

Hallo ihr zwei,

schau ich mir alles gleich an. Vielen Dank ihr zwei.

Grüße
sxx128
Hardware: Raspberryy PI 4
CC1101-USB-Lite 868MHz/Culfw-1.66
HM-MOD-RPI-PCB
Komponenten: Homematic/Homematic IP/Zigbee
PiVCCU

Forcin

#10
Hi,

ich nutze auch das Backup Skript von https://www.meintechblog.de/2015/05/fhem-howto-automatisches-backup-auf-externem-nas/.
Der BAckup Ziel-Ordner ist euf einem Windows 10 PC. Dort musste ich den SMB1 Client nachinstallieren.

Ich hatte mehrere Probleme mit dem Skript, die ich mit paar Workaround lösen konnte.

Hier meine Vorgehensweise:

Ich habe das Skript manuell ausgeführt um die Fehlermeldungen zu erhalten.
sudo /opt/fhem/FHEM/backup.sh
Dort wurde der Fehler -22 (Invalid parameter) angezeigt.

Ich habe festgestellt, dass in der /etc/fstab ein falscher Mount Befehl eingetragen war.
Hiermit kann man sich das anzeigen lassen.
cat /etc/fstab
Ich hatte beim ersten Ausführen des Skripts einen Benutzernamen mit Leerzeichen, was nicht so einfach funktioniert.
Ich nutze übrigens:
mountComplete="//$mountIp/$mountDir $localMountPoint cifs username=$mountUser,password=$mountPass,iocharset=utf8 0 0"
Anscheinend wird der Eintrag in der /etc/fstab beim Aufrufen des Skripts nicht überschrieben bzw. nicht neu geschrieben.
Ich habe den Eintrag deshalb manuell angepasst.
Datei modifizieren mit
sudo nano /etc/fstab

Nun bekam ich die Fehlermeldung, dass das Mounten nicht geklappt hat.
Allerdings habe ich herausgefunden, dass der Ziel-Ordner gemountet ist.
ls -lha /etc/fstab

Das Skript hat eine Codezeile, die prüft, ob das Mounten erfolgreich war.
if [ "$(ls -A $localMountPoint)" ]
Dies funktioniert anscheinend nicht richtig. Als Workaround habe ich die Überprüfung im Skript auskommentiert. Ich gehe einfach davon aus, dass das Mounten klappt. Nicht schön, aber geht.
#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 '*fhem_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"
if [[ "$pushoverToken" != "" && "pushoverUser" != "" ]]
then
curl -s -F "token=$pushoverToken" -F "user=$pushoverUser" -F "title=FHEM $localIp" -F "message=Backup mit $fileSizeMB MB wird erstellt" https://api.pushover.net/1/messages.json
fi
#mv "$file" "$localMountPoint/$mountSubDir/$localIp/$filename"
cp "$file" "$localMountPoint/$mountSubDir/$localIp/$filename"
rm "$file"
perl /opt/fhem/fhem.pl 7072 "set ItemBackup off"
perl /opt/fhem/fhem.pl 7072 "setreading ItemBackup backup $filename"
perl /opt/fhem/fhem.pl 7072 "setreading ItemBackup backupMB $fileSizeMB"
perl /opt/fhem/fhem.pl 7072 "setreading ItemBackup info backup done"
done
#else
#echo "Mounten hat anscheinend nicht geklappt, skip."
#exit
#fi


Jetzt funktioniert auch das Backup.  :)

Allerdings wäre es toll, wenn jemand weiß, wie ich die Problme richtig gelöst bekomme.
1) Was muss man ändern, dass der Eintrag in der /etc/fstab bei jedem Skript-Aufruf aktualisiert wird?
2) Was muss man ändern, damit die Überprüfung des Mount-Status richtig funktioniert?

VG
Forcin

Wernieman

WENN Du das Script schon mit root startest, warum ändert er dann die fstab??

Sauberer wäre es (wenn schon root), mit einem "manuellen" mount Befehl ...
- Bitte um Input für Output
- When there is a Shell, there is a Way
- Wann war Dein letztes Backup?

Wie man Fragen stellt: https://tty1.net/smart-questions_de.html

Otto123

Hallo Forcin,

ich bin am analysieren und antworten, bis dahin ein paar grundlegende Dinge und zwei Fragen.
Für backup braucht man:
1. kein root
2. kein sudo
3. weder root noch sudo

Für eine Verbindung zu Windows 10 braucht man kein SMB1 es sei denn man hat ein horn altes System auf dem FHEM läuft.
Auf was für einem System läuft FHEM?

Wenn man den Eintrag in der fstab richtig macht, muss den kein Script überschreiben!
Wie sieht der Eintrag in der fstab jetzt aus?

Zusatzfrage: Ist der Windows 10 PC immer an?

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Otto123

Damit diese Bedingung wahr wird:
[ "$(ls -A $localMountPoint)" ]
Muss der Pfad in $localMountPoint existieren (wird weiter oben im Script geprüft) und er darf nicht leer sein. Bedeutet in der Annahme des Scripts: wenn nur der Mountpoint existiert aber der mount nicht geklappt hat ist die Bedingung falsch.
Die Bedingung ist aber auch falsch, wenn ein leerer Pfad gemountet wird - also Du hast auf Windows den Pfad ttt frei gegeben -> \\win\ttt, mountest diesen Pfad nach /mnt dann ergibt ls -A /mnt nichts = falsch

Also damit prüft man mMn nicht den Erfolg des mountens sondern ob ein Pfad leer ist oder nicht  :-X

Eigentlich kann man den mount Befehl an sich auf Erfolg prüfen, muss mal schauen hab ich schon mal gemacht.

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Wernieman

bei bash kannst Du den Fehlercode abfrage ... $?
- Bitte um Input für Output
- When there is a Shell, there is a Way
- Wann war Dein letztes Backup?

Wie man Fragen stellt: https://tty1.net/smart-questions_de.html