Gentoo Wiki ArchivesGentoo Wiki

Autofs

This article is part of the HOWTO series.
Installation Kernel & Hardware Networks Portage Software System X Server Gaming Non-x86 Emulators Misc

Contents

Why

You want to have directories auto mounted for you when you access them. This is useful for nfs, samba, and boot mounts/partitions. Think of having /usr/portage exist on a central nfs capable server and all of your client machines are then able to automatically mount /usr/portage whenever you perform an emerge (This example would save you ~300MB of disk space).

Kernel Support

First you need to make sure your server and client machines have support for network filesystems (NFS or SMB for example). In your kernel configuration ensure you have the following options set:

Linux Kernel Configuration: automounter support
File Systems --->
  <*> Kernel automounter version 4 support (also supports v3)

Installing the support as a module works as well, build and install the kernel as normal.

Install package(s)

First, install autofs on workstation(s). This will provide automounting for local mounts only (extra partitions, floppy, cd/dvd roms, etc):

emerge autofs

Next, depending on whether the workstation will need network shares automounted, you'll need nfs-utils (for nfs shares) and samba (for samba shares). Both are completely optional:

emerge -av nfs-utils samba

System Setup and Configuration

Verify Manual Mounting

Once autofs is installed, you need to verify that you are able to mount the filesystems you intend to setup as automounts.

This example only targets local mounts with comments for network filesystem mounts.

mount /dev/hda1 /mnt/boot
mount /dev/cdrom /mnt/cdrom
mount /dev/fd0 /mnt/floppy

Config files

Modify the autofs master configuration file. This file lists one or more directories to take control over (it will automatically create and remove directories as you access them). This directory (the "mount point") will be controlled by the autofs daemon and it's therefore strongly recommended that you do *not* use the "mount" command to explicitly mount filesystems to this directory.

Each line in the master configuration file gives autofs a mount point, and the name of another configuration file that contains the file systems to auto-mount there. You can add any number of mount points, but we will only need one.

All config files must have a new line at the end

File: /etc/autofs/auto.master
 # As usual, lines in the file that start with '#' are comments

 # mount point   config file              options
 #/misc          /etc/autofs/auto.misc
 #/home          /etc/autofs/auto.home
 /mnt/auto       /etc/autofs/auto.auto    --timeout=5 --ghost

The --timeout option in auto.master tells the automounter to unmount the file systems after (in this case) 5 seconds of inactivity. There are many discussions on the internet about whether this should be very short (several seconds) or long (a minute or more). That discussion is outside the scope of this document.

The --ghost option tells the automounter to create "ghost" versions (i.e. empty directories) of all the mount points listed in the configuration file (in this case /etc/autofs/auto.auto), regardless of whether any of the file systems is actually mounted or not. This is very convenient and highly recommended, because it will show you the available auto-mountable file systems as existing directories, even when their file systems aren't currently mounted. Without the --ghost option, you'll have to remember the names of the directories. As soon as you try to access one of them, the directory will be created and the file system will be mounted. When the file system gets unmounted again, the directory is destroyed too, unless the --ghost option was given.

File: /etc/autofs/auto.auto
 #directory name                        options for mount                              device to mount
 boot                                   -fstype=ext2                                   :/dev/hda1
 cdrom                                  -fstype=iso9660,ro                             :/dev/cdrom
 floppy                                 -fstype=auto                                   :/dev/fd0
 storage                                -rsize=8192,wsize=8192,soft,timeo=30,rw        192.168.0.7:/home/storage
 #portage                               -rsize=8192,wsize=8192,soft,timeo=30,rw        hydra.localnet:/usr/portage
 #smb                                   -fstype=smbfs,credentials=/etc/smb.auth        ://solfish/Share
 
 # SMB example
 #some-win-smb                          -fstype=smbfs,credentials=/etc/smb.auth        ://some-win-host/path/to/smb
 # NFS example
 #some-nfs                              -rsize=8192,wsize=8192,soft,timeo=14,rw        some-nfs-host:/path/to/nfs

 # An example with wildcards, see autofs(5):
 #*                                     -fstype=iso9660,ro,loop                        :/images/&.iso
File: /etc/smb.auth
username=your_username
password=your_password
# chmod 600 /etc/smb.auth

Russian charset and codepage (example):

  XPcomputer              -fstype=smbfs,iocharset=utf8,codepage=cp866,dmask=0700,fmask=sk=0600,credentials=/etc/smb.auth                     ://150.150.50.111/Tranzit


Directory and File Permissions

Now we have configured autofs basic mounting we must restrict permissions.

The automounted filesystems usually have undesired permissions or you might want to restrict permissions for certain users. This can be globally controlled by using the mounting instructions fmask and dmask.

See below for an example limiting the resource to the mounted user only:

File: /etc/autofs/auto.auto
 # -- snip --
 insecure-smb         -fstype=smbfs,credentials=/etc/smb.auth                           ://solfish/Share
 more-secure-smb      -fstype=smbfs,dmask=0700,fmask=0700,credentials=/etc/smb.auth     ://solfish/Share
 # -- snip --

NTFS permissions

When mounting an NTFS partition, you have to take a few extra steps to get the permissions right. The Linux NTFS drivers are read-only, so we never want to set the 'write' bit. Additionally, we want to clear the 'execute' for files, but set it for directories (to allow us to 'cd' into them). By default, each partition has a group of 'disk', so we will allow 'read' access to only users who are members of group 'disk'. Finally, since Windows is case-insensitive (c:\Windows, c:\WINDOWS, c:\windows are all the same), we might as well disable case-sensitivity.

As an example:

File: /etc/autofs/auto.auto
 # -- snip --
 c    -fstype=ntfs,fmask=0337,dmask=0227,gid=disk,case_sensitive=false    :/dev/hdaX
 # -- snip --

Directory Creation and Linking

Now that we have configured autofs to manage /mnt/auto, we need to create this directory.

mkdir -p /mnt/auto

We can also create some interesting links so that things in common places can be easily accessed.

Verify nothing is mounted at these locations:

umount /boot
umount /mnt/cdrom
umount /mnt/floppy

Remove the original directories

### WARNING DO NOT REMOVE THE /boot directory. It is a vital directory. 
rmdir /mnt/cdrom
rmdir /mnt/floppy

Create interesting links:

ln -s /mnt/auto/boot /boot
ln -s /mnt/auto/cdrom /mnt/cdrom
ln -s /mnt/auto/floppy /mnt/floppy

Startup and System Boot

After this is complete, start the AUTOFS daemon by issuing:

/etc/init.d/autofs start

If you wish to have this behavior on default startup, issue:

rc-update add autofs default

Problems

I have encountered a problem using autofs to mount remote nfs shares. The problem was that the server's log reports successful authentication whereas the client told "permission denied by server". The workaround is to put "/etc/init.d/portmap restart" into "/etc/conf.d/local.start". That problem seems to be related to how portmap and nfs interact...

Also, by default, gnome (without gnome-volume-mounter) won't display the icons for floppy and CD etc. Re-installing gnome-volume-mounter as a workaround requires pmount, which fails to install once autofs is running ( [Errno 13] Permission denied: '/media/.keep#new' ), of course because autofs is managing /media. As a workaround to this problem, I stopped autofs, renamed media to mediaauto, so autofs can manage its mediaauto directory with the appropriate floppy and cdrom symlinks from /media. This way you can have autofs (for automounting floppies and cdrom), hal, dbus and gnome-volume-manager happily installed together.

If you experience sluggish transfer speeds between a linux client and a samba server, change -fstype from smbfs to cifs. Be sure to have cifs support compiled into [or as modules] your kernel.

-fstype=smbfs -> -fstype=cifs

UUID

Added by Turbomaniac_7 2007-04-10 This for the ones to wish to auto-mount by UUID instead:

Note: I will be using my USB harddrive as an example here.

First we have to figure out the UUID for the device we wish autofs to work with. 'tune2fs -l <device>' can be used but only if the partition is a EXT2/EXT3, therefore the 'blkid' is more universal.

Lets see what we got with the 'blkid' command:

