• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

Automount Shell Script Hilfe!

Danloc

Newbie
Hallo zusammen,

ich stehe bei meinem Vorhaben etwas auf dem Schlauch und hoffe hier hat jemand eine Lösung.

Also ich Versuche per udev rule und shell script ein Laufwerk zu mounten. Allerdings ist es zwingend erforderlich, das die Anzahl der bereits gemounteten Laufwerke Variabel bleibt bzw Genau erkannt wird welches Laufwerk eingebunden werden muss.

Mit der Ausgabe von df und zerschneiden etc, habe ich es hinbekommen, zu erkennen welche Laufwerksbuchstaben sich bereits im System befinden. Also bspw. sda und sdb - also mounte ich /dev/sdc1 nach xy.
Das ist aber zu ungenau, ich muss genau wissen welchen Laufwerksbuchstabe meine angesteckte USB Platte zugewiesen wird.

Dazu habe ich folgendes versucht, was nicht funktioniert.

meine udev rule:
Code:
SUBSYSTEMS=="usb", KERNEL=="sd*1", ACTION=="add", RUN+="/usr/bin/meinshell.sh"

also habe ich mir gedacht, ich könnte mir jetzt die Ausgabe des Kernels anzeigen lassen, um zu wissen, welche Platte ich zu mounten habe.

meinshell.sh
Code:
#!/bin/bash

echo "Kernel="$KERNEL > /home/usr/output1

Mein Script ist in dem Fall nur ein Beispiel. Aber um Genau die Ausgabe geht es. Sprich ich hätte nun gerne die Bezeichnung, wie die Festplatte ins System kommt. Also Bsp sdb oder sowas.

Ich hoffe es ist klar, was ich versuche zu erreichen und ihr könnt mir helfen. Danke schonmal.

Gruß Danloc
 

marce

Guru
wieso nimmst du nicht direkt automount oder verlässt Dich auf UIDS / Labels / ... anstatt auf die Devices, die immer wieder anders lauten?
 
Danloc schrieb:
Hallo zusammen,
ich stehe bei meinem Vorhaben etwas ...
...
Das ist aber zu ungenau, ich muss genau wissen welchen Laufwerksbuchstabe meine angesteckte USB Platte zugewiesen wird.
Gruß Danloc

Ich verstehe dein Schreiben nicht.wirklich.
Danloc schrieb:
Das ist aber zu ungenau, ich muss genau wissen welchen Laufwerksbuchstabe meine angesteckte USB Platte zugewiesen wird.
Gruß Danloc
Laufwerksbuchstabe ist wahrscheinlich der device name.

udev rule
Code:
KERNEL!="sd[d-y]*", GOTO="exit_private"
# Hier geben wir deiner USB Platte einen Namen
ATTRS{serial}=="SAMSUNG HMS16LJ10Q202007", \
	ACTION=="add", \
	SYMLINK+="usbdisk", \
	RUN+="/bin/mount /dev/usbdisk"
SYMLINK=="usbdisk", ACTION=="remove", \
	RUN+="/bin/umount /dev/%k"

LABEL="exit_private"

/etc/fstab
Code:
...
/dev/usbdisk          /mnt/usbdisk auto      noauto,rw,user,exec   0 0
blabla
...

Damit sollte das möglich sein

Gruß
Gräfin Klara
 

spoensche

Ultimate Guru
1. Unter Linux gibt es keine Laufwerksbuchstaben.

Damit du weisst um welche Festplatte es sich handelt kannst du deinem Script in der Udev Rule doch einen Parameter mitgeben. Der Parameter einhaltet dannn das zu mountende Device.
 
A

Anonymous

Gast
Hi Gräfin Klara,
zu deiner udev-rule habe ich eine Frage.
Wie wird fürs unmount vom Benutzer dieses Ereignis ausgelöst? Und wofür steht /dev/%k?
Gräfin Klara schrieb:
Code:
SYMLINK=="usbdisk", ACTION=="remove", \
	RUN+="/bin/umount /dev/%k"
Warum klammerst du eigentlich als Gerätedatei den Buchstaben "z" explizit aus? Ist /dev/sdz von Linux bereits intern reserviert?
 

josef-wien

Ultimate Guru
LUH 3417 schrieb:
Und wofür steht /dev/%k?
Fehlt das in Deiner manpage?
$kernel, %k
The kernel name for this device.
Ich habe ja keine Ahnung, warum Danloc unbedingt Vorhandenes nachempfinden will, aber ich würde bei Wechseldatenträgern nicht mit root arbeiten, sondern als Benutzer mit den inotify-tools überwachen und mit udisksctl ein- und aushängen.
 
A

Anonymous

