Externes Laufwerk automatisch mounten/Backup starten

Probleme mit Samba, NFS, FTP und Co.
Antworten
Alternativende
Beiträge: 2090
Registriert: 07.07.2006 18:32:05

Externes Laufwerk automatisch mounten/Backup starten

Beitrag von Alternativende » 27.04.2017 11:44:17

Hallo zusammen,
ich stehe derzeit vor folgender Aufgabe. Ich will von einem NAS (Openmediavault) automatisch eine Kopie des RAID1 erstellen lassen, sobald eine bestimmte USB-Festplatte angeschlossen wird. Diese Platte soll mit LUKS verschlüsselt werden.

Die grobe Vorgehensweise sollte also sein.

1. Debian erkennt das die Platte angeschlossen wird
2. Das LUKS Laufwerk wird geöffnet
3. Rsync startet den Abgleich
4. Luks wird geschlossen
5. Mitarbeiter bekommt eine Mail über den Status
6. Platte wandert wieder in den Tresor

Hat jemand von euch so etwas schon mal gemacht und könnte mir bei Script einen Tipp geben? Der rsync Part und das versenden der Mails ist nicht die große Kunst, aber wie er die Platte erkennt und daraufhin entsperrt und das Backup starten soll ist mir noch nicht so ganz klar.

Vielleicht hat ja jemand einen Tipp.

Danke!

DeletedUserReAsG

Re: Externes Laufwerk automatisch mounten/Backup starten

Beitrag von DeletedUserReAsG » 27.04.2017 12:32:50

Das sollte sich via udev und einem Script lösen lassen.

Benutzeravatar
weshalb
Beiträge: 1265
Registriert: 16.05.2012 14:19:49

Re: Externes Laufwerk automatisch mounten/Backup starten

Beitrag von weshalb » 27.04.2017 12:45:29

So ein Script hätte ich auch gerne.

letzter3
Beiträge: 443
Registriert: 16.07.2011 22:07:31

Re: Externes Laufwerk automatisch mounten/Backup starten

Beitrag von letzter3 » 27.04.2017 15:09:01

OMV kann doch sowas von Haus aus. Das entsprechende plugin heisst USB-backup oder so.
Kann heute Abend gerne den genauen Namen raussuchen.

Alternativende
Beiträge: 2090
Registriert: 07.07.2006 18:32:05

Re: Externes Laufwerk automatisch mounten/Backup starten

Beitrag von Alternativende » 27.04.2017 17:29:33

Cool, auch mit LUKS-Laufwerken?

TomL

Re: Externes Laufwerk automatisch mounten/Backup starten

Beitrag von TomL » 27.04.2017 18:53:33

Also eigentlich ist das eine ziemlich simple Lösung, wenn man sich ein einfaches Bashscript zutraut und ne systemd-Unit erstellen kann.

1. UDEV erkennt (sowieso), dass die Platte angeschlossen ist/wird und könnte eine Service-Unit starten.
2. Die Service-Unit entschlüsselt (LUKS) die Platte via uncrypt, mountet sie und startet das script.
3. Das Script macht den rsync und stoppt als letztes wieder die Unit.....
4. Das Stoppen der Unit umounted die Platte und schließt das Crypt-Device.... und fertig... viel mehr ist da nicht hinter.

Wichtig ist nur, dass man mit UDEV nicht direkt das Script startet, sondern eine Service-Unit. Damit vermeidet man Timeout-Probleme, wenn das Script länger braucht und systemd auf die kurzfristig erwartete Rückkehr des UDEV-Events wartet.

Alternativende
Beiträge: 2090
Registriert: 07.07.2006 18:32:05

Re: Externes Laufwerk automatisch mounten/Backup starten

Beitrag von Alternativende » 27.04.2017 20:10:34

@letzter3
So wie ich das sehe kann das Tool weder eine Mail senden noch LUKS öffnen leider.

Ich werde mal folgende Anleitung für den ganzen ersten Part testen und das mit dem umount und rsync versuchen zu verbinden.

