While there are many distributed file systems out there; especially with the rise of cloud & virtual computing. The Network File System or NFS protocol has by far held its title as an easy to use, fast to implement and very efficient distributed file system. In today's article I will be covering how to set up a basic NFS share.
This article will assume that you have already created a file system, if not hop over to this article and then come back for the NFS steps.
Setting up the NFS Server
Note: The following instructions are for Ubuntu Server and can be applied to other Linux Distributions however some steps may differ such as start-up configuration.
NFS is a very simple setup. We will first configure the NFS “server” to share one of its local file systems. The local file system that we will be sharing today is /nfs
.
Create a test file on the NFS “server” for validation later:
To validate that we are able to see the shared file system we will create a test file.
root@server:/# echo "Test File on NFS Server" > /nfs/testfile.txt
Install NFS Server Packages
Verify the packages are installed:
Now that our directory is ready we will start by ensuring that we have the appropriate packages.
root@server:~$ dpkg --list | grep nfs
ii libnfsidmap2 0.25-1ubuntu2 NFS idmapping library
ii nfs-common 1:1.2.5-3ubuntu3.1 NFS support files common to client and server
As you can see we have some NFS packages installed however we are missing the package necessary for this system to act as an NFS Server (nfs-kernel-server).
Install nfs-kernel-server:
To install the nfs server package we will use apt-get
.
root@server:~$ apt-get install nfs-kernel-server
Now that the nfs server package is installed we will verify that the init script is set to start by default.
Check your current runlevel:
root@server:/# runlevel
N 2
Check if the rc.d directory is linked:
root@server:/# ls -la /etc/rc2.d/ | grep nfs
lrwxrwxrwx 1 root root 27 Aug 11 17:31 S20nfs-kernel-server -> ../init.d/nfs-kernel-server
If your output does not match above than nfs-kernel-server may not be configured to start automatically. To do this in Ubuntu/Debian you would use the update-rc.d
command and in Red Hat variants you would use chkconfig.
Configure the NFS Server
With NFS we will need to configure what directories we want to be shared, to do this we will be editing the /etc/exports file.
NFS Configuration Syntax
For our exercise we will make sure that the /nfs directory is shared only to the client 192.168.0.195. We want this client to have read and write access and we want the nfs mount to write in synchronous mode (which is default).
The NFS exports configuration has the following syntax
/directories/to/share <ip or hostname>(nfs options) (nfs options)
For our example this breaks down to
/nfs 192.168.0.195/32(rw,sync)
If we wanted to share this directory with more than one client we could add an entry on the line for them as shown in the syntax area or if they are all within the same subnet we could use the appropriate CIDR address. If you know that your entire C class should have the ability to mount the NFS share you could simply do 192.168.0.0/24 and allow all IPs between 192.168.0.1-255 access to your NFS share.
Configure /etc/exports
Now that we have the syntax for our client configuration, lets put that configuration into the /etc/exports file.
Edit the exports file:
root@server:~# vi /etc/exports
Append:
/nfs 192.168.0.195/32(rw,sync)
Refresh the exports:
root@server:~# exportfs -a
Once exportfs has finished running, the new share will be available to the clients.
Setting up the NFS Client
Verify if the NFS client packages are installed
Now that the server is configured let's make sure that the NFS client has the ability to mount an NFS share, to do this it will require the nfs-common package.
root@client:~# dpkg --list | grep nfs
ii libnfsidmap2 0.25-1ubuntu2 NFS idmapping library
ii nfs-common 1:1.2.5-3ubuntu3.1 NFS support files common to client and server
By default the nfs-common package may already be installed however if it is not than it can be installed with apt-get.
root@client:~# apt-get install nfs-common
Mounting the file system
Once the nfs-common package is installed you can mount the share. However before doing so you will need to create the directory that you want the NFS file system mounted under.
Create the necessary path
For our tutorial we will create a /shared/nfs1
directory and then mount the NFS share over that directory.
root@client:~# mkdir -p /shared/nfs1
Mount the File System
When mounting an NFS file system it is best to first try mounting the file system manually and then place it into the /etc/fstab
file. To mount it manually we will use the mount command.
Syntax:
mount -t nfs <ip>:<remote path> <local path>
Example:
root@client:~# mount -t nfs 192.168.0.197:/nfs /shared/nfs1
Validate the NFS share is mounted
To validate that our NFS is mounted we will first check if the mount command shows our newly mounted file system and second if we can access our file.
root@client:~# mount
192.168.0.197:/nfs on /shared/nfs1 type nfs (rw,vers=4,addr=192.168.0.197,clientaddr=192.168.0.195)
root@client:~# cat /shared/nfs1/testfile.txt
Test File on NFS Server
Add the NFS share to /etc/fstab
Now that we know the mount is working we can edit the /etc/fstab file to ensure that the file system is mounted on reboot. NFS has a specific syntax required in order to mount properly, below is the syntax breakdown required for /etc/fstab.
Syntax
<ip>:<path> nfs defaults, 0 0
Example:
root@client:~# vi /etc/fstab
Append:
192.168.0.197:/nfs nfs defaults 0 0
Testing your syntax
Rather than testing this by rebooting it is a bit safer to unmount the nfs share and remount it with mount -a
. If there is an error in your /etc/fstab
and you reboot your system the system may not complete its boot until you resolve the error. This could be difficult if the system is remote and you do not have physical access to the machine.
Example:
root@client:~# umount /shared/nfs1
root@client:~# mount -a
root@client:~# mount
192.168.0.197:/nfs on /shared/nfs1 type nfs (rw,vers=4,addr=192.168.0.197,clientaddr=192.168.0.195)
If the file system mounted than you now have an NFS file system share available to your clients. Simply repeat the client process on all of the machines you want to have access to this file system.
No Root Squash
There are many options for NFS and I want to keep this article short but effective so I am leaving out many of the various configuration items that you could do. However there is one option that is worth mentioning, no_root_squash
. By default NFS will downgrade any files created with the root permissions to the nobody user. This is a security feature that prevents privileges from being shared unless specifically requested.
If I create a file as the root user on the client on the NFS share, by default that file is owned by the nobody user.
root@client:~# touch /shared/nfs1/file2
root@server:/nfs# ls -la file2
-rw-r--r-- 1 nobody nogroup 0 Nov 18 18:06 file2
Sometimes it is important to share files that are owned as root with the proper permissions, in these cases this can be done by simply adding the no_root_squash
attribute to the /etc/exports
configuration.
Adding no_root_squash
Edit the /etc/exports file:
root@server:/nfs# vi /etc/exports
Modify the /nfs line to:
/nfs 192.168.0.195/32(rw,sync,no_root_squash)
Re-Export the exported file systems:
root@server:/nfs# exportfs -a
Re-Mount the file system on the client:
root@client:~/# umount /shared/nfs1
root@client:~/# mount -a
Now any file created by root should have root permissions.