usb hdd automount/autounmount udev

Hast Du Probleme mit Hardware, die durch die anderen Foren nicht abgedeckt werden? Schau auch in den "Tipps und Tricks"-Bereich.
Antworten
herrmeier
Beiträge: 41
Registriert: 04.12.2007 23:57:18

usb hdd automount/autounmount udev

Beitrag von herrmeier » 22.08.2014 15:06:46

Hallo und schon jetzt vielen Dank fürs Lesen!
  • Aufgabe:
Ein Raspberry Pi soll zunächst eine externe HDD automatisch erkennen [check] dann nachschauen, welche Partitionen vorhanden sind und diese dann automatisch nach /media/samsung/4TBext4 und /media/samsung/32GBntfs mounten. Wenn die USB-Platte im laufenden Betrieb abgestöpselt wird oder beim bootvorgang noch nicht erreichbar ist, soll sich das System daran nicht stören. Im Gegenteil, wenn im laufenden Betrieb abgestöpselt wird, soll das System die Platte automatisch unmounten und den mountpunkt wieder freigeben, für den Fall, dass die externe UBS-Platte danach wieder angestöpselt wird. Dies hat mit Flexibilität und Unerfahrenheit der Anwender zu tun. Diese können nicht manuell unmounten und die usb-kabelverbindung ist nicht immer stabil. Das Problem habe ich vor Jahren schon einmal gelöst. Leider natürlich nicht dokumentiert... :facepalm:
  • generelle Informationen zum System:

Code: Alles auswählen

auser@ahostname ~ $ uname -a
Linux ahostname 3.12.26+ #704 PREEMPT Wed Aug 20 22:35:11 BST 2014 armv6l GNU/Linux

Code: Alles auswählen

auser@ahostname ~ $ cat /proc/version 
Linux version 3.12.26+ (dc4@dc4-Latitude-E6510) (gcc version 4.8.3 20140303 (prerelease) (crosstool-NG linaro-1.13.1+bzr2650 - Linaro GCC 2014.03) ) #704 PREEMPT Wed Aug 20 22:35:11 BST 2014

Code: Alles auswählen

auser@ahostname ~ $ cat /etc/issue
Raspbian GNU/Linux 7 \n \l

Code: Alles auswählen

auser@ahostname ~ $ cat /etc/debian_version
7.6
  • problemspezifische Systeminformationen

Code: Alles auswählen

auser@ahostname ~ $ lsusb -vs 001:006|egrep ' idVendor|idProduct|iSerial'|grep -v grep
Couldn't open device, some information will be missing
  idVendor           0x04e8 Samsung Electronics Co., Ltd
  idProduct          0x6125 
  iSerial                 3

Code: Alles auswählen

auser@ahostname ~ $ ls /dev/sda*
/dev/sda  /dev/sda1  /dev/sda2

Code: Alles auswählen

sudo parted -l
...
Model: Samsung D3 Station (scsi)
Disk /dev/sda: 4001GB
Sector size (logical/physical): 4096B/4096B
Partition Table: gpt

Number  Start   End     Size    File system  Name  Flags
2      1049kB  3967GB  3967GB
1      3967GB  4001GB  33,6GB

Code: Alles auswählen

sudo blkid /dev/sda1
/dev/sda1: LABEL="usbhdd32gbntfs" UUID="XXXXXXXXXXXX5C16" TYPE="ntfs"
sudo blkid /dev/sda2
/dev/sda2: LABEL="usbhdd4tbext4" UUID="XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXX74f3" TYPE="ext4"

Code: Alles auswählen

sudo mkdir -p /media/samsung/4TBext4
sudo mkdir -p /media/samsung/32GBntfs
sudo chmod 777 /media/samsung
udevadm lasse ich wegen der Lesbarkeit zunächst raus.

Code: Alles auswählen

udevadm info -a -n /dev/sda
  • Litereratur/Webrecherche