# blkid
/dev/hda1: UUID="1b50a494-c9e4-4d92-91a6-31b6662b7231" TYPE="ext2"
/dev/hda2: UUID="3eb9c4b5-fb87-4728-a5ae-5f06d40493bd" TYPE="swap"
/dev/hda3: UUID="0f19ba2a-8506-49a1-b23f-f8676727e54a" SEC_TYPE="ext2" TYPE="ext3"
/dev/sde1: LABEL="USB-120GB" UUID="3212-4c62" TYPE="vfat"

Inside '/etc/autofs/auto.auto' instead of: ':/dev/hdaX' we have to write 'UUID="3212-4c62"'. Like this:

File: /etc/autofs/auto.auto
 # -- snip --
 usb-120gb  -fstype=vfat,fmask=0137,dmask=0027,uid=1000,gid=100   UUID="3212-4c62"
 # -- snip --

That's it.

UDEV

added by Pillarsdotnet 08:24, 4 December 2007 (UTC)

Here is a udev-only solution, that doesn't depend on autofs, hald, uuid or device name:

Find an existing udev rule that is launched after the usb partition node is created

For me, the rule was in /etc/udev/rules.d/60-persistent-storage.rules, and it looked like this:

File: /etc/udev/rules.d/60-persistent-storage.rules
 # -- snip --
 ENV{DEVTYPE}=="partition", IMPORT{program}="vol_id --export $tempnode"
 # -- snip --

Modify the rule to run mount/unmount scripts of your choosing

File: /etc/udev/rules.d/60-persistent-storage.rules
 # -- snip --
 ENV{DEVTYPE}=="partition", IMPORT{program}="vol_id --export $tempnode", RUN+="/lib/udev/usb_mount", ENV{REMOVE_CMD}="/lib/udev/usb_unmount"
 # -- snip --

Write the mount/unmount scripts