https://michael.stapelberg.de/Artikel/a ... setup_udev

letzter3
Beiträge: 443
Registriert: 16.07.2011 22:07:31

Re: Externes Laufwerk automatisch mounten/Backup starten

Beitrag von letzter3 » 27.04.2017 21:02:41

LUKS stimmt wohl leider.
Mail wird aber versendet.

scientific
Beiträge: 3020
Registriert: 03.11.2009 13:45:23
Lizenz eigener Beiträge: Artistic Lizenz
Kontaktdaten:

Re: Externes Laufwerk automatisch mounten/Backup starten

Beitrag von scientific » 28.04.2017 03:07:34

systemd mit udev.

udev erkennt, wann eine ganz bestimmte Filesystem (Stichwort UUID) gemountet wird und wirft eine systemd-Unit an.

Die Service-Unit hat eine "Wants=" und eine "After="-Abhängigkeit zu einer weiteren Unit, welche mir die Partition mountet. Diese wiederum hat eine Abhängigkeit zu einer weiteren Unit mittels "Wants=" und "After=" welche mit LUKS/cryptsetup das Filesystem aufsperrt.
Die erste Unit startet nach erfolgreichem Aufsperren und Mounten das Backup.

Oder noch detaillierter... so hab ich es derzeit bei mir im Einsatz:
udev aktiviert ein target.
An dieses target habe ich eine automount-Unit gehängt, welche mit einem TimeoutIdleSec=10s die Partition nach 10 Sekunden ohne Zugriff wieder unmountet.
An das selbe Target hänge ich einen weiteren Timer, der mir eine Service-Unit startet, die dann das Backup einmalig oder regelmäßig anwirft, solange die Platte eingesteckt ist. (Mit btrfs kann ich ja sehr einfach und mit wenig Aufwand mehrere ganze Systemsnapshots erstellen und auf einen externen Datenträger sichern)

Die Automount-Unit mountet dann bei Zugriff auf das Verzeichnis/Mountpoint das zugehörige Filesystem.
Ist dieses mit cryptsetup/LUKS verschlüsselt, muss die oben genannte Abhängigkeit zur Entschlüsselung noch mit in die Mount-Unit dazu.

Anfänglich wurde das systemd-Team heftig gescholten, weil eine Entschlüsselung mit einem Key, der auf einem USB-Stick im unpartitionierten Bereich abgelegt ist, nicht entschlüsselt werden konnte...
Ich muss aber sagen, es geht doch. Hab dazu sogar eine Unit geschrieben, die die externe Platte automatisch aufsperren kann, wenn der Stick mit dem Key eingesteckt ist.
Die Anleitung hab ich im Wiki festgehalten und findest du hier:
Wiki-Artikel zum Thema Cryptsetup_mit_systemd_und_Schlüssel_auf_externem_USB-Stick

Wenn du dich hier https://github.com/xundeenergie/mkbackup-btrfs ein wenig vertiefst, findest du die systemd-units und auch fertige Skripte dazu, wie du mit

Code: Alles auswählen

systemctl start mkbackup-register@dev-sdb2.service
die zweite Partition auf der externen Platte (sofern das Device /dev/sdb2 ist!!!) einrichtest, dass das Backup automatisch angeworfen wird, wenn die Platte eingesteckt wird.
Die automatische Entschlüsselung ist im genannten Wiki-Beitrag.

lg scientific
dann putze ich hier mal nur...

Eine Auswahl meiner Skripte und systemd-units.
https://github.com/xundeenergie

auch als Debian-Repo für Testing einbindbar:
deb http://debian.xundeenergie.at/xundeenergie testing main

Alternativende
Beiträge: 2090
Registriert: 07.07.2006 18:32:05

Re: Externes Laufwerk automatisch mounten/Backup starten

Beitrag von Alternativende » 04.05.2017 11:47:15