teilweise löst dieser thread aus diesem Forum das Problem für vfat und ntfs, allerdings nicht für das unmounten und ext4, richtig?
viewtopic.php?f=13&t=146952&hilit=udev+usb+hdd
Dann habe ich noch diesen blog-Eintrag gefunden
http://www.bobjectsinc.com/tinycomputer ... sb-drives/
Ansonsten http://lmgtfy.com/ :D
http://lmgtfy.com/?q=debian+udev+usb+au ... 014+-fstab
  • Lösungsansatz
Wenn ich jetzt nur eine Partition hätte, dann müsste ich glaube ich folgende Regel erstellen:

Code: Alles auswählen

sudo sh -c 'echo "KERNEL==\"sda\", RUN+=\"/bin/mount /media/samsung\"" >> /etc/udev/rules.d/99-mount.rules'
Allerdings habe ich zwei Partitionen...Ich müsste also zwei udev-rules (98 und 99) erstellen...mmmhhh 8O :?:
Hat da einer eine Idee? Noch einmal: Herzlichen Dank fürs Lesen ich freue mich schon auf Eure Vorschläge!
Debian etch - testing

Benutzeravatar
niemand
Beiträge: 14004
Registriert: 18.07.2004 16:43:29

Re: usb hdd automount/autounmount udev

Beitrag von niemand » 22.08.2014 15:35:47

Du solltest das Konzept von Anfang an überdenken.
[…] wenn im laufenden Betrieb abgestöpselt wird, soll das System die Platte automatisch unmounten […]
… ist schlicht die falsche Herangehensweise. Das „Aushängen“ ist da nur noch Deko, das Wichtige beim Aushängen ist das FS – und das ist zu dem Zeitpunkt ggf. schon kaputt.
non serviam.

herrmeier
Beiträge: 41
Registriert: 04.12.2007 23:57:18

Re: usb hdd automount/autounmount udev

Beitrag von herrmeier » 22.08.2014 15:39:13

@niemand: vielen Dank für Deine Antwort. Grundsätzlich hast Du recht. Allerdings sollte eigentlich nichts schief gehen, da nicht regelmäßig auf die Platte zugegriffen wird. Es darf halt nur während des Backups nichts passieren. Kannst Du mir denn bzgl. der udev-rule helfen?
Debian etch - testing

Benutzeravatar
niemand
Beiträge: 14004
Registriert: 18.07.2004 16:43:29

Re: usb hdd automount/autounmount udev

Beitrag von niemand » 22.08.2014 15:47:27

Nein, kann ich nicht. Aber ’nen möglicherweise besseren Weg kann ich dir aufzeigen: pack’ das umount an das Ende vom Backupscript.
non serviam.

herrmeier
Beiträge: 41
Registriert: 04.12.2007 23:57:18

Re: usb hdd automount/autounmount udev

Beitrag von herrmeier » 22.08.2014 16:00:35

Dann wäre aber in der gesamten restlichen Zeit die Platte nicht erreichbar. Sie soll aber nicht nur das backup beinhalten, damit wäre sie mit 4TB zu groß, sondern auch als NAS für kleine Dateien in einigen samba-shares herhalten...wobei mir einfällt, dann müsste rein theoretisch auch in der udev-rule, samba neu gestartet werden, oder?
Debian etch - testing

herrmeier
Beiträge: 41
Registriert: 04.12.2007 23:57:18

Re: usb hdd automount/autounmount udev

Beitrag von herrmeier » 22.08.2014 19:21:29

Ich habe hier noch ein paar Beispiele rausgesucht, aus denen ich meine Lösung zusammenbasteln wollen würde...Aber ernsthaft dafür brauche ich ein bisschen Hilfe!
  • Variante1
http://www.axllent.org/docs/view/auto-mo...b-storage/
/etc/udev/rules.d/11-media-by-label-auto-mount.rules mit folgendem Inhalt:

Code: Alles auswählen

