ubuntuusers.de

mount in Bash-Script über crontab

Status: Ungelöst | Ubuntu-Version: Ubuntu 20.04 (Focal Fossa)
Antworten |

mikadl

Anmeldungsdatum:
10. Juni 2020

Beiträge: Zähle...

Hallo liebe Leute,

ich versuche seit Wochen ein rsync Bash-Script für die Sicherung eines Raspberry Pi's zum Laufen zu bringen und scheitere immer wieder am Einhängen der NAS-Freigabe für das Backup-Ziel.

Am NAS habe ich das entstprechende Verzeichnis per NFS für die statische IP-Adresse des Pi's freigegeben. Die IP Adresse des Pi's ist in diesem Fall 192.168.0.13 und die des NAS ist 192.168.0.10. Ein Rechteproblem dürfte es meiner Meinung nach nicht sein - habe per SSH die Rechte des Verzeichnisses am NAS überprüft.

Hier die Ausgabe von

cat /etc/exports

am NAS

"/share/MD0_DATA/Backup" 192.168.0.13(rw,async,no_subtree_check,insecure,no_root_squash)

Der Owner des Verzeichnisses ist root und die UID der beiden Benutzer (Admin-User am Pi) und Adminstrator am NAS ist die gleiche.

Um den Mount Befehl ohne root-Rechte (also ohne Parameter wie -t nfs, etc.) ausführen zu können, habe ich das gewünschten Verzeichnis in der fstab Datei ergänzt.

Hier der Auszug aus der Datei

/etc/fstab
192.168.0.10:/Backup   /mnt/backup	nfs	rw,relatime,user,noauto	0 0

Hier habe ich bewusst 'user' verwendet um im Bash-Script kein sudo für den Mount zu benötigen. Fragt mich bitte nicht ob das auch stimmt - ich habe alle Dinge, die ich recherchiert habe versucht 😉

Und hier ein Auszug aus dem eigentlichen Bash-Script. Auszug deshalb, weil das Problem genau an den unten gezeigten Zeilen auftritt. Das Logfile sagt mir immer "Beim Einhaengen ist ein Fehler....".

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
readonly MOUNT_POINT='/mnt/backup'
readonly LOG="${0}".log

echo "SCHRITT 3" >> "${LOG}"
echo "Pruefe Moint-Point..." >> "${LOG}"

if ! mountpoint -q "${MOUNT_POINT}"; then
  # Wenn nicht, versuche es einzuhaengen
  echo "Backup-Verzeichnis ${MOUNT_POINT} einhaengen." >> "${LOG}"
  if ! mount "${MOUNT_POINT}"; then
    echo "Beim Einhaengen ist ein Fehler aufgetreten. Die Sicherung wird abgebrochen!" >> "${LOG}"
    exit 5
  else
    echo "  Backup-Verzeichnis erfolgreich eingehaengt." >> "${LOG}"
  fi
else
  echo "${MOUNT_POINT} ist bereits eingehaengt." >> "${LOG}"
fi

Da ich dachte, dass ich den Mount-Befehlt als Root-User absetzen muss, habe ich den entsprechenden Cronjob in den crontab des Root-Users, also mittels sudo crontab -e geschrieben.

Der Cron-Job wird auch entsprechend gestartet - ich sehe das am Zeitstempel des angelegten Logfiles. Zu diesem Zeitpunkt dürften sich das NAS bzw. die HDDs im Ruhemodus befinden.

Wenn ich den Befehl

mount /mnt/backup

manuell in der Konsole ausführe, dann ist das Verzeichnis /mnt/backup komplett leer?!

Hier noch die Mountpoints, die ich am Pi angezeigt bekomme, was ja eigentlich gut aussieht.

 showmount -e 192.168.0.10
Export list for 192.168.0.10:
...
/Backup
...

Ich wünsche euch einen schönen Tag und bedanke mich für jeden Tipp, der mich in die richtige Richtung lenkt,

Mike

Doc_Symbiosis

Avatar von Doc_Symbiosis

Anmeldungsdatum:
11. Oktober 2006

Beiträge: 4453

Wohnort: Göttingen

Sollte das Verzeichnis nach dem Einhängen denn nicht leer sein? Sprich, liegen dort schon Daten drin?

Und ist die Variable ${MOUNT_POINT} richtig gesetzt? Gib diese vielleicht einfach mal bei der Fehlermeldung mit aus.

mikadl

(Themenstarter)

Anmeldungsdatum:
10. Juni 2020

Beiträge: 3

Hallo Doc,

vielen Dank für deine Antwort!

Nachdem das Verhalten des Pi's in den letzten beiden Tagen immer seltsamer wurde (Docker Dienst reagierte nicht mehr und ließ sich nicht mehr neu starten, etc.), habe ich nun alle Docker-Netzwerke, Container, etc. entfernt, einen Purge ausgeführt und den Dienst neu installiert.

Und siehe da, auf einmal funktioniert der mount Befehl ohne jegliche Änderungen in den angsprochenen Dateien wie fstab, usw. Ich verstehe den Zusammenhang ehrlich gesagt nicht und bin im Moment einfach nur froh und überrascht, dass das Mounten nun funktioniert. Eventuell hat es ja etwas mit diversen Mounts zu tun, die sich Docker automatisch anlegt?!

Da ich in meinem Backup-Script derzeit keine Befehle mehr verwende, welche den sudo User benötigen, habe ich die Ausführung nun in den 'normalen' crontab verschoben (also ohne sudo crontab -e).

Am 15.06 (laut cron-Tabelle) sollte das Backup dann erneut automatisch ausgeführt werden - ich bin schon sehr gespannt... 😉

Ich melde mich dann auf jeden Fall noch einmal hier und berichte über den Erfolg/Misserfolg des Backups.

Bis dahin sehe ich das Thema erst einmal als erledigt und bedanke ganz herzlich bei euch!

Sollte das Verzeichnis nach dem Einhängen denn nicht leer sein? Sprich, liegen dort schon Daten drin?

Nein, das Verzeichnis sollte nicht leer sein. Dort befinden sich weitere Unterverzeichnisse für jeden Backup-Client. In dem Falle ein Verzeichnis mit dem Namen Pi3A. Das kann ich jetzt auch sehen und dürfte auch die richtigen Rechte darauf haben...

Schönen Tag,

Mike

mikadl

(Themenstarter)

Anmeldungsdatum:
10. Juni 2020

Beiträge: 3

Ok, liebe Leute,

das Backup-Script hätte heute um 18:00 durchlaufen sollen...

Leider ohne Erfolg.

Ich hatte ja versucht auf nicht sudo Commands umzustellen, weil ich das Script im normalen crontab anstatt des sudo crontabs ausführen will. Das geht aber nicht, klar ich verwende Befehle wie

echo "" >> "${LOG}"

und da muss die Logdatei natürlich auch entsprechende Schreibrechte für den normalen User parat haben - das habe ich bereits geändert. Als nächstes hat's mich beim Versuch diverse Datenbanken webzusichern aufgehauen → klar, das Passwort dazu (also für den mysqldump) habe ich in eine Credential-Datei gepackt, auf die selbstverständlich nur wiederum der Root-User Lese- und Schreibrechte hat und alle anderen gar nichts 😉

Nun meine Frage zwischendurch: Ist es überhaupt möglich, derartige Scripte als Nicht-Admin-User laufen zu lassen?

Ich schicke hier jetzt einfach das ganze Ding, vielleicht kann der Eine oder Andere ja vielleicht mal drübersehe, bitte, danke?!

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
#!/bin/bash

# ---------------------------------------------------------------------------------------
# Konstanten definieren
# ---------------------------------------------------------------------------------------
readonly SERVER_IP=xxx.xxx.xxx.xxx
readonly SERVER_MAC="xx:xx:xx:xx:xx:xx"

readonly MOUNT_POINT='/mnt/backup'
readonly TARGET="${MOUNT_POINT}/Pi3A"
readonly EXCLUDEFILE='exclude.txt'

# Quellverzeichnisse
SOURCES=(/etc /home /usr/local/bin /var/lib /var/mail /var/www)
SOURCES+=(/mnt/sda1)

readonly CREDENTIAL_DIR='/mnt/sda1/usr/accounts'
readonly DBBACKUP_DIR='/mnt/sda1/backup/db'

# rSync Switches
readonly RSYNCPARAMS='-avR -hh'

# Konfiguration von rsync
# readonly RSYNCCONFIG='--dry-run --delete'
readonly RSYNCCONFIG='--delete'

# E-Mail, an die der abschliessende Bericht geschickt werden soll
readonly MAILREC='ttt@ttt.com'

# Shortcuts fuer Commands
readonly MAIL='/usr/bin/mail'
readonly RSYNC='/usr/bin/rsync'

target="${TARGET}/"
readonly LOG="${0}".log

# Ein einfacher > bedeutet, dass das Logfile geloescht werden soll
echo "------------------------------------------------------------------------------" > "${LOG}"
# Ein doppelter >> fuegt hingegen an das bestehende Logfile an
date >> "${LOG}"

echo "" >> "${LOG}"

# ---------------------------------------------------------------------------------------
# Datenbanken sichern
# ---------------------------------------------------------------------------------------
DBBACKUP_NAME=$(date +"%Y%m%d")
DBOLDBACKUP=$(date -d "30 days ago" +"%Y%m%d")

echo "SCHRITT 1" >> "${LOG}"

echo "Sichere alle Datenbanken" >> "${LOG}"

docker exec mariadb-container /usr/bin/mysqldump \
 --user=root \
 --password=$(cat "${CREDENTIAL_DIR}/xxx.crd") \
 --all-databases \
 --lock-tables \
 | bzip2 > "${DBBACKUP_DIR}"/xxx/"${DBBACKUP_NAME}".sql.bz2

last_dbbackup_file="${DBBACKUP_DIR}"/xxx/"${DBOLDBACKUP}".sql.bz2

if [ -f "${last_dbbackup_file}" ]; then
  echo "Alte Datenbanksicherung {$last_dbbackup_file} wird geloescht" >> "${LOG}"
  rm last_dbbackup_file
else
  echo "  Kein Datenbank-Backup gefunden, das aelter ist als 30 Tage" >> "${LOG}"
fi

echo "" >> "${LOG}"

# ---------------------------------------------------------------------------------------
# NAS aufwecken (mittels wakeonlan packeten)
# Das wakeonlan package muss dafuer installiert sein
# Die Mac-Adresse des Zielrechners muss zuvor bestimmt und WAKE-ON-LAN aktiviert sein!
# ---------------------------------------------------------------------------------------
echo "SCHRITT 2" >> "${LOG}"
echo "Pinge NAS und schicke WOL Packete..." >> "${LOG}"

ping -W 1 -c4 -q xxx.xxx.xxx.xxx >&/dev/null
[ $? -eq 0 ] || /usr/bin/wakeonlan $SERVER_MAC >&/dev/null
echo "WOL Signale geschickt und Theoden reaktiviert." >> "${LOG}"

echo "" >> "${LOG}"

# ---------------------------------------------------------------------------------------
# Pruefen ob Laufwerk bereits gemounted ist...
# ---------------------------------------------------------------------------------------
echo "SCHRITT 3" >> "${LOG}"
echo "Pruefe Moint-Point..." >> "${LOG}"

if ! mountpoint -q "${MOUNT_POINT}"; then
  # Wenn nicht, versuche es einzuhaengen
  echo "Backup-Verzeichnis ${MOUNT_POINT} einhaengen." >> "${LOG}"
  if ! mount "${MOUNT_POINT}"; then
    echo "Beim Einhaengen ist ein Fehler aufgetreten. Die Sicherung wird abgebrochen!" >> "${LOG}"
    exit 5
  else
    echo "  Backup-Verzeichnis erfolgreich eingehaengt." >> "${LOG}"
  fi
else
  echo "${MOUNT_POINT} ist bereits eingehaengt." >> "${LOG}"
fi

today=$(date +%d)

echo "" >> "${LOG}"

echo "SCHRITT 4" >> "${LOG}"
echo "Starte Backup..." >> "${LOG}"

echo "------------------------------------------------------------------------------" >> "${LOG}"
echo "rSync Konfiguration:" >>  "${LOG}"
echo "Params: ${RSYNCPARAMS}" >> "${LOG}"
echo "Config: ${RSYNCCONFIG}" >> "${LOG}"
echo "------------------------------------------------------------------------------" >> "${LOG}"

# ---------------------------------------------------------------------------------------
# Alle Quellverzeichnisse durchgehen und pruefen
# Fuer eine Inkrementelle Sicherung mit Hardlinks 
# --link-dest sorgt dafuer, das nur veraenderte Dateien kopiert werden.
# Von allen anderen Dateien werden nur Hardlinks auf die angegebene Quelle erstellt
# ---------------------------------------------------------------------------------------
for source in "${SOURCES[@]}"; do
  echo "" >> "${LOG}"
  echo "Synchronisiere Verzeichnis \"${source}\" ..." >> "${LOG}"
  ${RSYNC} ${RSYNCPARAMS} --exclude-from="${EXCLUDEFILE}" ${RSYNCCONFIG[@]} ${source} ${target}${today} >> "${LOG}" 2>&1 
  if [ ${?} -ne 0 ]; then 
    ERROR=1
  fi 
  echo "------------------------------------------------------------------------------" >> "${LOG}"
done

echo "" >> "${LOG}"

# ---------------------------------------------------------------------------------------
# Laufwerk wieder aushaengen
# ---------------------------------------------------------------------------------------
echo "SCHRITT 5" >> "${LOG}"
echo "Entferne Mount-Point..." >> "${LOG}"

umount "${MOUNT_POINT}"
if ! mountpoint -q "${MOUNT_POINT}"; then
  echo "Backup-Verzeichnis ${MOUNT_POINT} erfolgreich ausgehaengt." >> "${LOG}"
else
  echo "Backup-Verzeichnis ${MOUNT_POINT} konnt nicht ausgehaengt werden!" >> "${LOG}"
fi

echo "------------------------------------------------------------------------------" >> "${LOG}"

Den Teil, der weiter unten kommt und eine E-Mail generiert habe ich entferne, da für diese Frage nicht relevant.

Das Komische ist, dass der weiter oben von mir erwähnte mount Befehl nun nicht mehr funktioniert! Ich kann

mount /mnt/backup

oder

sudo mount /mnt/backup

schreiben, alles endet in einem leeren Verzeichnis!

Als ich den Rechner das letzte Mal neu gestartet habe und das Backup-Script noch nie gelaufen ist, hat alles funktionert. Also irgendwie scheint mir das Script das komplette System zu zerschiessen?

Vielen Dank für eure Tipps!

Mike

Antworten |