[erledigt] Festen Mount point für USB cardreader

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
rendegast
Beiträge: 15041
Registriert: 27.02.2006 16:50:33
Lizenz eigener Beiträge: MIT Lizenz

Re: [SHELL] Festen Mount point für USB cardreader

Beitrag von rendegast » 22.04.2016 17:40:53

Warum nicht einfach udev-Regeln und offensichtlich problematische Mountpoints in /media/ weglassen?
-> ein separates Arbeitsverzeichnis zBsp. /mymounts/

Einfaches Feststellen eines Mountpoints

Code: Alles auswählen

MYDEV=$(/sbin/blkid -o device -L Label)
[ "x$MYDEV" = "x" ] || { echo $MYDEV; script $MYDEV; }
ausbaubar,
zBsp. ob Label auch nur einmal auftritt
zBsp. wenn ein ganzer Satz von Backup-Datenträgern mit demselben Label Verwendung findet.

Oder mit dem (gut kontrollierbaren) Automounter Debianautofs,
wäre es ein einfacher Test

Code: Alles auswählen

ls /mymounts/mountgruppe/mountpoint/lock-datei >/dev/null 2>&1 || exit 0
.... mache weiter ....
mfg rendegast
-----------------------
Viel Eifer, viel Irrtum; weniger Eifer, weniger Irrtum; kein Eifer, kein Irrtum.
(Lin Yutang "Moment in Peking")

Eomer
Beiträge: 63
Registriert: 27.04.2012 23:24:51

Re: [SHELL] Festen Mount point für USB cardreader

Beitrag von Eomer » 22.04.2016 21:25:58

Mir war eben ein wenig langweilig und ich habe etwas rumprobiert und bin auf Eure Meinung gespannt.

Ein großer Teil der Lösung kam von NAB.

So sieht die UDEV-Rule aus:

Code: Alles auswählen

ACTION=="add",  SUBSYSTEM=="block", ENV{ID_VENDOR_ID}="8564", ENV{ID_MODEL_ID}="4000", ENV{ID_SERIAL_SHORT}=="000000000039",  KERNEL=="*[a-z]1",  SYMLINK+="backupreader%n", ENV{SYSTEMD_WANTS}="startbackup.service"
das hier dann in fstab:

Code: Alles auswählen

/dev/backupreader1     /wohinersoll     auto     defaults,noauto  0  0


Folgende Regel habe ich in /etc/systemd/system/startbackup.service abgelegt:

Code: Alles auswählen

[Unit]
Description=Start script

[Service]
Type=oneshot
ExecStart=/etc/init.d/copyscript start
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target
Dazu habe ich das Script in init.d geschoben, ist aber schwachsinnig und werde ich ändern.
Ein Problem: Das Script war zu schnell, der Stick war noch nicht einmal richtig gemountet.

Lösung. sleep 5 gleich am Anfang.

Schwachsinn oder gute idee?
Der Kopiervorgang lief durch wie ein heißes Messer durch butter....habe allerdings nur NTFS getestet.

TomL

Re: [SHELL] Festen Mount point für USB cardreader

Beitrag von TomL » 22.04.2016 23:46:00

Eomer hat geschrieben:Schwachsinn oder gute idee?
Wenns funktioniert ist es doch genau richtig, dann kann man doch die Baustelle schließen. Nur frag ich mich, warum nach /etc/init und nicht nach /usr/loca/bin?

Die fstab ist in Kombination mit dem symlink selbstverständlich eine gute Möglichkeit, und noch schneller kommt man nicht zum richtigen Ergebnis.... deshalb alles richtig gemacht. Ich habs jetzt auch über systemd gelöst, allerdings über mein Script, welches natürlich jetzt auch noch zusätzlich einen weiteren Job starten kann. Das heisst, ich trage nur die udev-Regel ein, dann läuft der Rest nach meinen Anforderungen ... eben jedes Device unter seinem aktuellen Kernel-Namen mounten, solange kein expliziter Mountpoint angegeben ist und ggf. bei Bedarf auch einen Job starten. Da ich die fstab außer für sda1 und ggf. sda2 ansonsten gar nicht nutze, hatte ich das nicht weiter betrachtet. Und auf allen Rechnern für alle Sticks und Usb-Platten jeweils die fstab mit statischen Angaben nachpflegen, wollte ich mir nicht antun.