KERNEL!="sd[a-z][0-9]", GOTO="media_by_label_auto_mount_end"  
# Import FS infos  
IMPORT{program}="/sbin/blkid -o udev -p %N"  
# Get a label if present, otherwise specify one  
ENV{ID_FS_LABEL}!="", ENV{dir_name}="%E{ID_FS_LABEL}"  
ENV{ID_FS_LABEL}=="", ENV{dir_name}="usbhd-%k"  
# Global mount options  
ACTION=="add", ENV{mount_options}="relatime"  
# Filesystem-specific mount options  
ACTION=="add", ENV{ID_FS_TYPE}=="vfat|ntfs", ENV{mount_options}="$env{mount_options},utf8,gid=100,umask=002"  
# Mount the device  
ACTION=="add", RUN+="/bin/mkdir -p /media/%E{dir_name}", RUN+="/bin/mount -o $env{mount_options} /dev/%k /media/%E{dir_name}"  
# Clean up after removal  
ACTION=="remove", ENV{dir_name}!="", RUN+="/bin/umount -l /media/%E{dir_name}", RUN+="/bin/rmdir /media/%E{dir_name}"  
# Exit  
LABEL="media_by_label_auto_mount_end"
Sobald das script erstellt ist, abspeichern und neu starten

Code: Alles auswählen

udevadm control --reload-rules
  • Variante2
http://hakerdefo.blogspot.in/2014/06/how...ory_3.html

Code: Alles auswählen

 #! /bin/sh
KERNEL!="sd[b-z]*", GOTO="exit"
ACTION=="add", PROGRAM!="/sbin/blkid %N", GOTO="exit"
IMPORT{program}="/sbin/blkid -o udev -p %N"
ENV{ID_FS_LABEL}!="", ENV{dir_name}="%E{ID_FS_LABEL}"
ENV{ID_FS_LABEL}=="", ENV{dir_name}="flash_drive_%k"
ACTION=="add", RUN+="/bin/mkdir -p '/media/%E{dir_name}'"
ACTION=="add", ENV{mount_options_vfat}="auto,uid=1000,gid=1000,dmask=022,fmask=133"
ACTION=="add", ENV{ID_FS_TYPE}=="vfat", RUN+="/bin/sed -i '$a\/dev/%k /media/%E{dir_name} vfat %E{mount_options_vfat} 0 0' /etc/fstab"
ACTION=="add", ENV{ID_FS_TYPE}=="vfat", RUN+="/bin/mount -t vfat -o %E{mount_options_vfat} /dev/%k '/media/%E{dir_name}'"
ACTION=="add", ENV{mount_options_ntfs}="auto,uid=1000,gid=1000,dmask=022,fmask=133"
ACTION=="add", ENV{ID_FS_TYPE}=="ntfs", RUN+="/bin/sed -i '$a\/dev/%k /media/%E{dir_name} ntfs-3g %E{mount_options_ntfs} 0 0' /etc/fstab"
ACTION=="add", ENV{ID_FS_TYPE}=="ntfs", RUN+="/bin/mount -t ntfs-3g -o %E{mount_options_ntfs} /dev/%k '/media/%E{dir_name}'"
ACTION=="add", ENV{mount_options_ext2}="auto,users,exec,noatime"
ACTION=="add", ENV{ID_FS_TYPE}=="ext2", RUN+="/bin/sed -i '$a\/dev/%k /media/%E{dir_name} ext2 %E{mount_options_ext2} 0 2' /etc/fstab"
ACTION=="add", ENV{ID_FS_TYPE}=="ext2", RUN+="/bin/mount -t ext2 -o %E{mount_options_ext2} /dev/%k '/media/%E{dir_name}'"
ACTION=="add", ENV{mount_options_ext3}="auto,users,exec,noatime"
ACTION=="add", ENV{ID_FS_TYPE}=="ext3", RUN+="/bin/sed -i '$a\/dev/%k /media/%E{dir_name} ext3 %E{mount_options_ext3} 0 2' /etc/fstab"
ACTION=="add", ENV{ID_FS_TYPE}=="ext3", RUN+="/bin/mount -t ext3 -o %E{mount_options_ext3} /dev/%k '/media/%E{dir_name}'"
ACTION=="add", ENV{mount_options_ext4}="auto,users,exec,noatime"
ACTION=="add", ENV{ID_FS_TYPE}=="ext4", RUN+="/bin/sed -i '$a\/dev/%k /media/%E{dir_name} ext4 %E{mount_options_ext4} 0 2' /etc/fstab"
ACTION=="add", ENV{ID_FS_TYPE}=="ext4", RUN+="/bin/mount -t ext4 -o %E{mount_options_ext4} /dev/%k '/media/%E{dir_name}'"
ACTION=="remove", ENV{dir_name}!="", RUN+="/bin/umount -l '/media/%E{dir_name}'", RUN+="/bin/rmdir '/media/%E{dir_name}'"
ACTION=="remove", ENV{ID_FS_TYPE}!="", RUN+="/bin/sed -i '/\/dev\/%k /d' /etc/fstab"
LABEL="exit"
  • Variante3
