Use autofs to wake fileserver on demand

Published by cybso on

This is the continuation of "Suspend NAS when idle".

I want to automatically resume my NAS server from suspend to ram when accessing the media directory, e.g. via XBMC. I'm connecting my clients via sshfs, so if you're using SMB/CIFS, you have to modify the fstype parameters. The implementation is based upon http://tech-bodges.blogspot.de/2010/06/linux-autofs-and-wake-on-lan-bodge.html.

Required tools:

I assume that the sever is called "nasserver" and has a user called "htpc" which is able to access the `/srv/media` directory. First of all, if not already done, ensure that the root user of your client can mount the sshfs server without any prompting:
sshfs -o allow_other 'htpc@nasserver:/srv/media' /mnt

If you are asked for a password instead, generate a SSH key and copy the public key into the authorized_keys file of the htpc user on nasserver (there are many other tutorials on the web that explain how this is done). Maybe fuse won't allow you to use the allow_other option. In this case, ensure that there is a line user_allow_other that is not commented out in /etc/fuse.conf.

If you successfully mounted the directory under /mnt, umount it (umount /mnt) and go with me to the next step.

autofs mounts shares automatically when they are accessed. You can either define static mount parameters, or have an executable script that produces these mount parameters. We want to use the second option: the script will try to ping the destination host one time. If ping fails, it tries to send a Wake on LAN package to it's MAC address and waits up to two minutes for resume. The autofs directory in this example is /var/autofs/nasserver (create it, if it does not exists!), the share's name "media", so autofs should mount the share whenever a file or directory in /var/autofs/nasserver/media/ is requested.

Locate your auto.* files. Ubuntu and Debian store them in /etc, Arch Linux in /etc/autofs. I'll use the Debian variant.

Create /etc/auto.nasserver and make it executable. Replace the hostname, the hwaddr, the username, the path and - if you want to - the mount options:

#!/bin/bash

# Modify these values
hostname="nasserver"
hwaddr="00:00:00:00:00:00"
username="htpc"
sharename="media"
sharepath="/srv/media"
mountopts="-fstype=fuse,rw,nodev,nonempty,noatime,allow_other"
wolcmd="wol"

test "$1" == "$sharename" || exit 0

if ! ping "$hostname" -nqc1 > /dev/null 2>&1; then
    $wolcmd "$hwaddr" > /dev/null
    for n in `seq 1 120`; do
        ping "$hostname" -nqc1 > /dev/null 2>&1 && break
        sleep 1
    done
fi

echo "$mountopts :sshfs\\#$username@$hostname\\:$sharepath"

If you've done everything right, /etc/auto.nasserver should print nothing, and /etc/auto.nasserver media shoud print something like "-fstype=fuse,rw,nodev,nonempty,noatime,allow_other :sshfs\#htpc@nasserver\:/srv/media".

Next, add the following line to /etc/auto.master:

/var/autofs/nasserver /etc/auto.nasserver --timeout=300 --ghost

Finally, restart the autofs service (service autofs restart or systemctl restart autofs). Now everytime you try to access /var/autofs/nasserver/media, the remote share should be mounted automatically and unmounted after 300 seconds of inactivity. If you like, you can also you a symlink to use /srv/media as a shortcut on the client:

$ ln -s /var/autofs/nasserver/media /srv/media

When running this on a Raspberry Pi, I suggest to add the following mount options to the mountopts variable:

max_readahead=8388608,Ciphers=arcfour

This lets sshfs buffers up to 8MB, which reduces the likelyhood of lags and stutterings, and forces SSH to use the weaker (but faster) RC4 encryption algorithm for the connection.