Aber prima... dann ist das ja jetzt erfolgreich geschlossen. :THX:

Eomer
Beiträge: 63
Registriert: 27.04.2012 23:24:51

Re: [SHELL] Festen Mount point für USB cardreader

Beitrag von Eomer » 22.04.2016 23:48:00

Hey,

vielen Dank. Für die Rückmeldung.

War nur temporär in init.d ist jetzt in opt/bin...;)

Also Du kannst gerne Dein aktualisiertes Script posten, würde mich sehr interessieren.


Und ja, der Teil ist denke ich geschlossen. Ich mache gleich das nächste Thema auf :D

LG

TomL

Re: [SHELL] Festen Mount point für USB cardreader

Beitrag von TomL » 23.04.2016 15:31:58

Eomer hat geschrieben:Also Du kannst gerne Dein aktualisiertes Script posten, würde mich sehr interessieren.
Mach ich natürlich gerne.... in der Hoffnung auf Hinweise, wenn ich vielleicht irgendwo nen Bock geschossen habe.... aber hier bei mir scheint es jetzt bestens zu funktionieren....

Allerdings poste ich das nicht, ohne vorher zu bemerken, dass mein Script keine Konkurrenz zu Deiner Einfach-Lösung sein will und das auch gar nicht sein kann. Das, was Du jetzt eingerichtet hast, funktioniert mit minimalem Aufwand perfekt... besser kann man es nicht machen. Aber diese Lösung passt überhaupt nicht zu meinen Anforderungen, insofern ist die fstab-Lösung für mich völlig untauglich. Natürlich gibts auch Schnittmengen bei unseren Anforderungen, aber es ist doch eher mehr, was es unterscheidet.

Zum einen verwende ich nicht die Formate ntfs und exFat... das heisst, die Besonderheiten bei FUSE-Filesystem kannte ich bisher gar nicht. Ich starte derzeit auch keine Jobs nach dem Mounten. Dafür hantiere ich aber hier rotierend mit vier 2,5'er USB-Harddisks als Backmedium. Ich nutze wahllos einen von 4 USB-Sticks und 2 CardReader für irgendwelche Aktionen, zusätzlich 2 USB-Sticks und 1 SD-Card als "Key" zum entschlüsseln von Crypt-Devices. Ein Crypt-Container mit für mich besonderen Daten liegt von allen Plätzen erreichbar auf einer Serverplatte. Dazu fungieren 9 PC's als potentielle Dockingstationen. Also auf allen Systemen irgendwelche Symlinks generieren und die fstab's so customizen, das jedes Device einen festen und konfliktfreien mountpoint eingerichtet hat und die dann auch noch alle merken... und darüber hinaus damit in /media nur noch Unübersichtlichkeit erzeugen.... neee, das geht alles gar nicht *lol* Da fehlt es mir bei der fstab-Lösung an der notwendigen Flexibilität. Stattdessen kopiere ich jetzt ganz einfach nur die 3 benötigten Files rein und fertig ist die Laube... und alle Systeme behandeln die USB-Devices auf synchrone Weise.

Meine Anforderungen sind einfach erklärt;
Ich will, dass sich jede Platte, jeder Stick per default nach /media/sd?? mountet und das nach dem Abziehen alle Spuren beseitigt sind (media/sd??). Ein nächstes/weiteres angeschlossenes Device bekommt automatisch einen "folgenden" Kernelnamen und dementsprechend einen passenden gleichlautenden Mountpoint. Z.B. auf /dev/sdb1 folgt /dev/sdc1, darauf /dev/sdd1, usw.....

Ich möchte, dass sich ausgewählte besondere Devices (die Key-Sticks/Card) automatisch in ein besonderes Verzeichnis mounten.

Enthält einer meiner Sticks 2 oder mehr Partitionen, ggf. sogar unterschiedlich formatiert, sollen alle Partitionen auch einzeln gesteuert werden können.

