DæmonNews: News and views for the BSD community

February 2002 Get BSD New to BSD? Search BSD Submit News FAQ Contact Us Join Us
Search


Get BSD Stuff

Fun With Automounting on FreeBSD

Renaud Waldura <renaud+amd@waldura.com>

Tired of having to login as root and type:

	# mount -t cd9660 /dev/cd0c /mnt 

everytime you want to read a CD-ROM? Automounting is for you! Once properly configured (the goal of this document), you will only have to insert the CD into your drive, cd to /cdrom and wham everything happens automagically!

My foray into the wonderful world of automounting started the day I got my hands on a big, noisy hard drive: I wanted the disk space for backup files and stuff, but couldn't bear the awful, high-pitched noise it generated day and night. So I configured my FreeBSD box to automount the drive whenever needed, then unmount it and spin the drive down when it wasn't used anymore.

DISCLAIMER
I am by no means an amd/NFS guru, only a user of those technologies. While I believe this document to be correct and helpful, I cannot take responsibility for any prejudice that might occur following the instructions included herein. Quite the contrary, I am so unsure of myself that I will wholeheartedly welcome any correction/addition sent to me (interested parties can find my address at the top of this document).

This document is about automounting local filesystems only; network mounts are not covered by this document.

0. PRE-REQUISITES

A partition or single-partition device candidate for automounting (e.g. a CD-ROM drive, a floppy drive).

A computer running FreeBSD 4.0 or greater.

1. KERNEL CONFIGURATION

The automounter needs the NFS code to be present in your kernel. With FreeBSD 4.0 the corresponding kernel module can and will be autoloaded on demand, but if you're running an earlier version or wish to compile it statically anyway, you can do so by adding:

	options		NFS

to your kernel configuration file (/sys/i386/conf/KERNEL). Personally I don't bother and just use the autoloading feature.

Autoloading works just fine with the GENERIC kernel shipped with FreeBSD 4.0. In other words, if you are running a stock FreeBSD 4.0 or greater installation, you're in luck, there's nothing to do.

Now for the various devices: as you probably know, at boot-time FreeBSD detects your hardware and initializes it. You can re-access the list of detected hardware after boot with the "dmesg" command. IT MUST SHOW YOUR CD-ROM/FLOPPY/ETC.

For example:

fdc0: <NEC 72065B or clone> at port 0x3f0-0x3f5,0x3f7 irq 6 drq 2 on isa0
fdc0: FIFO enabled, 8 bytes threshold
fd0: <1440-KB 3.5" drive> on fdc0 drive 0

is a floppy drive, and:

cd0 at ahc0 bus 0 target 4 lun 0
cd0: <SONY CD-R   CDU924S 1.1d> Removable CD-ROM SCSI-2 device 
cd0: 4.032MB/s transfers (4.032MHz, offset 15)
cd0: Attempt to query device size failed: NOT READY, Medium not present

is a SCSI CD-R (rewritable CD) device. The device names, here fd0 and cd0, are important, we will use them very soon -- remember them.

2. CONFIGURING MOUNT

Before automounting your devices, we need to make sure they can be mounted manually. Insert a CD into your drive, and try as root:

# mount -v -t cd9660 /dev/cd0c /mnt

