NFS Driver
The Network File System (NFS) is a distributed file system
protocol originally developed by Sun Microsystems in 1984. An
NFS server exports one or more of its
file systems, known as shares. An NFS
client can mount these exported shares on its own file system.
You can perform file actions on this mounted remote file
system as if the file system were local.
How the NFS Driver Works
The NFS driver, and other drivers based off of it, work
quite differently than a traditional block storage
driver.
The NFS driver does not actually allow an instance to
access a storage device at the block level. Instead, files
are created on an NFS share and mapped to instances, which
emulates a block device. This works in a similar way to
QEMU, which stores instances in the
/var/lib/nova/instances
directory.
Enabling the NFS Driver and Related Options
To use Cinder with the NFS driver, first set the
volume_driver in
cinder.conf:
volume_driver=cinder.volume.drivers.nfs.NfsDriver
The following table contains the options supported by
the NFS driver.
How to Use the NFS Driver
To Use the NFS Driver
Access to one or more NFS servers. Creating an
NFS server is outside the scope of this document.
This example assumes access to the following NFS
servers and mount points:
192.168.1.200:/storage
192.168.1.201:/storage
192.168.1.202:/storage
This example demonstrates the use of with this
driver with multiple NFS servers. Multiple servers
are not required. One is usually enough.
Add your list of NFS servers to the file you
specified with the
nfs_shares_config option.
For example, if the value of this option was set
to /etc/cinder/shares.txt,
then:
# cat /etc/cinder/shares.txt
192.168.1.200:/storage
192.168.1.201:/storage
192.168.1.202:/storage
Comments are allowed in this file. They begin
with a #.
Configure the
nfs_mount_point_base
option. This is a directory where cinder-volume
mounts all NFS shares stored in
shares.txt. For this
example, /var/lib/cinder/nfs is
used. You can, of course, use the default value of
$state_path/mnt.
Start the cinder-volume service.
/var/lib/cinder/nfs should
now contain a directory for each NFS share
specified in shares.txt. The
name of each directory is a hashed name:
# ls /var/lib/cinder/nfs/
...
46c5db75dc3a3a50a10bfd1a456a9f3f
...
You can now create volumes as you normally
would:
# nova volume-create --display-name=myvol 5
# ls /var/lib/cinder/nfs/46c5db75dc3a3a50a10bfd1a456a9f3f
volume-a8862558-e6d6-4648-b5df-bb84f31c8935
This volume can also be attached and deleted
just like other volumes. However, snapshotting is
not supported.
NFS Driver Notes
cinder-volume manages the
mounting of the NFS shares as well as volume
creation on the shares. Keep this in mind when
planning your OpenStack architecture. If you
have one master NFS server, it might make
sense to only have one cinder-volume
service to handle all requests to that NFS
server. However, if that single server is
unable to handle all requests, more than one
cinder-volume service is
needed as well as potentially more than one
NFS server.
Because data is stored in a file and not
actually on a block storage device, you might
not see the same IO performance as you would
with a traditional block storage driver.
Please test accordingly.
Despite possible IO performance loss, having
volume data stored in a file might be
beneficial. For example, backing up volumes
can be as easy as copying the volume
files.
Regular IO flushing and syncing still
stands.