Und der letzte Punkt, FUSE-FS mounten und starten von Jobs. Solche Anforderungen habe ich derzeit nicht. Aber ich hatte große Lust, das zu implementieren.... einfach deshalb, weils eine schöne Herausforderung ist und ich Spass daran habe. Also habe ich das gelöst. Das Dilemma war leider, dass ich die letzten Tage einfach wenig Zeit hatte... aber so wie es aussieht, funktioniert ist jetzt.

Eomer
Beiträge: 63
Registriert: 27.04.2012 23:24:51

Re: [erledigt] Festen Mount point für USB cardreader

Beitrag von Eomer » 23.04.2016 23:50:57

Ja ist doch prima. Würde es auch gerne als Interesse und Inspiration in der Finalen Version sehen. Nein, eine Konkurrenz soll es nicht sein, es ist ja auch für etwas völlig anderes da.

LG

TomL

Re: [erledigt] Festen Mount point für USB cardreader

Beitrag von TomL » 24.04.2016 12:48:49

Moin

Das Konzept funktioniert seit 2-3 Tagen perfekt, genau meinen Anforderungen entsprechend. Es funktioniert gleichermaßen unter Debian Jessie und auch unter Raspian Jessie. Was tut es?
  • Alle USB-Speichermeiden werden tadellos bei fehlender Vorgabe unter ihrem Kernelnamen nach /media/sd?? gemountet.
  • Es werden keine Phantasie-MountPoints vom Automounter angelegt
  • Ein Re-Direct auf einen "anderen" vorgebenen MountPoint funktioniert
  • Ein Sub-Job kann nach dem Mount gestartet werden.
    Bei usbmount start/add wird der Subjob nach dem Mount mit folgender Syntax gestartet: subjob start {arg1} {arg2} {arg3}
    Bei usbmount stop/remove wird der Subjob vor dem Umount mit folgender Syntax gestartet: subjob stop {arg1} {arg2} {arg3}
    Dadurch ist die Unterstützung eines Crypt-Devices möglich, welches beim Einstecken des Key-Sticks "geöffnet" wird, und beim Abziehen "geschlossen" wird, siehe udev-Rules "Mini-USB-Stick".
  • Beim Abziehen/Entfernen des Mediums werden angelegte Verzeichnisse wieder entfernt (aufräumen in /media)
  • Aktivitäten und Probleme können im Journal nachgesehen werden
  • Unterstützte (bisher getestete) Filesysteme; ext4, ntfs, vfat, exfat
  • Das Konzept ist durch einfaches Kopieren von 3 Files (Bash-Script, systemd-Service-Unit und udev-Rule) auf weitere PC-Systeme portierbar, kein Anpassen der fstab (statisches Customizing) notwendig
Warum ich das bisher nicht gepostet habe...?... tja, wegen der Dokumentation :roll: Es ist ziemlich flexibel und deckt alle Anwendungsfälle ab. Dabei ist es vom Umfang eher klein, im Gegensatz allerdings zur Beschreibung der möglichen Anwendungsfälle. So einfach, wie es eigentlich ist, allein wegen der Komplexität und Vielfalt der Möglichkeiten ist es eher untauglich für 'alle'. :facepalm:

1. Verschiedene Anwendungsbeispiele für manuellen Start vom Terminal... direkt via Bash-Script, geeignet für 'normale' Filesysteme

Code: Alles auswählen

usbmount start /dev/sdb1
usbmount stop /dev/sdb1

usbmount add /dev/sdb1
usbmount remove /dev/sdb1

usbmount add /dev/sdb1 /home/specialdir
usbmount stop /dev/sdb1

usbmount start  /dev/sdb1 /home/specialdir /usr/local/bin/counter 15 3 test
usbmount remove /dev/sdb1

Syntax Call-Parameter = analog systemd-Service-Unit
Parameter:      Keine Blanks, getrennt durch Komma, komplett in Anführungszeichen 
                device=/dev/sdb1 , mountto=/home/thomas/special , run=/usr/local/bin/counter , arg1=5 , arg2=3 , arg3=test

usbmount start 'device=/dev/sdb1'
usbmount stop /dev/sdb1

usbmount start 'device=/dev/sdb1,mountto=/home/thomas/special'
usbmount stop /dev/sdb1

