NFS mount via systemd

Sometimes you feel like fstab, sometimes you don't.

If you're running modern Linux and are wanting to invest all of your brain power in a systemd thing-a-me and you're wishing there's was systemd way to mount a file-system(s), you're in luck!

In this post I'm going to quickly cover how to mount an NFS export using nothing more than systemd mount unit on Ubuntu 16.04.

Do you want to mount an FS?


The first thing to do is get the NFS mount exported and the relevant options required to make it all go noted. In my case, I've got NFS4 running on my server and I've exported one path such that only my little Brix is able to attach to it. I'm not covering setting up an NFS server within this post.

Here's what my export looks like on my NFS server.
/mnt/things 172.16.24.199(rw,sync,no_subtree_check,all_squash,anonuid=1000,anongid=1000)

As you can see, one server is permitted to attach to the path /mnt/things using a single IP address. For more information on the options being used please refer to the NFS documentation found here.

On the client host

install some packages.
# apt-get install nfs-client
load the nfs kernel module.
# modprobe nfs

I'm also going to make loading the nfs kernel module persistent across reboots.

# echo NFS | tee -a /etc/modules
Create a systemd mount unit file

This unit file MUST contain the path within the name using hyphens instead of slashes. In my case, I will be mounting the NFS export at /mnt/things so my file name will be mnt-things.mount. The mount file itself will be stored at /etc/systemd/system/ here's the full path to the file /etc/systemd/system/mnt-things.mount.

Within the the mount unit file, add the following sections/entries:

[Unit]
Description=Things devices
After=network.target

[Mount]
What=172.16.24.192:/mnt/things
Where=/mnt/things
Type=nfs
Options=_netdev,auto

[Install]
WantedBy=multi-user.target

These few lines give the unit file a description, ensure that it's only started after networking is available, mounts the NFS export 172.16.24.192:/mnt/things to /mnt/things using an nfs type, and makes sure the mount is ready before starting any other machines (VMs, Containers, etc).

Start your mount (service?)!

Reload the systemd daemon.

# systemctl daemon-reload

Start the mount (yes that sounds odd).

# systemctl start mnt-media.mount
Validate that it all works.

If everything is working you should be able to begin using the mount at /mnt/things and browsing the filesystem. You can also check the status of the mount using the following:

# systemctl status mnt-things.mount 
● mnt-things.mount - /mnt/things
   Loaded: loaded
   Active: active (mounted) since Sun 2017-05-21 20:56:44 CDT; 22h ago
    Where: /mnt/things
     What: 172.16.24.92:/mnt/things

May 21 20:56:44 carterhousekodi systemd[1]: Mounting Things devices...

You'll notice that I omitted the directory creation command (mkdir -p /mnt/things) for the mount point on the client node, this was intentional. There's no need to create the path when mounting filesystems using systemd, if the Where path defined in the mount unit file does not exist systemd will create it Automagically.


That's all folks

Just a quick aside on the power of systemd, the init system, and it's ability to replace the simplist of things in an administators everyday life, like mounting a filesystem.