Hallo zusammen,
ich habe nun mein kleines Skript ein wenig erstellt und schon ein bisschen getestet.

Code: Alles auswählen

# !/bin/bash

# Oeffnen des Laufwerks bei manueller Ausfuehrung
#cryptsetup luksOpen UUID="6519823b-c32383f8-33501dc46c9c" backup

# Wegen der UDEV-Regel unnoetig
#mount UUID="d808248a-8317-41007c072a0c09" /media/backup/

EMAILMESSAGE='/usr/local/src/emailmessage.txt'
EMAILERRORMESSAGE='/usr/local/src/emailerrormessage.txt'

sleep 10 
if [ -a /media/backup/TESTVERSCHLUESSELT ]
	then
echo "Prüfdatei vorhanden"
echo "Starte Rsync"

 /usr/bin/rsync -n -auv --progress --delete /srv/dev-disk-by-id-md-name-0/ /media/backup && /usr/bin/mail -s "Backup OK, Bitte einlagern" tn@he.de < $EMAILMESSAGE

if [ $? -ne 0 ]; then
 echo "Fehler bei Rsync"
 /usr/bin/mail -s "Backup FEHLER, RSYNC" t@he.de < $EMAILERRORMESSAGE
  

else
 echo "Rsync OK, umount backup"

#Auswerfen des Volumes, zur Sicherheit
umount /media/backup/
cryptsetup luksClose backup


fi

else
echo "Platte nicht angeschlossen"


fi

echo "Finish"