usbmount add 'device=/dev/sdb1,mountto=/home/thomas/special,run=/usr/local/bin/counter,arg1=5,arg2=3,arg3=test'
usbmount remove /dev/sdb1
2. Anwendungsbeispiele für Start via systemd vom terminal oder über udev-Event! Für normale Filesysteme und FUSE-FS und für zu startende Long-Time-Jobs

Code: Alles auswählen

Parameter:      Keine Blanks, getrennt durch Komma, komplett in Anführungszeichen
                device=/dev/sdb1 , mountto=/home/thomas/special , run=/usr/local/bin/counter , arg1=30

Code: Alles auswählen

systemctl start usbmount@'device=/dev/sdb1'.service
systemctl stop usbmount@'device=/dev/sdb1'.service

systemctl start usbmount@'device=/dev/sdb1,mountto=/home/thomas/special'.service
systemctl stop usbmount@'device=/dev/sdb1,mountto=/home/thomas/special'.service

systemctl start usbmount@'device=/dev/sdb1,mountto=/home/thomas/special,run=/usr/local/bin/counter,arg1=60'.service
systemctl stop usbmount@'device=/dev/sdb1,mountto=/home/thomas/special,run=/usr/local/bin/counter,arg1=60'.service

systemctl start usbmount@'device=/dev/sdb1,run=/usr/local/bin/counter,arg1=10,arg2=TestParm'.service
systemctl stop usbmount@'device=/dev/sdb1,run=/usr/local/bin/counter,arg1=10,arg2=TestParm'.service
3. Beispiele für Start via udev-Eventhandler

Code: Alles auswählen

# 2-GB-TransMemory-USB-Stick    (Hier Partition 1 berücksichtigen!!!)
 KERNEL=="sd?1", SUBSYSTEMS=="usb", ENV{ID_SERIAL_SHORT}=="12345", ACTION=="add",    RUN+="/bin/systemctl start usbmount@'device=/dev/%k,mountto=/home/thomas/specialdir'.service"
 KERNEL=="sd?1", SUBSYSTEMS=="usb", ENV{ID_SERIAL_SHORT}=="12345", ACTION=="remove", RUN+="/bin/systemctl stop  usbmount@'device=/dev/%k,mountto=/home/thomas/specialdir'.service"
 KERNEL=="sd?1", SUBSYSTEMS=="usb", ENV{ID_SERIAL_SHORT}=="12345", GOTO="rules_end"

# Funktioniert für ext4, vfat ebenfalls
#KERNEL=="sd?1", SUBSYSTEMS=="usb", ENV{ID_SERIAL_SHORT}=="12345", ACTION=="add",    RUN+="/bin/bash /usr/local/bin/usbmount add /dev/%k /home/thomas/specialdir"
#KERNEL=="sd?1", SUBSYSTEMS=="usb", ENV{ID_SERIAL_SHORT}=="12345", ACTION=="remove", RUN+="/bin/bash /usr/local/bin/usbmount remove /dev/%k"
#KERNEL=="sd?1", SUBSYSTEMS=="usb", ENV{ID_SERIAL_SHORT}=="12345", GOTO="rules_end"

# 8-GB-RAG-Stick, Partition 1 = 7 GB FAT32, Partition 2 = 1 GB EXT4   (Partition 1 = Default-Handler, hier nur Partition 2 berücksichtigen!!!)
 KERNEL=="sd?2", SUBSYSTEMS=="usb", ENV{ID_SERIAL_SHORT}=="1a2b3c", ACTION=="add",    RUN+="/bin/systemctl start usbmount@'device=/dev/%k,mountto=/home/thomas/specialdir,run=/usr/local/bin/counter,arg1=60'.service"
 KERNEL=="sd?2", SUBSYSTEMS=="usb", ENV{ID_SERIAL_SHORT}=="1a2b3c", ACTION=="remove", RUN+="/bin/systemctl stop usbmount@'device=/dev/%k,mountto=/home/thomas/specialdir,run=/usr/local/bin/counter,arg1=60'.service"
 KERNEL=="sd?2", SUBSYSTEMS=="usb", ENV{ID_SERIAL_SHORT}=="1a2b3c", GOTO="rules_end"

