After the move, I've found myself annoyed by the way the Gnome desktop handles removable media, in particular media cards such as Flash and Secure Digital (SD). One trick I learned a while back, was to make sure to assign an e2label to cards formatted with an ext filesystem. This way, when Gnome automounts the media and places an icon on the desktop, the name is the e2label. Without an e2label, the icon's text is the device size. This is also true of FAT devices.
The real problem, however, is the fact that the device is owned by root. Since the desktop is running as an unprivileged user (because we never login the GUI as root... right?) we are faced with an icon for an device that we can't drop-and-drag to. Doh! Here's how I used Udev to trick the system into allowing my GUI account to use these devices.
First, insert the device, allow it to automount, and appear on the desktop. (We won't worry with how the kernel, udev, fuse, and the desktop is accomplishing this.) Assuming an ext device, it was probably mounted to a dynamic mountpoint under /media; in this case, we ended up with:
# mount | grep mediaThe goal is to modify a few mount options and change the ownership of the device. To accomplish this, we need to tell Udev to watch for a given device and respond in a specific manner. This requires isolating a unique aspect of the device that can be used a s trigger. The command to manage Udev changed with RHEL6:
/dev/sdb1 on /media/Flash_1GB type ext3
(rw,nosuid,nodev,uhelper=udisks)
# ls -ld /media/Flash_1GB
drwxr-xr-x. 4 root root 4096 Feb 9 15:55 /media/Flash_1GB/
# udevadm info --query=all --attribute-walk --name=/dev/sdbThere are a few things to notice about this output. On the command line, the name is the disk, not the mounted partition. The top most block is the device, blocks that follow are upstream devices. We are most interested in the ATTR fields. Don't be seduced by the first directive, "KERNEL=="sdb"... we all know that Linux is notorious for changing device letters on reboot.
<snip>
looking at device '/devices/<snip>/6:0:0:0/block/sdb':
KERNEL=="sdb"
SUBSYSTEM=="block"
DRIVER==""
ATTR{range}=="16"
ATTR{ext_range}=="256"
ATTR{removable}=="1"
ATTR{ro}=="0"
ATTR{size}=="2001888"
<snip>
looking at parent device '/devices/<snip>/6:0:0:0':
KERNELS=="6:0:0:0"
SUBSYSTEMS=="scsi"
DRIVERS=="sd"
<snip>
ATTRS{vendor}=="Generic-"
ATTRS{model}=="Compact Flash "
<snip>
Second, Udev rules are created as code snippets in the /etc/udev/rules.d dir. For simplicity sake, create a file called 99-local.rules and add all machine specific rules to this one file. Each rule is one line. There are many sophisticated and elegant things that can be done by Udev, but my example is a simple sledgehammer:
SUBSYSTEMS=="scsi",The first directive tells the machine that we're dealing with a disk (we could have used "block".) The second directive is an attribute that was listed for the device (notice the spaces: it has to exactly match the output from udevadm.) The third attribute is the device size, so this rule applies just to this card, or atleast to cards with exactly this number of sectors. The last part of the rule is the RUN command, which executes a set of bash commands. In this case, I'm changing the default mount options, then I'm changing the mount point ownership. Using the RUN feature provides infinite flexibility.
ATTRS{model}=="Compact Flash ",
ATTR{size}=="2001888",
RUN+="/bin/sh -c 'mount /media/Flash_1GB
-o remount,noatime,nodiratime,async;
chown doug:doug /media/Flash_1GB' "