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

Re: Getting the same USB device?



On Mon, Feb 09, 2004 at 11:42:56AM -0700, Monique Y. Herman wrote:
> On 2004-02-09, Norman Walsh penned:
> > --=-=-=
> >
> > I have three or four "plug in" devices: a firewire PCMCIA card and
> > several USB devices. Depending on the order in which they're added to
> > the system, they get installed in different places. Is there any way
> > to control that behavior? Is there any way to make the USB floppy, for
> > example, always have the same device name irrespective of what else is
> > installed?
> >
> 
> I've heard that this is addressed in the 2.6 kernel through 'udev' ... I
> know nothing beyond that, though.
> 
> -- 
> monique
> 

This works for my USB devices. I found it on the UserLinux list.
You need devfs and hotplug installed.

#######################

#!/bin/sh
# name : /usr/sbin/updfstab
# this script is automatically called by hotplug at each plug/unplug
# event of an usb-storage device. (usb keys, mp3 jukeboxes, digital
# cameras...)
 
# be sure the driver is loaded (tested on debian only, with default
# settings of devfs)
modprobe /dev/scsi
 
# list devices
list=`find /proc/scsi -type f|grep usb-storage`
 
for i in $list; do
  # for each device, get infos
  vendor=`cat $i |grep Vendor:|sed 's/ *Vendor: *//g'|sed 's/ /_/g'`
  product=`cat $i |grep Product:|sed 's/ *Product: *//g'|sed 's/ /_/g'`
  host=`cat $i |grep Host|cut -c13`
  attached=`cat $i |grep Attached:|cut -c16`
 
  # find partitions in /dev/scsi/host${host}
  partitions=`find /dev/scsi/host${host} -name "part*"`
  #echo "partitUntitled 1ions = <${partitions}>"
  # if not attached, remove !
  if [ "${attached}" = "N" ]; then
    echo "scsi remove-single-device ${host}" > /proc/scsi/scsi
    partitions="none"
  else
  # if attached and no partitions, add the device to the scsi chain.
    if [ -z "${partitions}" ]; then
      echo "scsi add-single-device ${host}" > /proc/scsi/scsi
      timeout=20
      # now we can detect partitions
      while [ -z "${partitions}" ]; do
        timeout=$((${timeout}-1))
        sleep 0,5
        partitions=`find /dev/scsi/host${host} -type b -name "part*"`
        if [ ${timeout} -eq 0 ]; then partitions="none"; continue; fi
      done
    fi
  fi
   
  # for each partition, create a mountpoint and an fstab entry
  for p in ${partitions}; do
    # create a mountpoint name
    if [ `echo ${partitions}|wc -w` -eq 1 ]; then
      partnum=""
    else
      partnum="_`basename $p`"
    fi
    if [ "${vendor}" = "${product}" ]; then
      #mntpoint=/mnt/${vendor}${partnum}
      mntpoint=/mnt/${vendor}
    else
      #mntpoint=/mnt/${vendor}_${product}${partnum}
      mntpoint=/mnt/${vendor}${partnum}
    fi
    # create the mountpoint and the fstab entry
    if [ "${attached}" = "Y" ]; then
      if [ "$p" = "none" ]; then
        #Xdialog --title "USB hotplug" --msgbox "Could not find
partitions in\n${vendor}\nIs it formatted ?" 10 40
        exit
      fi
      if [ ! -d ${mntpoint} ]; then
        mkdir ${mntpoint}
        #echo "created ${mntpoint}"
      fi
      if ! grep "$p *${mntpoint}" /etc/fstab >/dev/null 2>&1; then
#        echo "$p ${mntpoint} auto user,noauto,rw,iocharset=utf8 0 0" >>
#        /etc/fstab
        echo "$p ${mntpoint} auto defaults,user,noauto 0 0" >>
/etc/fstab
        #echo "added $p ${mntpoint} in fstab"
      fi
    else
      # purge fstab and /mnt
#      if [ `mount|grep -c "$p on ${mntpoint}"` -eq 0 ]; then
#        # we can unmount now because we were mounted with option sync
#       fuser -uv ${mntpoint} > /tmp/toto${mntpoint}
#        umount ${mntpoint}
#      fi
#      if [ `mount|grep -c "$p on ${mntpoint}"` -eq 0 ]; then
#        # impossible to unmount...!
#        echo "Houston we have a problem"
#      fi
      if [ -d /mnt/${vendor} ]; then
        rmdir /mnt/${vendor}*
        #echo "removed ${mntpoint}"
      fi
      cat /etc/fstab | grep -v " /mnt/${vendor} " > /etc/fstab.updated
      if diff /etc/fstab /etc/fstab.updated >/dev/null 2>&1; then
        rm /etc/fstab.updated
      else
        if [ -s /etc/fstab.updated ]; then
          cat /etc/fstab.updated > /etc/fstab
          #echo "removed $p ${mntpoint} from fstab"
        fi
        rm /etc/fstab.updated
      fi
    fi
  done
done

#####################



Reply to: