Autofs allows to automatically mount a filesystem when changing directory to
the mounting point. The process is frozen while the file system is being
mounted, and then the chdir()
completes and enters the root of newly mounted
filesystem.
I have been using autofs for several years, at first for mounting USB sticks,
but now also for SMB shares and SSHFS. It is meant to be used for command-line
users, I don't doubt that modern desktop environments provide the same features
for GUI users.
The following describes my setup on a Debian Squeeze; there may be a more modern
way of doing things (the original setup was on a Debian Sarge). I assume that
you know how to administrate a Debian system (in other words, I won't be held
responsible for damaging your system if you follow those instructions without
understanding what they mean).
Autofs
The first step is to install the autofs
, bsdutils
, coreutils
,
lockfile-progs
, gawk
(or mawk
), sed
and the util-linux
packages
(most of those are probably installed already). The wget
package (and
command) allows me to write concise commands below, but feel free to use
any other tool to download the necessary files from my web page.
USB Automounter
This setup allows to mount automatically any USB Mass Storage device, without
the need to manually configure anything (as is the case in this Debian
tutorial).
Edit as root the /etc/auto.master
and add the following line:
/media /etc/auto.usb --timeout=3
Then run the following as root:
# mkdir -p /media
# mkdir -p /var/run/usbautomount
# mkdir -p /etc/usbautomount
# wget -O /etc/usbautomount/usbautomount http://weber.fi.eu.org/software/autofs/usbautomount
# chmod 755 /etc/usbautomount/usbautomount
# wget -O /etc/udev/usbautomount.rules http://weber.fi.eu.org/software/autofs/usbautomount.rules
# cd /etc/udev/rules.d
# ln -s ../usbautomount.rules z60_usbautomount.rules
# /etc/init.d/autofs restart
You then need to edit /etc/usbautomount/usbautomount
to change references to
mweber to your own username, and possibly change the mounting options (see
line 142 of the script). I still use latin1 as a character encoding, so I want
filenames to be automatically translated into latin1 for VFAT filesystems.
Other filesystems are mounted without particular options.
The idea here is that when you plug a USB Mass Storage device into the
computer, udev
runs the usbautomount
script that creates a name based on
the USB device's vendor, model, instance (in the case the physical device
contains more than one USB Mass Storage device, such as multi-card readers or
smartphones with internal and removable flash memory) and partition number,
creates a symlink in /var/run/usbautomount
that points to a directory of the
same name in /media
. When you access the symlink, automount
creates the
directory in /media
and mounts the file system from the USB device to that
directory.
If you chdir()
out of that directory, after 3 seconds automount
unmounts
the filesystem. If you chdir()
into the directory again, automount
mounts
it again. The short timeout for automatic unmounting allows to unplug the
device almost immediately after cd-ing out of the mount point (provided that
there is no data to be written onto the device anymore). When you unplug the
device, a script (generated by usbautomount
when the device was plugged in)
is run to remove the symlink from /var/run/usbautomount
.
The cherry on the cake of this setup is the following:
$ mkdir $HOME/mnt
$ ln -s /var/run/usbautomount $HOME/mnt/USB
This way, $HOME/mnt/USB
is automatically populated with links to the devices
that you plug to your computer.
SMB/CIFS shares
The smbclient
and cifs-utils
packages need to be installed.
Run as root:
# mkdir -p /mnt/smb
Edit as root the /etc/auto.master
and add the following line:
/mnt/smb /etc/auto.smb --timeout=10
(/etc/auto.smb
comes with the autofs
package).
Run this as your regular user:
$ ln -s /mnt/smb $HOME/mnt/smb
If you have an SMB/CIFS server named "foo" containing shares called "bar" and
"quux", then going into /mnt/smb/foo
will mount "bar" and "quux" in
/mnt/smb/foo/bar
and /mnt/smb/foo/quux
. Automatic unmounting will happen
10 seconds after leaving /mnt/smb/foo
.
If "foo" requires credentials (login and password), you can put them in
/etc/auto.smb.foo
as follows:
username = my_username
password = my_password
SSHFS
SSHFS itself requires some amount of setup. I will assume in the following
that the client computer is called "local" and it accesses using SSH and
SSHFS a remote computer called "remote" with user "user".
First, install the sshfs
package. Then you need to create an SSH key for
root@client, and authorize this key for user@remote. In the end, root@local
must be able to log into user@remote using an SSH key instead of a password.
Once this is working, run as root:
# mkdir -p /mnt/ssh
Then edit /etc/auto.master
as root and add the line:
/mnt/ssh /etc/auto.ssh --timeout=10,--ghost
Then create /etc/auto.ssh
and add a line that looks like this (change the
"user", and "remote" as needed):
remote -fstype=fuse,rw,nodev,nonempty,noatime,allow_other,max_read=65536 :sshfs\#user@remote\:
By default, SSHFS will mount the home directory of "user@remote" into
/mnt/ssh/remote
. If you need to acces another directory (e.g., /tmp
),
just append this path to the end of the line in /etc/auto.ssh
:
remote-tmp -fstype=fuse,rw,nodev,nonempty,noatime,allow_other,max_read=65536 :sshfs\#user@remote\:/tmp
Finally, run this as your regular user:
$ ln -s /mnt/ssh $HOME/mnt/ssh
CDROM
It just came to my mind the other day that I could automount CD and DVD as
well, but I haven't thought about the details yet. I remember the feature to
be very annoying in Solaris twelve years ago, where the system was mounting
the CD in a directory named after the label of the CD's filesystem, and never
removing this directory. After mounting a few discs, the automount directory
was filled with various directories with abtruse names, and you had to guess
which one contained your data (I suppose mount
would have told me what I
wanted to know, I don't remeber if I tried that).