# Mini-USB-Stick   (Uncrypt /dev/sda2, jedoch nur auf Dell-Notebook)
 KERNEL=="sd?1",  SUBSYSTEMS=="block", ENV{ID_SERIAL_SHORT}=="4711", ACTION=="add",    RUN+="/bin/systemctl start usbmount@'device=/dev/%k,mountto=/home/thomas/specialdir,run=/usr/local/bin/uncrypt,arg1=/dev/sda2,arg2=DellNotebook'.service"
 KERNEL=="sd?1",  SUBSYSTEMS=="block", ENV{ID_SERIAL_SHORT}=="4711", ACTION=="remove", RUN+="/bin/systemctl stop usbmount@'device=/dev/%k,mountto=/home/thomas/specialdir,run=/usr/local/bin/uncrypt,arg1=/dev/sda2,arg2=DellNotebook'.service"
 KERNEL=="sd?1",  SUBSYSTEMS=="block", ENV{ID_SERIAL_SHORT}=="4711", GOTO="rules_end"

# Failed! Wird gemäß UDEV-Man-Page gekillt (nach ca. 20 Sek.)
#KERNEL=="sd?2", SUBSYSTEMS=="usb", ENV{ID_SERIAL_SHORT}=="1a2b3c", ACTION=="add",    RUN+="/bin/bash /usr/local/bin/usbmount add /dev/%k /home/thomas/specialdir '/usr/local/bin/counter' 60"
#KERNEL=="sd?2", SUBSYSTEMS=="usb", ENV{ID_SERIAL_SHORT}=="1a2b3c", ACTION=="remove", RUN+="/bin/bash /usr/local/bin/usbmount remove /dev/%k"
#KERNEL=="sd?2", SUBSYSTEMS=="usb", ENV{ID_SERIAL_SHORT}=="1a2b3c", GOTO="rules_end"

# Default-Handler
 KERNEL=="sd??", SUBSYSTEMS=="usb", ACTION=="add",    RUN+="/bin/systemctl start usbmount@'device=/dev/%k'.service"
 KERNEL=="sd??", SUBSYSTEMS=="usb", ACTION=="remove", RUN+="/bin/systemctl stop  usbmount@'device=/dev/%k'.service"

 LABEL="rules_end"
Zuletzt geändert von TomL am 27.04.2016 20:49:57, insgesamt 10-mal geändert.

TomL

Re: [erledigt] Festen Mount point für USB cardreader

Beitrag von TomL » 24.04.2016 12:50:18

Teil 2 - die benötigten Files:

Code: Alles auswählen

nano /usr/local/bin/usbmount

Code: Alles auswählen

#/bin/bash
#==========================================================================================================
# Mount von USB-Sticks, USB-Hard-Disks und SD-Card/Cardreader
#
# Script-Name:  usbmount
# Author     :  TommyLu*gmx.de
# Date       :  27.04.2016
# Version    :  3.1
#
# Called by  :  Udev-Rule
# Category   :  Memory-Device-Tool
#
#           $1     $2         {$3}         {$4}                       {$5} {$6} {$7}
#           was?   wer?       wohin?       run Job
# usbmount  add    /dev/sdb1  /media/sdb1  /usr/local/bin/myjob start Parameter f. myjob
# usbmount  remove /dev/sdb1  /media/sdb1  /usr/local/bin/myjob stop  Parameter f. myjob
#==========================================================================================================

[ -z "$1" ] || [ -z "$2" ] && exit 1

MountTo=""
Run=""
Arg1=""
Arg2=""
Arg3=""
Logging=1

Action=$1
Device=$2
[ -z "$3" ] && MountTo=/media/$(basename $Device) || MountTo=$3
[ -n "$4" ] && Run="$4"
[ -n "$5" ] && Arg1="$5"
[ -n "$6" ] && Arg2="$6"
[ -n "$7" ] && Arg3="$7"

#----------------------------------------------------------------------------------------------------------

parm=${Device,,}