``cd0'' above should be replaced with whatever your actual device is (that's what we found out above). The mount point ``/mnt'' is a temporary mountpoint perfect for the kind of testing we're doing now. We mount the ``c'' partition, aka the whole disk.

The filesystem type (here ``cd9660'') must match whatever format your data is in on the disk. For CDs it's almost always cd9660, but for floppies you should use "msdos" instead:

# mount -v -t msdos /dev/fd0c /mnt

At this point your disk should be mounted; cd to /mnt and poke around to make sure your data is there. Then unmount the disk with:

# umount -v /mnt

Now you can edit /etc/fstab to make this mount semi-permanent. I added the following lines to mine:

/dev/cd0c       /mnt/cdrom      cd9660  ro,noauto,nodev,nosuid  0       0
/dev/fd0c       /mnt/floppy     msdos   rw,noauto               0       0

Make sure you specify the "noauto" option in the fourth column. Noauto in /etc/fstab means that the partition won't be mounted automatically at boot-time, definitely what you want since most of the time your CD/floppy won't be present. This flag is unrelated to the kind of on-demand automounting we're trying to do here.

Also note how the CD-ROM is mounted read-only (``ro'') without devices or setuid binaries. It's not strictly necessary but cleaner. The last columns are left to zero, since you will never backup those partitions, and they don't need to be checked with fsck(8).

This change made, create the two directories /mnt/cdrom and /mnt/floppy. Now you can merely issue:

# mount /mnt/cdrom

and your CD-ROM should be mounted just as before. Poke around /mnt/cdrom, and unmount it:

# umount /mnt/cdrom

You're ready for the next step, the automounter itself.

3. CONFIGURING THE AUTOMOUNTER

The default configuration on FreeBSD 4.0 includes provisions for the automounter. Edit your /etc/rc.conf file to include these:

portmap_enable=YES
amd_enable=YES
amd_flags="-a /.amd_mnt -c 3636 -l syslog /host /etc/amd.map"

The ``3636'' above is the timeout value in seconds: amd will unmount your filesystem after it's been quiescent for this many seconds.

Create the /.amd_mnt directory as root, although I'm not very clear on what it is used for. DO NOT create a /host directory.

Now edit the amd.map file to reflect this:

/defaults		type:=host;fs:=${autodir}/${rhost};rhost:=${key}

*			opts:=rw,grpid,resvport,nfsv2

localhost		type:=auto;fs:=${map};pref:=${key}/

localhost/cdrom		type:=program;fs:=/mnt/cdrom;\
			mount:="/sbin/mount mount /mnt/cdrom";\
			unmount:="/sbin/umount umount /mnt/cdrom"

localhost/floppy	type:=program;fs:=/mnt/floppy;\
			mount:="/sbin/mount mount /mnt/floppy";\
			unmount:="/sbin/umount umount /mnt/floppy"

As you can see, your CD-ROM drive will be mounted at /host/localhost/cdrom, not a very convenient location. Create a symbolic link /cdrom pointing to /host/localhost/cdrom:

# ln -s /host/localhost/cdrom /cdrom

At this point, we have implemented the following:

                symlink
	/cdrom ---------> /host/localhost/cdrom 
                                  |
                                  | amd.map
                     fstab        V
	/dev/cd0c <--------- /mnt/cdrom 

When you first access /cdrom, amd will detect that you are really trying to access /host/localhost/cdrom and mount /mnt/cdrom. Wzap! your CD will be mounted.

4. TESTING

Reboot your box (or start the daemons by hand) to test your modifications to the startup files (purists can shutdown to single-user mode and restart from there).

Upon reboot, the output of mount should be similar to this:

$ mount
/dev/da0s1a on / (ufs, local, ...)
procfs on /proc (procfs, local)
mfs:22 on /tmp (mfs, asynchronous, local, nodev, nosuid)
pid102@myhost:/host on /host (nfs)

Also try ``amq'' it's fun:

$ amq
/                      root     "root"            dengue:(pid102)
/host                  toplvl   /etc/amd.map      /host
/host/localhost        auto     /etc/amd.map      /host/localhost

Amd has attached itself as a NFS server to the /host branch. Insert a CD in the drive and cd to /cdrom, it should be mounted automatically:

$ mount
/dev/da0s1a on / (ufs, local, ...)
procfs on /proc (procfs, local)
mfs:22 on /tmp (mfs, asynchronous, local, nodev, nosuid)
pid102@dengue:/host on /host (nfs)
/dev/cd0c on /mnt/cdrom (cd9660, local, nodev, nosuid, read-only)

$ amq
/                      root     "root"            dengue:(pid102)
/host                  toplvl   /etc/amd.map      /host
/host/localhost        auto     /etc/amd.map      /host/localhost
/host/localhost/cdrom  program  mount /mnt/cdrom  /mnt/cdrom

Note that cd'ing to /host/localhost or /mnt/cdrom won't do it; you have to touch /host/localhost/cdrom, either directly or through a symlink like we did, for the automounter to kick in and mount the drive.

5. SECURITY CONSIDERATIONS

Unfortunately neither portmapper nor amd, both based on RPC, enjoy a particularly good reputation in security circles. Yes, this means that configuring your system for automounting can open some potentially serious security holes.

The FreeBSD version of the portmapper tries to limit the damage by using libwrap and its configuration file /etc/hosts.allow: there you can specify what hosts are allowed to connect to the portmapper service, and thus hopefully lower the risk level.

Note that the portmap service should be denied access to explicitly; the ``twist'' command of TCP Wrappers (see hosts_options(1)) cannot be used. See http://www.freebsd.org/cgi/getmsg.cgi?fetch=1925442+1933253+/usr/local/www/db/text/2000/freebsd-questions/20000402.freebsd-questions to learn why. Hence a typical /etc/hosts.allow file would be like:

# limit access to the portmapper
portmap: localhost : allow
portmap: ALL : severity auth.warning : deny

But as a rule of thumb do not use any NFS-related stuff (such as amd) on a sensitive system. RPC (on top of which NFS is implemented) is a very powerful technology indeed, but its security status is, mmh, considered quite low at this time. A quick search for "portmap exploits" on any search engine should find more than enough hits to convince you.

6. FUN HACKS

Now you have almost all of the info to duplicate my solution to that big noisy hard drive mentioned in the introduction.

The drive is a SCSI device detected as da1. I disklabelled it as one big partition, newfs'ed it and moved all of /var/spool to it (see the FreeBSD handbook for more information about those operations).

In /etc/fstab I have:

# Device	Mountpoint	FStype	Options			Dump	Pass#
/dev/da1e	/mnt/spool	ufs	rw,noauto		1	2

and in /etc/amd.map:

localhost/spool		type:=program;fs:=/mnt/spool;\
			mount:="/sbin/mount mount /mnt/spool";\
			unmount:="/usr/local/etc/spin-down spin-down"

/var/spool is symlinked to /host/localhost/spool. ``spin-down'' is a small shell script I wrote.

#!/bin/sh
# 
# Spin down hard disk drive da1 if no processes are using it.
# da1 is a SCSI drive with a single partition mounted on /var/spool.
# The drive will be re-mounted by the amd, which will make it spin
# back up.
#
# (c) Renaud Waldura June 2000
#

if umount /mnt/spool 
then
   camcontrol stop da1 -E
   logger -t $0 "Disk da1 spun down"
fi

That's all folks!

A. ERRORS

Operation not permitted when mounting: one cannot mount a regular partition on top of another. Unmount the first partition before attempting to mount.

B. REFERENCES

The mount(8) and fstab(5) manpages.

The amd(8) and amq(8) manpages.

/etc/defaults/rc.conf for more amd options.

The FreeBSD Handbook at http://www.freebsd.org/handbook/.

C. ABOUT THE AUTHOR

Renaud Waldura is a software engineer and has been hacking FreeBSD since 1996. See http://renaud.waldura.com/doc/freebsd/ for more FreeBSD articles.




Author maintains all copyrights on this article.
Images and layout Copyright © 1998-2004 Dæmon News. All Rights Reserved.