http://www.forum-raspberrypi.de/Thread- ... eisen-udev
http://www.forum-raspberrypi.de/Thread-h...9#pid36509

Code: Alles auswählen

vi /etc/udev/rules.d/90-usbautomount.rules

Code: Alles auswählen

ACTION=="add", SUBSYSTEMS=="usb", KERNEL=="sd*", RUN+="/bin/bash /bin/usbmount.sh mount /dev/%k"
ACTION=="remove", SUBSYSTEMS=="usb", KERNEL=="sd*", RUN+="/bin/bash /bin/usbmount.sh umount /dev/%k"

Code: Alles auswählen

vi /bin/usbmount.sh && chmod +x /bin/usbmount.sh

Code: Alles auswählen

#/bin/bash
#
# nano /etc/udev/rules.d/90-usbautomount.rules
#
# ACTION=="add", SUBSYSTEMS=="usb", KERNEL=="sd*", RUN+="/bin/bash /bin/usbmount.sh mount /dev/%k"
# ACTION=="remove", SUBSYSTEMS=="usb", KERNEL=="sd*", RUN+="/bin/bash /bin/usbmount.sh umount /dev/%k"
#
MountTo=/media/hdd
ACTION=$1
DEVICE=$2
if [ "$ACTION" = "mount" ]; then
  [ ! -d $MountTo ] && mkdir -p $MountTo
   /bin/mount $DEVICE $MountTo
elif [ "$ACTION" = "umount" ]; then
   /bin/umount -f $DEVICE
fi

exit 0
Debian etch - testing

herrmeier
Beiträge: 41
Registriert: 04.12.2007 23:57:18

Re: usb hdd automount/autounmount udev

Beitrag von herrmeier » 03.09.2014 11:59:48

langsam nähere ich mich der angestrebten Lösung...
  • Seriennummer der angeschlossenen USB-festplatte herausfinden:

Code: Alles auswählen

udevadm info -a --p $(udevadm info -q path -n /dev/sda) | grep -i serial
    ATTRS{serial}=="000000000XXXXA49"
    ATTRS{serial}=="bcm2708_usb"
  • udev-Regel
Eine eigene udev-Regel erstellen, damit bei Anschluss der Platte die Mountpoints /media/samsung/32GBntfs und /media/samsung/4TBext4 erstellt werden. Dann werden die Partitionen gemountet. Beim abziehen des USB-Kabels, wird "unmounted" und der Mountpoint entfernt.

Code: Alles auswählen

/etc/udev/rules.d $ sudo vi 99-mount.rules
ACTION=="add", SUBSYSTEMS=="usb", ATTRS{serial}=="000000000XXXXA49", RUN+="/bin/mkdir -p /media/samsung/32GBntfs"
ACTION=="add", SUBSYSTEMS=="usb", ATTRS{serial}=="000000000XXXXA49", RUN+="/bin/mkdir -p /media/samsung/4TBext4"
ACTION=="add", SUBSYSTEMS=="usb", ATTRS{serial}=="000000000XXXXA49", RUN+="/bin/mount -t auto -o defaults /dev/sda2 /media/samsung/4TBext4"
ACTION=="add", SUBSYSTEMS=="usb", ATTRS{serial}=="000000000XXXXA49", RUN+="/bin/mount -t ntfs-3g -o uid=1000,gid=1000 /dev/sda1 /media/samsung/32GBntfs", OPTIONS="last_rule"
ACTION=="remove", SUBSYSTEMS=="usb", ATTRS{serial}=="000000000XXXXA49", RUN+="/bin/umount /media/samsung/32GBntfs"
ACTION=="remove", SUBSYSTEMS=="usb", ATTRS{serial}=="000000000XXXXA49", RUN+="/bin/umount /media/samsung/4TBext4"
ACTION=="remove", SUBSYSTEMS=="usb", ATTRS{serial}=="000000000XXXXA49", RUN+="/bin/rmdir -rf /media/samsung/32GBntfs"
ACTION=="remove", SUBSYSTEMS=="usb", ATTRS{serial}=="000000000XXXXA49", RUN+="/bin/rmdir -rf /media/samsung/4TBext4", OPTIONS="last_rule"
  • Neustart von udev mit der neuen Konfiguration
sudo /etc/init.d/udev restart
  • was passiert im syslog beim An- und Abstecken der Platte
Auszug aus /var/log/syslog
syslog wenn USB-Festplatte angeschlossen:

Code: Alles auswählen

...
Sep  2 23:25:57 ahostname kernel: [11548.836709] usb 1-1.3: new high-speed USB device number 8 using dwc_otg
Sep  2 23:25:57 ahostname kernel: [11548.938409] usb 1-1.3: New USB device found, idVendor=04e8, idProduct=6125
Sep  2 23:25:57 ahostname kernel: [11548.938446] usb 1-1.3: New USB device strings: Mfr=1, Product=2, SerialNumber=3
Sep  2 23:25:57 ahostname kernel: [11548.938463] usb 1-1.3: Product: D3 Station
Sep  2 23:25:57 ahostname kernel: [11548.938477] usb 1-1.3: Manufacturer: Samsung
Sep  2 23:25:57 ahostname kernel: [11548.938492] usb 1-1.3: SerialNumber: 000000000XXXXA49
Sep  2 23:25:57 ahostname kernel: [11548.946418] usb-storage 1-1.3:1.0: USB Mass Storage device detected
Sep  2 23:25:57 ahostname kernel: [11548.966704] scsi3 : usb-storage 1-1.3:1.0
Sep  2 23:25:58 ahostname kernel: [11549.967943] scsi 3:0:0:0: Direct-Access     Samsung  D3 Station       0202 PQ: 0 ANSI: 6
Sep  2 23:25:58 ahostname kernel: [11549.971251] sd 3:0:0:0: [sda] Spinning up disk...
Sep  2 23:25:58 ahostname kernel: [11549.971902] sd 3:0:0:0: Attached scsi generic sg0 type 0
Sep  2 23:26:08 ahostname kernel: [11555.476747] ......ready
Sep  2 23:26:08 ahostname kernel: [11560.527797] sd 3:0:0:0: [sda] 976754645 4096-byte logical blocks: (4.00 TB/3.63 TiB)
Sep  2 23:26:08 ahostname kernel: [11560.528631] sd 3:0:0:0: [sda] Write Protect is off
Sep  2 23:26:08 ahostname kernel: [11560.528666] sd 3:0:0:0: [sda] Mode Sense: 2b 00 10 08
Sep  2 23:26:08 ahostname kernel: [11560.529487] sd 3:0:0:0: [sda] Write cache: enabled, read cache: enabled, supports DPO and FUA
Sep  2 23:26:08 ahostname kernel: [11560.533531] sd 3:0:0:0: [sda] 976754645 4096-byte logical blocks: (4.00 TB/3.63 TiB)                                                          |
Sep  2 23:26:08 ahostname kernel: [11560.605680]  sda: sda1 sda2                                                                                                                   |
Sep  2 23:26:08 ahostname kernel: [11560.616089] sd 3:0:0:0: [sda] 976754645 4096-byte logical blocks: (4.00 TB/3.63 TiB)                                                          |
Sep  2 23:26:08 ahostname kernel: [11560.619297] sd 3:0:0:0: [sda] Attached SCSI disk                                                                                              |
Sep  2 23:26:10 ahostname kernel: [11562.298365] EXT4-fs (sda2): recovery complete
...