File: /lib/udev/usb_mount
 #!/bin/sh
 [ "$ACTION" = "add" -a "$DEVTYPE" = "partition" -a "$ID_BUS" = "usb" ] || exit 0
 MNTDIR=/mnt/auto/${DEVNAME##/dev/}
 chown root:usb "$DEVNAME"
 chmod 0660 "$DEVNAME"
 mkdir $MNTDIR
 /bin/mount -t $ID_FS_TYPE  $DEVNAME $MNTDIR -o noatime,noexec,nosuid,nodev,nodiratime,nosuid,rw,umask=0,dmask=0,fmask=111,uid=65534,gid=65534
File: /lib/udev/usb_unmount
 #!/bin/sh
 [ "$ACTION" = "remove" ] && (grep -q "^$DEVNAME" /proc/mounts || grep -q "^$DEVNAME" /etc/mtab) || exit 0
 /bin/umount -l "$DEVNAME"
 rmdir /mnt/auto/${DEVNAME##/dev/}

UDEV Examples

This is a simple example on how to automount a particular usb hard disk using udev.

1.- Identify the disk:

udevinfo -a -p $(udevinfo -q path -n /dev/sdb1)

2.- Write the rule in /etc/udev/rules.d/10-local.rules creating a symlink to the device and running mount:

KERNEL=="sd?1", SUBSYSTEMS=="scsi", ATTRS{model}=="HD400LD", GROUP="users", SYMLINK+="PeekBox", RUN+="/bin/mount /dev/PeekBox"

3.- Define the drive in /etc/fstab

/dev/PeekBox    /mnt/PeekBox    vfat    noauto,users,gid=100,umask=007  0 0

When you plug the usb hard disk it gets automounted:

$ mount
/dev/sdb1 on /mnt/PeekBox type vfat (rw,noexec,nosuid,nodev)

UDEV with autofs

added by docbill, 29 Feb 2008 - modified 11 Sep 2008 by Anaphyis

If you want to want to combine the advantages of UDEV (that is mounting a medium when added and removed) and autofs (unmounting when not in use) you can use this approach.

Add an entry to your /etc/auto.master

File: /etc/auto.master
 # -- snip --
 /media   /etc/auto.usb --timeout=5 --ghost
 # -- snip --

Note: The auto.usb name is completely arbitrary. You can also use this file to mount removable media via eSATA or mobile racks.

Find an existing udev rule that is launched after your filesystem is recognized

Note: In newer udev Versions this rule file is found in /lib/udev/rudles.d instead. As they are overwritten at an update you should use the persistent storage rule file as a template for a own ruleset.

File: /etc/udev/rules.d/60-persistent-storage.rules
 # -- snip --
ENV{ID_FS_USAGE}=="filesystem|other|crypto", ENV{ID_FS_UUID_ENC}=="?*", SYMLINK+="disk/by-uuid/$env{ID_FS_UUID_ENC}"
 # -- snip --

Modify the rule to run automount/unautomount scripts of your choosing

File: /etc/udev/rules.d/60-persistent-storage.rules
 # -- snip --
ENV{ID_FS_USAGE}=="filesystem|other|crypto", ENV{ID_FS_UUID_ENC}=="?*", SYMLINK+="disk/by-uuid/$env{ID_FS_UUID_ENC}", RUN+="/lib/udev/usb_automount", ENV{REMOVE_CMD}="/lib/udev/usb_unautomount"
 # -- snip --

Write the mount/unmount scripts

File: /lib/udev/usb_automount
#!/bin/bash
[ "x$ACTION" = "xadd" -a "x$DEVTYPE" = "xpartition" ] || exit 0
DEVICE=/dev/disk/by-uuid/$ID_FS_UUID_ENC
grep -q ":$DEVICE\$" /etc/auto.usb && exit 0

grep -q "^$DEVNAME" /etc/fstab && exit 0
grep -q "^$DEVICE" /etc/fstab && exit 0
grep -q "^label:$ID_FS_LABEL_ENC" /etc/fstab && exit 0
seq=0
LABEL=$(echo "$ID_FS_LABEL_ENC" |sed 's, ,_,g')
if [ -z "$LABEL" ]; then
  LABEL="GenericVolume"
  MNTDIR="GenericVolume"
else
  MNTDIR="$LABEL"
fi
while ( grep -q "^$MNTDIR " /etc/auto.usb )
do
   seq=$(expr $seq + 1)
   MNTDIR="$LABEL-$seq"
done
if  blkid $DEVICE|grep -q TYPE\=\"ext3\"; then
  MOUNTOPTS="-fstype=ext3,check=none,noatime,nodiratime,data=writeback,commit=90,noauto,user"
elif blkid $DEVICE|grep -q ext2; then
  MOUNTOPTS="-fstype=ext2,check=none,noatime"
elif blkid $DEVICE|grep -q ntfs; then
  MOUNTOPTS="-fstype=ntfs-3g,uid=1000,gid=1010"
elif blkid $DEVICE|grep -q fat; then
  MOUNTOPTS="-fstype=vfat,uid=1000,gid=1010"
else
  MOUNTOPTS="-fstype=auto,ro"
fi
echo "$MNTDIR $MOUNTOPTS :$DEVICE" >> /etc/auto.usb
/lib/udev/usb_automount_clean

Note: You might want to check the mount options, especially the writeback mode for ext3 and the gid/uid combinations for the M$ filesystems. Check also the tune2fs manpage on how to set volume names. If you want to use automount for USB devices only, change the second line to:

File: /lib/udev/usb_automount
-- snip --
[ "x$ACTION" = "xadd" -a "x$DEVTYPE" = "xpartition" -a "x$ID_BUS" = "xusb" ] || exit 0

-- snip --


File: /lib/udev/usb_automount_clean
#!/bin/bash
for i in $(sed -e 's,.*:,,g' /etc/auto.usb)
do 
    if [ -n "$i" -a ! -e "$i" ] 
    then
        k=$(echo "$i"|sed 's,/,\\/,g')
        sed -ic -e "/:$k\$/d" /etc/auto.usb
    fi
done
service autofs reload

Start everything off

chmod ugo+rX /lib/udev/usb_*automount*
touch /etc/auto.usb
service autofs restart
udevadm control --reload_rules
udevadm trigger

You should now see your removable devices not mentioned in fstab automatically added to /media - unless of course you used the line to restrict autofs to USB devices only.

See also

Automount Howto - From the TLDP

Retrieved from "http://www.gentoo-wiki.info/Autofs"

Last modified: Sat, 11 Oct 2008 20:41:00 +1100 Hits: 147,009

Created by NickStallman.net, Luxury Homes Australia
Real estate agents should list their apartments, townhouses and units in Australia.