From mboxrd@z Thu Jan 1 00:00:00 1970 From: "Eddie Shi" Date: Fri, 03 Jan 2003 23:27:04 +0000 Subject: RE: My first usb storage automount script :) Message-Id: List-Id: References: In-Reply-To: MIME-Version: 1.0 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable To: linux-hotplug@vger.kernel.org Hi, Does anyone know whether this will work on the following situation: 1. The usb-storage device (ie USB card reader) is alreay plugged in the system. 2. No CF/MS/SM/SD are plugged in yet. Given the above assumption , Will the system automount the CF when the CF card is plugged in ? Or We still need to manually enter " mount -t vfat /dev/sda1 /cf ". I guess what I would like to see is to have something like CD's automount when a CD is inserted. Thanks Eddie ---------------------------------------------------------------------------- ------------------ Hi there, I just wanted to share what I hacked up through some frustration. It's a script that will automatically mount usb devices that are attached. It ties in to the hotplug architecture as closely as possible, without changing anything. So then I subscribed to this list to announce it. Of course, that's when I discovered http://users.actrix.co.nz/michael/usbmount.html by Michael Hamilton. So I'll first give a rundown of differences: My solution: - only mounts the device that was just inserted (with some luck) - is called automount_usb, so that, by changing the usb.usermap, it gets called every time a device is inserted and not just the first time - creates remover scripts that have /bin/sh as the only dependency - creates nicely readable names as mount points - supports devices with multiple partitions - is really small But Michael's solution: - makes KDE icons - is easier to read So, please have a look at the attached code, and tell me what you think about the device detection code. Michael, if you read this, we could perhaps merge the two efforts and get all the features. Also, let's start a thread on making a gui.agent script that gets called by the hotplug scripts. It would notify the user of hotplug events. I feel that it should be called with the same environment as the other agents, with an extra HOTPLUG_PATH variable indicating the path on which the device is available, if applicable. This could then be used by KDE, Gnome etc to notify the user. Cheers, Wout. PS: /Please/ change usb.agent so that it creates /var/run/usb/ before pointing remover scripts there... ["automount_usb" (TEXT/PLAIN)] #!/bin/sh # Automount hotplugged usb storage devices. Copyright (c) 2002, Wout Mertens # This script is released under the GPL. # The usb devices will be mounted for the console user. # To work, this needs: # - kernel support: # - hotplugging, /proc, usbdevfs and devfs # - as modules: usb-storage, sd_mod, scsi_mod # - filesystems that will be mounted, like vfat # - ls, tr, echo, awk, basename, stat, grep, mount, umount, mkdir, rm, sed # TODO Fix usb.agent so that /var/run/usb gets created if missing # TODO Some rigid way of getting this run. Currently, I do # grep usb-storage /lib/modules/*/modules.usbmap|sed 's/usb-storage/automount_usb/' \ >> /etc/hotplug/usb.usermap # TODO Lots of testing # TODO nice way of setting options # TODO Also, the error checking should probably be more robust # TODO Some clean way of handling disconnects while writing. # TODO Make a generic event system for GUIs that shows that something was # mounted for the user. Proposal: /etc/hotplug/gui.agent gets # called with ACTION=ADd/remove, NAME=3Dnice_name, PATH=3Dnew_path, etc. # Not just for new storage, scanners and so on are useful too... # Dump debug mesg () { #return /usr/bin/logger -t $0 "$*" } # Figure out the device to mount NUM=3D`basename $DEVICE|sed 's/^0*//'` SERIAL=3D`awk -F=3D '/^T:.*/{if($0~/Dev#=3D *'$NUM' \ /){t=3D1}else{t=3D0}}t=3D1&&/SerialNumber/{print $2;exit}' /proc/bus/usb/de= vices` \ PRODUCT=3D`awk -F=3D '/^T:.*/{if($0~/Dev#=3D *'$NUM' /){t=3D1}else{t=3D0}}t=3D1&&/Product/{print \ $2;exit}' /proc/bus/usb/devices` # Use the serial or the product name to find which \ scsi host was just created if [ -n "$SERIAL" ]; then SCSI=3D`grep -l $SERIAL /proc/scsi/usb-storage-*/*|tail -1` elif [ -n "$PRODUCT" ]; then SCSI=3D`grep -l $PRODUCT /proc/scsi/usb-storage-*/*|tail -1` fi mesg Device No. $NUM, serial $SERIAL, name $PRODUCT, path $SCSI # Mount it if [ -n "$SCSI" ]; then # The name of the file is the number of the SCSI host SCSI=3D`basename $SCSI` PARTS=3D`ls /dev/scsi/host$SCSI/*/*/*/part*` MOUNTPATH=3D/mnt/usb/`echo $PRODUCT|tr '[ /?*"]' _` if [ -e "$MOUNTPATH" ]; then if mount|grep "$MOUNTPATH">/dev/null; then # TODO I'm too lazy to write proper collision avoidance code MOUNTPATH=3D"$MOUNTPATH".$$ fi fi # I'm hoping that mount ignores options that don't apply to the fs # These options should prevent abuse and make it writeable for the # console user. MOUNTOPTS=3D'-osync,nosuid'`stat -c',uid=3D%u,gid=3D%g' /dev/console` mesg Mounting $PARTS on $MOUNTPATH, options $MOUNTOPTS [ `echo $PARTS|wc -w` -eq 1 ] && MOUNTDIRECT=3D1 REMOVE for i in $PARTS; do if [ -n "$MOUNTDIRECT" ]; then T=3D$MOUNTPATH else T=3D$MOUNTPATH/`basename $i` fi mkdir -p $T if mount $MOUNTOPTS $i $T; then REMOVE=3D"umount $T;$REMOVE;rmdir $T" else rmdir $T fi done # Create remover echo "#!/bin/sh" > $REMOVER echo $REMOVE | sed 's/;;/;/g' >> $REMOVER chmod +x $REMOVER else exit 1 fi ------------------------------------------------------- This sf.net email is sponsored by:ThinkGeek Welcome to geek heaven. http://thinkgeek.com/sf _______________________________________________ Linux-hotplug-devel mailing list http://linux-hotplug.sourceforge.net Linux-hotplug-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/linux-hotplug-devel