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

Re: volume mgmt w/o gnome



On Sat, Dec 01, 2007 at 06:42:09PM -0500, Mark Grieveson wrote:
> Hello.  I use fluxbox most of the time.  But, when I plug in my hp315
> photosmart camera, I rely upon gnome to find it, and automagically
> mount it for me.  Is it possible to completely remove gnome, and just
> mount this camera (or other USB storage devices) myself?  Or, and even
> better, find a utility that, sans gnome, can automagically mount the
> camera itself?

Funny you should mention this, I've been working on this problem
myself lately. As a fluxboxer, I have been somewhat envious with the
ease with which the gnome/kde folk are able to use USB MSDs. 

For some time my approach was to write a udev rule for each new device
to give it a consistant name, write an autofs map for that device, and
set up a link in /media to the autofs mount. That way I could just plug
in my drive, cd to /media/whatever, do my thing, cd out of
/media/whatever, wait a few seconds for the automount to time out, and
unplug the drive. This is really convenient to use, but a PITA to set
up each time I got a new USB toy. Plus, my /media was filling up with
rarely used symlinks.

I finally got fed up with this and came up with the following
solution. When I plug in a USB device, udev calls a script which
writes an autofs map for that device and then reloads autofs. While
writing this I found the --ghost option which makes the symlink
creation unneeded. The mountpoints are created in /media/auto and are
named after the devices volume label, or failing this the device's
model name, falling back on /media/auto/removble_drive. Subsequent
devices with the same name are named /media/auto/somename.1, and so on.

Anyway, with autofs installed I added this to /etc/auto.master:

---CUT HERE---
/media/auto /etc/auto.removable  --timeout=2 --ghost
---CUT HERE---

I have these  udev rules in /etc/udev/rules.d/002_local_automount.rules
[beware of word-wrap]

---CUT HERE---
# use -*- SH -*- mode to turn off wordwrap in jed
#Specifying ENV{ID_FS_USAGE}=="filesystem" doesn't work on add, test inside run cmd
BUS=="usb|ieee1394",SUBSYSTEM=="block",ACTION=="add", run+="/usr/local/bin/removable_drive_handler"

#Specifying BUS doesn't work on remove, but you're unlikely to remove anything besides usb or fW
SUBSYSTEM=="block",ACTION=="remove",ENV{ID_FS_USAGE}=="filesystem", run+="/usr/local/bin/removable_drive_handler"
---CUT HERE---

Finally, /usr/local/bin/removable_drive_handler :

---CUT HERE---
#! /bin/bash

vfat_mount_options="-fstype=auto,quiet,sync,nodev,nosuid,gid=floppy,dmask=002,fmask=113,shortname=mixed"
unix_mount_options="-fstype=auto,sync,nodev,nosuid"
map_file="/etc/auto.removable"
default_mountpoint_name="removable_drive"
autofs_mount_dir="/media/auto"
autofs_pid_file="/var/run/autofs/_media_auto.pid"

#Clean out dead automounts, go through map file and remove any maps
#which refer to non-existant nodes in /dev
test "$ID_FS_USAGE" = "filesystem" || exit 0

case "$ACTION" in 

"remove" )
# clean out stale maps and remove specified map 
  echo \#Editing is futile, automatically generated at $(date) > $map_file.new
  while read key options location
  do
    if [ "$location" != ":$DEVNAME" -a -e "${location##:}" ] #Remove colon to look for node
    then
      echo $key $options $location >> $map_file.new
    fi
  done < $map_file

  mv $map_file.new $map_file
;;

"add" )
  # Figure out name for mountpoint
  if [ -n "ID_FS_LABEL_SAFE" ] #Prefer volume label as it's user controlled
  then 
    mountpoint="$ID_FS_LABEL_SAFE"
  elif [ -n  "$ID_MODEL" ] #Next try device model name
  then
    mountpoint="$ID_MODEL"
  else                     #Finally, use a default  
    mountpoint="$default_mountpoint_name"
  fi
 
  # If there's already a mountpoint with this name, try name.1, name.2 ...
  if [ -e "$autofs_mount_dir/$mountpoint" ]
  then
    n=1
    while [ -e "$autofs_mount_dir/$mountpoint.$n" ]
    do
      let "n += 1"
    done
    mountpoint=$mountpoint.$n
  fi
  
  # Add map for device using FS appropriate options
  if [ "$ID_FS_TYPE" = "vfat" ]
  then
    echo "$mountpoint" $vfat_mount_options :$DEVNAME >> $map_file
  else
    echo "$mountpoint" $unix_mount_options :$DEVNAME >> $map_file
  fi
;;
esac

# If kill doesn't work, use initscript
kill -HUP $(cat $autofs_pid_file) || /etc/init.d/autofs reload

---CUT HERE---

This is still very much a work in progress, so anybody with comments
or suggestions (keep it clean!) please feel free to chime in.

HTH

dt

-- 
Dave Thayer           | Whenever you read a good book, it's like the 
Denver, Colorado USA  | author is right there, in the room talking to 
dave@thayer-boyle.com | you, which is why I don't like to read 
                      | good books. - Jack Handey "Deep Thoughts"



Reply to: