Setting up NFS

Posted by Ryan Himmelwright on Wed, Apr 21, 2021
Tags linux, filesystem, homelab
Pocosin Lakes Wildlife Refuge, NC

Thanks to VFIO passthrough, I find myself sitting in front for a virtualized Linux system on a daily basis. While this setup is unbelievable, it does come with a few complications. One such hurdle is sharing files located on the host system with the VMs. After trying a few methods, I determined that nfs was the simplest to get up and running. Here’s how.

The Problem

Not Music in the VM
There's no music files in the VM and the player errors looking for the missing files.

My desktop is my main workstation. It is the hub that holds all of the data I use, including documents, music, and videos. When I am working in a VM, I often want access to that data. I like listening to my music while working in VMs 😉.

It would be inefficient, both in time and disk space, to copy all the files I desired to each VM that I use. Setting up a network filesystem is an can get around this. After some trial and error, I eventually concluded that for my use (linux guests on a linux host), NFS worked. If you want to share with Windows guests, something like samba might work better.

Server Setup

First, we want to setup the sever. Be sure to run the following steps on the host machine.

Install Dependencies

Being on a Fedora host, I installed the dependencies using the following dnf command:

sudo dnf -y install nfs-utils 

Configure The Domain Name

Next, open up the file /etc/idmapd.conf and make sure that the Domain = ... line (usually line 5) is un-commented, and set to your machine’s hostname. If not, edit it to configure the idmapd domain name:

Domain = charmeleon

Define the Exports File

After everything is installed, we need to create the exports file. This file will define all of the nfs shares we want to make available. Create and open the file /etc/exports, and add something similar for each directory you want to share:

/home/ryan/Seafile      10.0.7.0/24(rw,all_squash,insecure)
/home/ryan/Music        10.0.7.0/24(rw)
/Data/Videos            10.0.7.0/24(rw)

I like to share my Music and Video folders, along with my Seafile library (so I don’t have to configure it on each VM).

Each line breaks down as follows:

  • The directory location to share (ex: /home/ryan/Music)
  • The range of addresses that are allowed to access the share (I use 10.0.7.0/24, which allows devices on my home network)
  • The properties for each share. I use (rw) to allow read and write permissions.

That should be it. Feel free to dig deeper into all the nfs share settings if you need them, especially if you want to be a bit more secure in your setup!

Firewall/other permissions

After creating the exports file, we need to allow the service through the firewall. To do so, permanently allow the nfs service:

sudo firewall-cmd --add-service=nfs --permanent

Don’t forget to reload the firewall!

sudo firewall-cmd --reload

Start the service

Last but not least, make sure the rpcbind and nfs-sever services are started and enabled to autostart after a reboot.

sudo systemctl enable --now rpcbind nfs-server

VM Client Setup

With the server setup, we should be able to mount the shares in the VMs now. First, ensure the nfs-utils package is installed there too.

Mount

Now, use the mount command with nfs for the -t flag to mount the shares:

sudo mount -t nfs 10.0.7.82:/home/ryan/Music /home/ryan/Network/Music

If you experience weird issues when mount the shares, a reboot may help. I occasionally hit permission issues that seem to be resolved after a restart.

fstab

It is possible to add the share to your /etc/fstab file, so that it auto-mounts during boot. However, I don’t usually do this. I like to make the conscious decision to mount data from the host machine, as I don’t always need it available in the VMs.

Conclusion

Listening to mounted Music in the VM
Listening to music in a VM, mounted from a nfs share on the host

That’s about it. This was just the basics of setting up a nfs share, and I’m sure I do something wrong, but so far… it has worked great for my simple use case of sharing data between the host and guests on the same computer. Enjoy!

Next Post:
Prev Post:

Using kid3 Audio Tag Editor Using Remote VSCode