Actually this is a straight forward thing, however since it has been a while I had to google it myself, and was astonished about how many non-working solutions I found, besides solutions that simply mount every USB according to their label. So here is the straight forward solution to mount a specific USB device to a specific location on your Unix hierarchical file system, using udev. It assumes that you have a running version of udev, and the udev tools. If not, please consult the distribution specific documentation on the Linux distribution of your choice. This might include recompiling your Kernel, as udev will need the following settings:
General setup ---> [*] Configure standard kernel features (expert users) ---> [ ] Enable deprecated sysfs features to support old userspace tools [*] Enable signalfd() system call Enable the block layer ---> [*] Block layer SG support v4 Networking support ---> Networking options ---> <*> Unix domain sockets Device Drivers ---> Generic Driver Options ---> () path to uevent helper [*] Maintain a devtmpfs filesystem to mount at /dev < > ATA/ATAPI/MFM/RLL support (DEPRECATED) ---> File systems ---> [*] Inotify support for userspace Pseudo filesystems ---> [*] /proc file system support [*] sysfs file system support
As for Gentoo Linux, the other things you will want to do, is to add “udev” to your USE-flags (by adding it into your /etc/portage/make.conf
), get udev installed (calling emerge -avuD sys-fs/udev
), and add udev to your sysinit runlevel (rc-update add udev sysinit
).
Now to the fun part. First of all you need to get some information about the device you are interested in. There are a number of ways, like using udev monitor, etc. Most of them, to me however, are too messy. If you have no idea about your device and still need to figure things out, blkid -o list
will show you a nice table of all devices, their device file, file system type, label, mount point and UUID – everything you need. For me, I know I have a stick with the label “Public” on an OS X with file system type exFat, and now I inserted it into a dual boot Linux with a number of partitions:
ancalagon ~ # blkid -o list device fs_type label mount point UUID --------------------------------------------------------------------------------------------------------------------------------------- /dev/sdb1 vfat /boot 58FB-332D /dev/sdb2 swap [SWAP] 73db158f-0e19-4d17-8c88-a8b0c1dff1f3 /dev/sdb3 ext4 /home 355af6d8-6f03-4a98-9a45-edafc3ccedde /dev/sdb4 ext4 / 63be67f3-5c7c-48ea-a8b3-58dff9da1737 /dev/sda1 ntfs Wiederherstellung (not mounted) 562065062064EF05 /dev/sda2 vfat (not mounted) 6265-B138 /dev/sda4 ntfs (not mounted) 6C58731C5872E46C /dev/sdc1 exfat Private /media/private 56B6-CE90 /dev/sdd1 exfat Public (not mounted) 56BE-6477 /dev/sda3 (not mounted)
If you want more information, with the device file you can get it with:
ancalagon ~ # udevadm info /dev/sdd1
I want the stick to be mounted at /media/public
, so I need to create a rule file; on Gentoo it lies under /etc/udev/rules.d/90-local-usb.rules
. Actually the name is totally arbitrary, except for the number at the beginning, and the extension that always has to be .rules
. The number should be something high, because we want udev to first run all other rules (e.g. the ones that assign the device to a device file) before running ours. 90 is a good value for that.
So in my case, this is what I added:
SUBSYSTEMS=="usb", ENV{ID_FS_UUID}=="56BE-6477", ACTION=="add", RUN+="/usr/bin/logger --tag udev Mounting public", RUN+="/bin/mount -o umask=0077,nosuid,uid=1000,gid=1001 '%E{DEVNAME}' /media/public"
We need to provide the system or subsystem, which for an USB device is usb. The UUID comes from blkid
and identifies the device. The action triggers when to run the command. In our case, when a new USB device is added and it has the UUID we want. And finally the mount command. I’ve added another command such that there is a log entry but thta is no need. And as I want it to be accessible as user, I added uid and gid accordingly. If you need to find out your user and group id, just run:
ancalagon ~ # id -u ancalagon ~ # id -g
And that’s it. If you want to see if the rule triggers, just run
ancalagon ~ # tail -f /var/log/everything/current
It should output:
[udev] Mounting public
somewhere. And you can <em>simulate</em> the USB event with udevadm, by triggering the rule you just wrote (although this is rather interesting for more general rules that should fit more than just one device). This is how it’s done:
ancalagon ~ # udevadm trigger --action="add" --property-match=ID_FS_UUID="56BE-6477"