Gast
josef-wien schrieb:
LUH 3417 schrieb:
Und wofür steht /dev/%k?
Fehlt das in Deiner manpage?
Ähm, nein. ->man udev

String substitutions

When writing rules which will potentially handle multiple similar devices, udev's printf-like string substitution operators are very useful. You can simply include these operators in any assignments your rule makes, and udev will evaluate them when they are executed.

The most common operators are %k and %n. %k evaluates to the kernel name for the device, e.g. "sda3" for a device that would (by default) appear at /dev/sda3. %n evaluates to the kernel number for the device (the partition number for storage devices), e.g. "3" for /dev/sda3.
Gefunden hier: http://www.reactivated.net/writing_udev_rules.html
etwas deutsches: http://www.mpipks-dresden.mpg.de/~m...opensuse-manual_de/manual/sec.udev.rules.html

Beide leider schon sehr alt, aber die Englische ist didaktisch besser geschrieben. Kennst du vllt eine gescheite, aktuelle Webseite mit "Lesestoff" zu udev-rules?
 
LUH 3417 schrieb:
Hi Gräfin Klara,
zu deiner udev-rule habe ich eine Frage.
Wie wird fürs unmount vom Benutzer dieses Ereignis ausgelöst? Und wofür steht /dev/%k?
Gräfin Klara schrieb:
Code:
SYMLINK=="usbdisk", ACTION=="remove", \
	RUN+="/bin/umount /dev/%k"
Warum klammerst du eigentlich als Gerätedatei den Buchstaben "z" explizit aus? Ist /dev/sdz von Linux bereits intern reserviert?

Danloc schrieb:
Das ist aber zu ungenau, ich muss genau wissen welchen Laufwerksbuchstabe meine angesteckte USB Platte zugewiesen wird.

Danloc will alles genau kontrollieren, deshalb vergibt die obige udev.rule dem nach Seriennummer erkannten usb_device einen eigenen device namen.
.. SYMLINK+="usbdisk", \
Um beim Abstöpseln des usb_devices /dev/usbdisk (oder wie auch immer genannt) sauber zu entfernen, muß die
ACTION=="remove"
angegeben werden. Diese umounted und entfernt alles korrekt.

Anstatt
ATTRS{serial}=="BlahBlah
kann man natürlich auch den Label angeben.

/dev/%k steht für den device Kernelnamen. Da der kernel /dev/usbdisk nicht kennt, steht dort bei remove /dev/%k.

/dev/sdz hat nur private Gründe. Auf /dev/sdz habe ich den user uhelp gemounted. Dort wird der Abfall ausgelagert.

Gruß
Gräfin Klara
 

uhelp

Member
Na dann wundert es auch nicht mehr, wenn bei Gräfin Klara die Bash Expansions nicht tun.
Selber schuld.
 
A

Anonymous

Gast
Gräfin Klara schrieb:
Um beim Abstöpseln des usb_devices /dev/usbdisk (oder wie auch immer genannt) sauber zu entfernen, muß die
ACTION=="remove"
angegeben werden. Diese umounted und entfernt alles korrekt.
Genau das verstehe ich hier noch nicht: Wie wird vom Benutzer dieses Ereignis ausgelöst, damit vor dem Abstöpseln der Disk unmount ausgeführt wird?
 
LUH 3417 schrieb:
Gräfin Klara schrieb:
Um beim Abstöpseln des usb_devices /dev/usbdisk (oder wie auch immer genannt) sauber zu entfernen, muß die
ACTION=="remove"
angegeben werden. Diese umounted und entfernt alles korrekt.
Genau das verstehe ich hier noch nicht: Wie wird vom Benutzer dieses Ereignis ausgelöst, damit vor dem Abstöpseln der Disk unmount ausgeführt wird?

ACTION=="remove"
wie es der Name schon beschreibt, wird NUR dann von udev gemeldet, wenn der usb Stecker gezogen wird.
D.h., ohne dieser rule würde ein sauberes umount beim Ziehen des Steckers nicht stattfinden.
Ist der user aber ein Erbsenzähler und er macht vor dem Abstöpseln ein
# umount ... usbdisk
dann wird dieses umount das /dev/usbdisk entfernen. Zieht er danach den Stöpsel, geht die rule darauf ein
SYMLINK=="usbdisk", ACTION=="remove", \
udev triggert wohl "remove", weil aber /dev/usbdisk nicht mehr existiert, gibt es auch kein umount mehr.
Alles ganz einfach.

Gruß
Gräfin Klara
 

josef-wien

Ultimate Guru
Seit wann entfernt ein umount einen symlink? Der von der udev-Regel ausgeführte Befehl geht schlicht ins Leere, da die device zwar vorhanden, aber nicht mehr eingehängt ist.

LUH 3417 schrieb:
damit vor dem Abstöpseln der Disk unmount ausgeführt wird?
Es kann erst nach dem Abziehen erfolgen und dient dazu, einen sauberen Systemzustand herzustellen, da /proc/mounts ansonsten die device weiterhin als eingehängt führt. Für den Zustand des Wechseldatenträgers ist immer jene Person verantwortlich, die ihn entfernt.
 
A

Anonymous

Gast
Gräfin Klara schrieb:
Ist der user aber ein Erbsenzähler und er macht vor dem Abstöpseln ein
# umount ... usbdisk
Nach einem beendeten cp-Kommando zB kann es bei alten Flash-Speichern noch lange bis sehr lange dauern, bis alle Daten aus dem Puffer in das Zieldateisystem geschrieben sind. Ich vertraue da immer auf umount, dass ein Stream wirklich abgeschlossen ist, bevor ich irgendwas abziehe.
 

spoensche

Ultimate Guru
LUH 3417 schrieb:
Gräfin Klara schrieb:
Ist der user aber ein Erbsenzähler und er macht vor dem Abstöpseln ein
# umount ... usbdisk
Nach einem beendeten cp-Kommando zB kann es bei alten Flash-Speichern noch lange bis sehr lange dauern, bis alle Daten aus dem Puffer in das Zieldateisystem geschrieben sind. Ich vertraue da immer auf umount, dass ein Stream wirklich abgeschlossen ist, bevor ich irgendwas abziehe.

umount berücksichtigt keinen Buffer, weil der im Kernelspace liegt. Mit
Code:
sync
bist du auf der sicheren Seite.
 
A

Anonymous

Gast
Der Tipp ist gut. Wenn ich mehrere große Dateien hin- und herschaufeln muss, ist sync zwischendurch eine Erleichterung.
Aber mit umount verstehe ich das noch nicht: Wenn ich ich warte, bis die Shell wieder den Eingabeprompt zeigt, müsste doch der Daten-Stream ebenfalls abgeschlossen sein. Oder wie meinst du das "umount berücksichtigt keinen Buffer"?
 

josef-wien

Ultimate Guru
spoensche schrieb:
umount berücksichtigt keinen Buffer
Ich habe es nicht ausprobiert, aber ich interpretiere
manpage schrieb:
Note that a file system cannot be unmounted when it is 'busy' - for example, when there are open files on it, or when some process has its working directory there, or when a swap file on it is in use.
anders.

LUH 3417 schrieb:
Wenn ich ich warte, bis die Shell wieder den Eingabeprompt zeigt, müsste doch der Daten-Stream ebenfalls abgeschlossen sein.
Wenn Du den Kopierbefehl meinst, ist der erfolgreich abgeschlossen, sobald die letzten Daten in den Hauptspeicher gelesen wurden. Das Schreiben erfolgt standardmäßig asynchron. Beim Einhängen definiertes synchrones Schreiben verzögert den Vorgang sehr gewaltig, da pro Übertragungseinheit auf die Erledigt-Rückmeldung gewartet werden muß.
 
A

Anonymous

Gast
Kopieren meine ich, aber per drag 'n' drop in KDE/LXDE. Wenn ich dann nachdem der Kopierfortschritt als beendet angezeigt wird auf aushängen (unmount) klicke, vergeht da manchmal eine Weile…
 

josef-wien

Ultimate Guru
Ein umount in der Konsole wartet solange, bis der Schreibvorgang abgeschlossen wird, und hängt das Medium erst dann aus.

Grafische Oberflächen verwenden udisks2, da damit (bei entsprechenden policy kit-Berechtigungen) das Ein- und Aushängen von Wechseldatenträgern als Benutzer möglich ist, aber auch diese Aktionen verwenden letztlich mount und umount (als Programm oder als Funktion mount() bzw. umount2()). Welche der beiden Möglichkeiten
[i schrieb:
man umount2[/i]"]
Code:
MNT_DETACH (since Linux 2.4.11)
Perform a lazy unmount: make the mount point unavailable for new accesses, immediately disconnect the filesystem and all filesystems mounted below it from each other and from the mount table, and actually perform the unmount when the mount point ceases to be busy.

MNT_EXPIRE (since Linux 2.6.8)
Mark the mount point as expired. If a mount point is not currently in use, then an initial call to umount2() with this flag fails with the error EAGAIN, but marks the mount point as expired. The mount point remains expired as long as it isn't accessed by any process. A second umount2() call specifying MNT_EXPIRE unmounts an expired mount point. This flag cannot be specified with either MNT_FORCE or MNT_DETACH.
der Funktion umount2() jetzt zum Zug kommt, kann ich wirklich nicht beurteilen (und wenn es mir jemand zu erklären versucht, verstehe ich es ohnehin nicht).
 
Oben