[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: Probleme mit USB



Martin Dickopp schrieb:
Andreas Pakulat <apaku@gmx.de> writes:


Wenn ich mount eingebe, erscheint als letzte Zeile - egal ob der
Stick steckt oder nicht -
usbfs on /proc/bus/usb type usbfs (rw)

Ja, automatisch mounten gibts fuer sowas nicht.


Mit udev ist auch automatisches Mounten relativ leicht zu bewerk-
stelligen. Ich habe zu diesem Zweck ein Skript geschrieben, welches
hier erhältlich ist: http://www.zero-based.org/debian/usbmount.html


Ich mache das mit hotplug (udev hab ich mir noch nicht angesehen) und einem leicht angewandelten Script von hier:
http://forums.gentoo.org/viewtopic.php?t=113911

und es funktioniert auch wunderbar.

Es liest den Modell-Namen des Sticks aus und erzeugt unter /mnt/usb/<name> ein Verzeichnis und mountet dort den Stick unter dem aktuell angemeldeten Nutzer.

Ich habs mal attached.
Könnte man eventuell sogar erweitern für das automatische mounten aller Partitionen von via USB angeschlossenen Festplatten.

Wäre eigentlich auch schön wenn solche Scripte gleich zum Hotplug Package gehören würden. (eventuell default disabled via /etc/defaults/hotplug oder so)

MfG
Markus Schulz
#!/bin/sh
#
# Automount hotplugged block devices, by Wout Mertens (wmertens@gentoo.org)
#  simple changes by Markus Schulz (msc@antzsystem.de)
# Linux v2.6 version
# This script is released under version 2 of the GPL.

# To install this, either make it /sbin/hotplug, or, if you have
# linux-hotplug installed, make it /etc/hotplug.d/block/automount.hotplug .
# It needs to be executable. I tested it with busybox's ash.
#
# The devices will be mounted for the console user if applicable.
#
# To work, this needs:
# - v2.6 kernel support:
#   - hotplugging, /proc mounted, /sys mounted
#   - filesystems that will be mounted, like vfat
# - sh, echo, sed, stat or ls, getent or grep passwd,
#   mount, umount, mkdir, rmdir. logger is used if there.
#
# Possible improvements:
# - Create a desktop entry for the device.
# - Call a notifier script when mounting/unmounting. This could create the
#   desktop entry by itself.
# - Edit fstab instead, and give the "user" option. This depends more on
#   the user/desktop knowing what he/it is doing.
# - Mount as supermount if available. This will improve behaviour for
#   synchronous writes and hanging mounts, although umount -lf already
#   does a good job. UPDATE: added, but untested. Let me know if it works.
# - Detect filesystem on device, so filesystems that don't need a mounting
#   user can skip user detection.

# Debugging
#set -xv
#exec > /tmp/hotplug.$$ 2>&1 

PATH="/bin:/sbin:/usr/bin:/usr/sbin"
export PATH

# We only handle block device messages
[ "$1" != "block" ] && exit 0

# Proclaim stuff to the world
mesg () {
	logger -t $0 "$*"
}

# Is path already mounted?
is_path_mounted () {
	while read dev path rest
	do
		if [ "$path" = "$1" ]
		then
			return 0
		fi
	done < /proc/self/mounts
	return 1
}

# Get mounted path for a device
get_mounted_path () {
	while read dev path rest
	do
		if [ "$dev" = "$1" ]
		then
			echo "$path"
			return 0
		fi
	done < /proc/self/mounts
	return 1
}

# Wait for a file to appear
wait_for () {
	local count=0
	while [ $count -lt 10 ] && [ ! -e "$1" ]
	do
		sleep 1
	done
	[ $count -eq 10 ] && return 1
	return 0
}

# Remove strange characters from a filename
clean_filename () {
	# Note the lack of quotes around $1, this strips off spaces.
	echo $1 | sed 's/[ /?*\"<>]/_/g'
}


# Figure out the device to mount
#set `echo $DEVPATH | sed 's/\// /g'`
#[ $# -ne 3 ] && exit 0
#DEVICE=/dev/$3

#Changed by Markus Schulz cause original (above) don't work anymore?
#remove subsystem name from DEVPATH (script only called for block)
DEVNAME=`echo $DEVPATH | sed 's/\/block\///g'`
DEVICE=/dev/$DEVNAME

if [ "$ACTION" = "remove" ]
then
	# Is it ours?
	dir=`get_mounted_path $DEVICE`
	echo "$dir" | grep -q ^/mnt/usb || exit 0

	# Unmount it
	[ -d "$dir" ] || exit 1
	umount -lf "$dir"
	rmdir "$dir"
	exit 1
fi

if [ "$ACTION" = "add" ]
then
	# Is it a usb device? Exit if not.
	ls -l /sys/block/$DEVNAME/device | sed 's/^.* -> //g' | grep -q usb || exit 0
	
	# Mount it

	# Make sure we have support for vfat
	modprobe -q vfat

	wait_for /sys/block/$DEVNAME/device/vendor || exit 1

	# Find the name
	PRODUCT=`cat /sys/block/$DEVNAME/device/model`
	if [ -z "$PRODUCT" ]
	then
		PRODUCT=generic
	fi
	# Find out where we mount it
	MOUNTPATH=/mnt/usb/`clean_filename "$PRODUCT"`
	if is_path_mounted "$MOUNTPATH"
	then
		count=1
		while is_path_mounted "${MOUNTPATH}_${count}"
		do
			count=$(( $count + 1 ))
		done
		MOUNTPATH="${MOUNTPATH}_${count}"
	fi
	# Make sure it's a directory
	if [ -e "$MOUNTPATH" ]
	then
		if [ ! -d "$MOUNTPATH" ]
		then
			mesg "$MOUNTPATH exists but is not a directory"
			exit 1
		fi
	else
		mkdir -p "$MOUNTPATH"
		if [ $? -ne 0 ]
		then
			mesg "Could not create mountpoint $MOUNTPATH"
			exit 1
		fi
	fi
	# Find out who we are going to mount it as
	CONSOLEUSER=`users`
	if [ -z "$CONSOLEUSER" ]
	then
		CONSOLEUSER=`stat -c%U /dev/console 2>/dev/null`
		if [ -z "$CONSOLEUSER" ]
		then
			set `ls -l /dev/console`
			CONSOLEUSER=$3
		fi
	fi
	[ -n "$CONSOLEUSER" ] || CONSOLEUSER=root
	PASSWD=`getent passwd $CONSOLEUSER 2>/dev/null`
	if [ -z "$PASSWD" ]
	then
		PASSWD=`grep "$CONSOLEUSER" /etc/passwd||grep root /etc/passwd`
	fi
	if [ -z "$PASSWD" ]
	then
		mesg "Could not get password entry for $CONSOLEUSER"
		exit 1
	fi
	set `echo $PASSWD | sed 's/:/ /g'`
	if [ $# -lt 4 ]
	then
		mesg "Bad password entry for $CONSOLEUSER"
		exit 1
	fi

	# These options should prevent abuse and make it writeable for the
	# console user.
	if grep -q supermount /proc/filesystems
	then
		MOUNTOPTS="-s -t supermount -onoatime,nosuid,umask=077,uid=$3,gid=$4"
	else
		MOUNTOPTS="-s -onoatime,sync,dirsync,nosuid,umask=077,uid=$3,gid=$4"
	fi
	mesg Mounting $DEVICE on $MOUNTPATH, options $MOUNTOPTS

	mount $MOUNTOPTS $DEVICE $MOUNTPATH
fi

Reply to: