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: