Use autofs to wake fileserver on demand
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.
- wol (or any other "wake on lan" tool like etherwake)
- the MAC address (hwaddr) of the server's ethernet interface
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:
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.