syslog wenn USB-Festplatten-Kabel entfernt wird:

Code: Alles auswählen

...
Sep  2 23:25:16 ahostname kernel: [11508.403470] usb 1-1.3: USB disconnect, device number 7
Sep  2 23:25:16 ahostname kernel: [11508.424781] end_request: I/O error, dev sda, sector 0
Sep  2 23:25:16 ahostname kernel: [11508.438101] sd 2:0:0:0: [sda] Synchronizing SCSI cache
Sep  2 23:25:16 ahostname kernel: [11508.438443] sd 2:0:0:0: [sda]
Sep  2 23:25:16 ahostname kernel: [11508.438467] Result: hostbyte=0x01 driverbyte=0x00
Sep  2 23:25:16 ahostname ntfs-3g[6273]: Unmounting /dev/sda1 (usbhdd32gbntfs)
Sep  2 23:25:16 ahostname ntfs-3g[6273]: Failed to sync device /dev/sda1: Input/output error
Sep  2 23:25:16 ahostname ntfs-3g[6273]: Failed to close volume /dev/sda1: Input/output error
Sep  2 23:25:16 ahostname kernel: [11508.583508] Buffer I/O error on device sda2, logical block 483950592
Sep  2 23:25:16 ahostname kernel: [11508.583542] lost page write due to I/O error on sda2
Sep  2 23:25:16 ahostname kernel: [11508.583561] JBD2: Error -5 detected when updating journal superblock for sda2-8.
...
  • Wie wird die Platte gemountet

Code: Alles auswählen

mount
...
/dev/sda2 on /media/samsung/4TBext4 type ext4 (rw,relatime,data=ordered)
/dev/sda1 on /media/samsung/32GBntfs type fuseblk (rw,nosuid,nodev,relatime,user_id=0,group_id=0,default_permissions,allow_other,blksize=4096)
Damit bin ich also noh nicht ganz zufrieden...Aber es geht voran...;-)
Debian etch - testing

herrmeier
Beiträge: 41
Registriert: 04.12.2007 23:57:18

Re: usb hdd automount/autounmount udev

Beitrag von herrmeier » 08.02.2017 21:44:05

Das Thema hat mich noch nicht ganz verlassen.
Dabei ist mir allerdings aufgefallen, dass ein /bin/rmdir -rf mountpoint ohne check ob der umount geklappt hat nicht so clever sein könnte.
Also überlege ich gerade wie ich vorher noch prüfe ob die externe Platte noch gemounted ist:

Code: Alles auswählen

ACTION=="remove", SUBSYSTEMS=="usb", ATTRS{serial}=="xxxxxxxxxxxxxxxxxxxxxxx", RUN+="/bin/umount /media/samsung/ext4MyBook", RUN+="/bin/sleep 60", RUN+="/bin/rmdir /media/samsung/ext4MyBook"
Kommando zurück...rtfm:
NAME
rmdir - remove empty directories
SYNOPSIS
rmdir [OPTION]... DIRECTORY...
DESCRIPTION
Remove the DIRECTORY(ies), if they are empty.
Ein sleep ist also nicht notwendig. Das Verzeichnis wird nur gelöscht, wenn es leer ist... Dennoch Korrektur: rmdir -rf funktioniert nicht es gibt nur die optionen -p, --ignore-fail-on-non-empty, -v. Diese werden nicht benötigt.
Debian etch - testing

Antworten