Last week, I set up udev on my desktop machine. udev is the Linux 2.6 way of dynamically managing the /dev directory. It populates /dev only with devices that actually exist, and adds and removes entries as devices are plugged in or removed from the system. In addition, it allows the entries in /dev to be named consistently.
Consistent naming of /dev entries solves a big problem with using USB devices under Linux. Many USB devices use the usb-storage module, appearing as SCSI devices. The problem is that the name the kernel gives to the devices depends on the order in which they are plugged into the system.
For example, I might plug my iPod Shuffle into my
computer, and the kernel would name it /dev/sdd
. Then I plug in my camera, and the kernel would call it
sde
. But if I had plugged them in in the opposite order, their
names would have been reversed. This makes it difficult to mount them without
first checking dmesg
to find out what the device has been named.
udev solves this problem by allowing me to tell it what to name a device when
it is detected. udev uses information from sysfs to determine which device
is plugged in. I have configured udev to name a device whose vendor attribute
is "Apple" /dev/ipod and a device whose vendor is "Pentax" /dev/camera. The
Debian udev packages
put the udev rules in /etc/udev/rules.d. So I created
/etc/udev/rules.d/50-custom.rules which contains:
BUS=="scsi", SYSFS{vendor}=="Pentax", NAME{all_partitions}="camera", GROUP="plugdev"
BUS=="scsi", SYSFS{vendor}=="Apple", NAME{all_partitions}="ipod", GROUP="plugdev"
The NAME{all_partitions}
part tells udev to create device entries
for all of the block device's partitions, so it will create
/dev/ipod[1-15]
and /dev/camera[1-15]
, allowing me to
mount the FAT partitions on each. See Daniel Drake's guide to writing udev rules for more
information on configuring udev.
Now that my iPod and camera are consistently named, I'd like to be able to access them from within gtkpod and digikam, the applications I use to manage the files on them, respectively, without having to manually mount them. While gtkpod has an option to mount the iPod, digikam does not. I have my camera set up in digikam as a generic USB mass storage device, for which you just need to configure a directory to browse.
Following the debian-administration.org
tutorial, I set up autofs to automatically mount the usb devices when they are
accessed, and unmount them when they're no longer being used.
So after installing the autofs
package, I added the following line to /etc/auto.master
:
/var/autofs/removable /etc/auto.removable --timeout=2
And in /etc/auto.removable, I put:
ipod -fstype=vfat,rw,gid=46,umask=002 :/dev/ipod1
camera -fstype=vfat,rw,gid=46,umask=002 :/dev/camera1
Then I made /media/ipod
a symlink to
/var/autofs/removable/ipod
and /media/camera
a
symlink to /var/autofs/removable/camera
. When I access
/media/camera
, automount
automatically mounts
/dev/camera1 as /var/autofs/removable/camera
if it has been
created by udev
. After it hasn't been accessed for two seconds,
it will be unmounted (which might take a little while if there are buffers
which haven't been flushed out to the drive).
Update (8/12/06): I fixed the rules to use the proper equality test, == rather than =, which newer versions of udev require. Thanks to Andrew Schulman for pointing this out.
The state is that great fiction by which everyone tries to live at the expense of everyone else. - Frederic Bastiat