Die Mailadresse und die UUID´s habe ich hier abgeändert. Ansonsten sollte das Skript nachdem die Platte bereits angeschlossen und gemountet worden ist (https://michael.stapelberg.de/Artikel/a ... setup_udev) prüfen ob die Testdatei vorhanden ist, das Backup starten und in jedem Fehlerfall eine Mail schreiben. Wenn alles gut gegangen ist natürlich auch.

Dieses Skript wollte ich nun im Normalfall per cron alle 5 Minuten ausführen lassen und die Ergebnisse dann jeweils in eine Logdatei schreiben. Die Kollegin müsste dann nur noch die Platte morgens wenn sie kommt anschließen, spätestens 5 Minuten danach wird dann das Backup gestartet und sie bekommt eine Mail das alles gelaufen ist.

Sieht da jemand noch einen groben Fehler?

TomL

Re: Externes Laufwerk automatisch mounten/Backup starten

Beitrag von TomL » 04.05.2017 12:17:45

Alternativende hat geschrieben:Sieht da jemand noch einen groben Fehler?
Wer soll Dir das beantworten.... ?... bezogen auf welchen Kontext....? ... und wenn keine Syntaxfehler enthalten sind....?

Schau Dir meine Funktion zum Öffnen der LUKS-Partition an.... vielleicht kannst Du da noch Anregungen zur besseren Kontrolle übernehmen:
Bis auf "$Logging" sind die $Vars selbsterklärend. 'Logging' kann 0 oder 1 sein. Bei 1 erzeugt es Journaleinträge, die beim Debuggen ganz hilfreich sind.

Code: Alles auswählen

OpenDevice()
{
    rc=$(cryptsetup status $SymLink | grep -i "is active")
    if [[ -n $rc ]]; then
        (($Logging)) && echo "Open Crypt-Device failed: Device=$Device already exists  SymLink=$SymLink" | systemd-cat -t "thlu:`basename $0`" -p info
        return 1
    fi

    cryptsetup luksOpen $Device $SymLink --key-file "$KeyFile"
    rc=$?
    (($Logging)) && echo "Open Crypt-Device: Device=$Device SymLink=$SymLink Keyfile=$KeyFile RC=$rc" | systemd-cat -t "thlu:`basename $0`" -p info

    if [ $rc -ne 0 ]; then
        echo  -e "\nError Passphrase! RC=$rc"
        (($Logging)) && echo "Open Crypt-Device failed: Device=$Device SymLink=$SymLink Passphrase/Keyfile failed" | systemd-cat -t "thlu:`basename $0`" -p info
       return 1
    fi

    [ -d /media/$SymLink ] || mkdir /media/$SymLink
    mount /dev/mapper/$SymLink /media/$SymLink -t ext4 -o rw,sync,noatime,nodev,nosuid,data=ordered,uhelper=udisks2

    return 0
}

Alternativende
Beiträge: 2090
Registriert: 07.07.2006 18:32:05

Re: Externes Laufwerk automatisch mounten/Backup starten

Beitrag von Alternativende » 04.05.2017 12:38:32

War nur eine generelle Frage. Ein Problem was mir gerade einfällt ist das ich ganz am Anfang des Skripts prüfen müsste ob rsync nicht bereits läuft. Tue ich das nicht, startet cron das Skript ja stumpf einfach noch mal.

Wie kann ich das erreichen?

Edit:

So habe ich das nun mal versucht. Wenn die PID von rsync ungleich 0 ist sollte das Skript aufhören zu laufen.

Code: Alles auswählen

.....

if [ `pidof nmbd` !=0 ]
then
   echo "Rsync laeuft nicht"



else
    echo "Rsync laeuft"
    exit 0;
fi

......


TomL

Re: Externes Laufwerk automatisch mounten/Backup starten

Beitrag von TomL » 04.05.2017 14:42:02

Alternativende hat geschrieben:Wie kann ich das erreichen?

Code: Alles auswählen

# Auf "totes" Lockfile prüfen, älter als 2 Stunden. Ja, dann löschen!
/usr/bin/find "/var/run/myrsync.lock" -mmin +120 -exec /bin/rm "/var/run/myrsync.lock" \; 2>/dev/null 

if [ -f "/var/run/myrsync.lock" ]; then
    /bin/echo "refused... already running" | systemd-cat -t "thlu:`basename $0`" -p "warning"

else
    /bin/echo "running" | systemd-cat -t "thlu:`basename $0`" -p "info"
    /usr/bin/touch "/var/run/myrsync.lock"

    rsync von a nach b

    /bin/echo "ready" | systemd-cat -t "thlu:`basename $0`" -p "info"
    /bin/rm "/var/run/myrsync.lock"
fi

Alternativende
Beiträge: 2090
Registriert: 07.07.2006 18:32:05

Re: Externes Laufwerk automatisch mounten/Backup starten

Beitrag von Alternativende » 05.05.2017 11:11:03

Leider startet OpenMediaVault nun nicht mehr ordnungsgemäß wenn die Platte nicht angeschlossen ist.

Das sollte so natürlich nicht sein. Ich denke mal es hängt mit der UDEV-Regel zusammen, habe da aber auch keine Erfahrung. Kann mir da jemand einen Tipp geben?

Edit:
Man hat mir mehrfach den Tipp gegeben das mounten nicht mit UDEV zu machen, sondern ein systemd Unit zu verwenden. Das werde ich nun am Montag nach folgender Anleitung einmal probieren und dann hier berichten.
https://technik.blogbasis.net/arch-auto ... 09-10-2015

Alternativende
Beiträge: 2090
Registriert: 07.07.2006 18:32:05

Re: Externes Laufwerk automatisch mounten/Backup starten

Beitrag von Alternativende » 12.05.2017 10:09:19

So ich habe mal ein wenig weiter gebastelt und einen netten Hinweis im IRC auf die /etc/crypttab bekommen. Diese scheint genau für meinen Zeck zu passen.

Folgendes habe ich nun gemacht damit die Festplatte automatisch gemountet wird, sobald sie eingesteckt wurde.

/etc/crypttab

Code: Alles auswählen

# <target name>	<source device>		<key file>	<options>

backup  UUID=6519823b-c323c46c9c /usr/local/src/keyfiles/p-hdd dicard,luks

/etc/fstab

Code: Alles auswählen

/dev/mapper/backup /media/backup		ext4	auto,nofail,defaults,user,users	0	0

Antworten