if [[ "$parm" =~ "device=" ]]; then                                # systemd? Try to parse 1 (one) systemd-Instanz-Var
    line=$Device

    while true; do
        parm=$(echo $line | cut -f1 -d',')
        line=${line#*,}

        name=${parm%=*}
        value=${parm#*=}
        name=${name,,}

        [[ "$name" =~ "action" ]]  && Action=$value
        [[ "$name" =~ "device" ]]  && Device=$value
        [[ "$name" =~ "mountto" ]] && MountTo=$value
        [[ "$name" =~ "run" ]]     && Run=$value
        [[ "$name" =~ "arg1" ]]    && Arg1=$value
        [[ "$name" =~ "arg2" ]]    && Arg2=$value
        [[ "$name" =~ "arg3" ]]    && Arg3=$value

        if [ "$line" == "$parm" ];  then
            break
        fi
    done

    [ -z "$MountTo" ] && [ -n "$Device" ] && MountTo=/media/$(basename $Device)
fi

#----------------------------------------------------------------------------------------------------------

if [ "$Action" == "start" ] || [ "$Action" == "add" ]; then
    (($Logging)) && echo "Action=$Action   Device=$Device   MountTo=$MountTo   Run=$Run Arg1=$Arg1 Arg2=$Arg2 Arg3=$Arg3" | systemd-cat -t "thlu:`basename $0`" -p info

    if [ $Logging -ne 0 ]; then
        m=$(udevadm info --query=symlink --attribute-walk --name=$Device | grep model -i)
        m="${m#"${m%%[![:space:]]*}"}"
        m=$(echo $m|tr -d '\n')

        s=$(udevadm info --query=symlink --attribute-walk --name=$Device | grep serial -i)
        s="${s#"${s%%[![:space:]]*}"}"
        s=$(echo $s|tr -d '\n')
        echo "Model: $m  Serialid: $s" | systemd-cat -t "thlu:`basename $0`" -p info
    fi

    if [[ -z $(grep $Device /proc/mounts) ]]; then
        [ -d $MountTo ] || /bin/mkdir -p $MountTo
        fsys=$(udevadm info $Device | grep ID_FS_TYPE | awk -F '=' '{ print $2 }')

        case $fsys in
          vfat)
                /bin/mount $Device $MountTo -t vfat -o user,umask=000
                rc=$?
                ;;
          ext4)
                /bin/mount $Device $MountTo -t ext4 -o user,rw,relatime
                rc=$?
                chmod 777 $MountTo
                ;;
          ntfs)
                /bin/mount $Device $MountTo -t ntfs-3g  -o user,rw,relatime
                rc=$?
                ;;
          exfat)
                /bin/mount $Device $MountTo -o rw,relatime
                rc=$?
                ;;
          iso9660)
                /bin/mount $Device $MountTo
                rc=$?
                ;;
          *)
                (($Logging)) && echo "$Device=Undefined Filesystem-Type!   (FSType=$fsys)" | systemd-cat -t "thlu:`basename $0`" -p info
                exit 1
          ;;
        esac
    else
        rc="already mounted"
    fi
    (($Logging)) && echo "/bin/mount $Device $MountTo    (FSType=$fsys)  (RC mount=$rc)" | systemd-cat -t "thlu:`basename $0`" -p info

    if [ -n "$Run" ]; then
        (($Logging)) && echo "App=$Run start $Arg1 $Arg2 $Arg3" | systemd-cat -t "thlu:`basename $0`" -p info
        [ -f $Run ] && $Run start $Arg1 $Arg2 $Arg3 &
        rc=$?
        (($Logging)) && echo "$Run start=finished (RC=$rc)" | systemd-cat -t "thlu:`basename $0`" -p info
    fi
#----------------------------------------------------------------------------------------------------------

elif [ "$Action" == "stop" ] || [ "$Action" == "remove" ]; then
    MountTo=$(grep $Device /proc/mounts | cut -f2 -d' ')
    (($Logging)) && echo "Action=$Action   Device=$Device   MountTo=$MountTo   Run=$Run Arg1=$Arg1 Arg2=$Arg2 Arg3=$Arg3" | systemd-cat -t "thlu:`basename $0`" -p info

    if [ -n "$Run" ]; then
        (($Logging)) && echo "App=$Run stop $Arg1 $Arg2 $Arg3" | systemd-cat -t "thlu:`basename $0`" -p info
        [ -f $Run ] && $Run stop $Arg1 $Arg2 $Arg3
        rc=$?
        (($Logging)) && echo "$Run stop=finished (RC=$rc)" | systemd-cat -t "thlu:`basename $0`" -p info
    fi

    rc="was not mounted"
    if [ -n "$MountTo" ]; then
        /bin/umount $Device -f                           # /usr/bin/udisksctl unmount -b $Device --force
        rc=$?
    fi
    (($Logging)) && echo "/bin/umount $Device -f    (RC umount=$rc)" | systemd-cat -t "thlu:`basename $0`" -p info
    [ "$rc" == "was not mounted" ] && rc=0

    if [[ $rc -eq 0 ]]; then
        if [ -d $MountTo ] &&  [ -z "$(grep $Device /proc/mounts)" ]; then
            find $MountTo -maxdepth 0 -empty -exec /bin/rmdir $MountTo \;
        fi
    fi
fi
#----------------------------------------------------------------------------------------------------------

exit 0

Code: Alles auswählen

nano /etc/systemd/system/usbmount@.service

Code: Alles auswählen

[Unit]
Description=Running /usr/local/bin/usbmount

[Service]
Type=forking
RemainAfterExit=yes
ExecStart=/bin/bash -c "/usr/local/bin/usbmount start %I"
ExecStop=/bin/bash -c "/usr/local/bin/usbmount stop %I"

[Install]
WantedBy=multi-user.target

Code: Alles auswählen

chown root:root /usr/local/bin/usbmount
chown root:root /etc/systemd/system/usbmount@.service
chmod 755 /usr/local/bin/usbmount
chmod 644 /etc/systemd/system/usbmount@.service
Zum Testen des "Long-Time-Jobs" habe ich mir ein kleines Script gebastelt, dessen Start man oben in Teil 1 in den Aufrufen sehen kann:

Code: Alles auswählen

nano /usr/local/bin/counter

Code: Alles auswählen

#! /bin/bash

sec=$1
[ $sec -eq 0 ] && sec=10

echo "Wait $sec Seconds  Arg2=$2  Arg3=$3" >>/tmp/counter

for ((x=0;x<=$sec;x++))
do
    d=`date +%d-%m-%Y-%H-%M-%S`
    echo $d >>/tmp/counter
    sleep 1
done

exit 123

Code: Alles auswählen

chmod 755 /usr/local/bin/counter
Mit folgenden Befehlen habe ich mir die Ausgaben während der Kommandos bzw. des Events in verschiedenen gleichzeitigen Terminalfenstern angesehen. Als laufende "followed" Ausgabe:

Code: Alles auswählen

tail /tmp/counter -n 20 --sleep-interval=2 -f
journalctl -b -f | grep usbmount
Und als Snapshot:

Code: Alles auswählen

journalctl -b | grep thlu
journalctl -b | grep usbmount
Den Return-Code (123) des geforkten Child-Prozesses sieht man leider nur im Log. Der Prozess wird im Hintergrund gestartet, um den Terminate nach systemd-Timeout zu verhindern.

Code: Alles auswählen

journalctl -b | grep thlu
Apr 24 11:37:34 raspi3 thlu:usbmount[3783]: Action=start   Device=/dev/sda1   MountTo=/media/sda1   Run= Arg1= Arg2= Arg3=
Apr 24 11:37:34 raspi3 thlu:usbmount[3795]: Action=start   Device=/dev/sda2   MountTo=/home/thomas/specialdir   Run=/usr/local/bin/counter Arg1=60 Arg2= Arg3=
Apr 24 11:37:45 raspi3 thlu:usbmount[3818]: Model: ATTRS{model}==" "  Serialid: ATTRS{serial}=="1a2b3c" ATTRS{serial}=="20980000.usb"
Apr 24 11:37:45 raspi3 thlu:usbmount[3830]: Model: ATTRS{model}==" "  Serialid: ATTRS{serial}=="1a2b3c" ATTRS{serial}=="20980000.usb"
Apr 24 11:37:45 raspi3 thlu:usbmount[3840]: /bin/mount /dev/sda1 /media/sda1    (FSType=vfat)  (RC mount=0)
Apr 24 11:37:45 raspi3 thlu:usbmount[3849]: /bin/mount /dev/sda2 /home/thomas/specialdir    (FSType=ext4)  (RC mount=0)
Apr 24 11:37:45 raspi3 thlu:usbmount[3852]: Start App=/usr/local/bin/counter   Param=60
Apr 24 11:37:45 raspi3 thlu:usbmount[3856]: /usr/local/bin/counter=finished (RC=0)

journalctl -b | grep usbmount

Apr 24 11:37:33 raspi3 systemd[1]: Starting Running /usr/local/bin/usbmount...
Apr 24 11:37:33 raspi3 systemd[1]: Starting Running /usr/local/bin/usbmount...
Apr 24 11:37:34 raspi3 thlu:usbmount[3783]: Action=start   Device=/dev/sda1   MountTo=/media/sda1   Run= Arg1= Arg2= Arg3=
Apr 24 11:37:34 raspi3 thlu:usbmount[3795]: Action=start   Device=/dev/sda2   MountTo=/home/thomas/special   Run=/usr/local/bin/counter Arg1=60 Arg2= Arg3=
Apr 24 11:37:45 raspi3 thlu:usbmount[3818]: Model: ATTRS{model}==" "  Serialid: ATTRS{serial}=="1a2b3c" ATTRS{serial}=="20980000.usb"
Apr 24 11:37:45 raspi3 thlu:usbmount[3830]: Model: ATTRS{model}==" "  Serialid: ATTRS{serial}=="1a2b3c" ATTRS{serial}=="20980000.usb"
Apr 24 11:37:45 raspi3 thlu:usbmount[3840]: /bin/mount /dev/sda1 /media/sda1    (FSType=vfat)  (RC mount=0)
Apr 24 11:37:45 raspi3 systemd[1]: Started Running /usr/local/bin/usbmount.
Apr 24 11:37:45 raspi3 thlu:usbmount[3849]: /bin/mount /dev/sda2 /home/thomas/special    (FSType=ext4)  (RC mount=0)
Apr 24 11:37:45 raspi3 thlu:usbmount[3852]: Start App=/usr/local/bin/counter   Param=60
Apr 24 11:37:45 raspi3 thlu:usbmount[3856]: /usr/local/bin/counter=finished (RC=0)
Apr 24 11:37:45 raspi3 systemd[1]: Started Running /usr/local/bin/usbmount.
Apr 24 11:38:48 raspi3 systemd[1]: usbmount@\x27device\x3d-dev-sda2\x2cmountto\x3d-home-thomas-specialdir\x2crun\x3d-usr-local-bin-counter\x2carg1\x3d60\x27.service: main process exited, code=exited, status=123/n/a

TomL

Re: [erledigt] Festen Mount point für USB cardreader

Beitrag von TomL » 27.04.2016 20:59:32

Wen es interessiert.... 8) .... das mit dem "Sub-Job" aus dem Mount des udev-Eventhandlers heraus war rückblickend betrachtet eine richtig gute Anregung. Ich habe noch mal am Script rumgebastelt und habe nun das Ergebnis, dass beim Einstecken meines besonderen Key-Sticks meine vorgegebene Crypt-HD (sda2) entschlüsselt wird. Beim Abziehen des Sticks wird das Crypt-Device unmittelbar ordentlich beendet und geschlossen. Ich habe das Script also noch mal ausgetauscht und oben drüber die Anmerkungen vervollständigt.

Für mein Reise-Notbook war das jetzt eine richtig gute Erweiterung, die mir ohe Aufwand automatisch mit Einstecken des Sticks die zweite Partition entschlüsselt und bei Abziehen wieder schließt. Zuhause ist ne SD-Card permanent eingesteckt und selbst damit werden beide Prozesse (usbmount und uncrypt) beim Boot bearbeitet, ohne dass ich da was extra einstellen musste. Auch dieser Fall wird von udev ordentlich abgewickelt. Das finde ich klasse :THX:

Antworten