Use NFS to speed up your Vagrant
If you are using Vagrant and facing performance hits while running web-server or unit tests, the solution can be using NFS. It is used for sharing folders between host and guest machines.
Vagrant uses VirtualBox default sharing mechanism, which is very slow. After you'll switch to NFS, file access speed will increase by ~ 10 - 100 times.
Installation
-
On your local machine do
$ sudo apt-get install nfs-kernel-server nfs-common portmap
. This comes pre-installed on Mac OS X 10.5+ (Leopard and higher). -
Inside your Vagrant box (guest machine) do
$ sudo apt-get install nfs-common portmap
Configuration
Set :nfs
option to true
when configuring shared folder(s).
config.vm.synced_folder "v-root", "/vagrant", :nfs => true
NFS requires Private network, so you need to switch to it, in case you are using other network options, like :public_network
(i.e. bridged).
config.vm.network :private_network, ip: "10.11.12.13"
Benchmarks
Grabbed from here.
VirtualBox Shared Folders: 5m 14s
Host File System: 10s
Native VM File System: 13s
NFS Shared Folders: 22s
NFS Shared Folders (warm cache): 14s
Written by Anton Kalyaev
Related protips
19 Responses
Quite a pity, what Windows 7 doesn't support NFS. Native Virtualbox method of folder sharing is not performant at all.
Nice tip, thanks, if you use OS X, don't forget to upgrade your vagrant to the latest version (<= 1.2.4 has some bugs with mounting NFS shared folders).
You can use freeNFS on win 7: http://freenfs.sourceforge.net
@luuf didn't know that. Thanks for mentioning it here!)
Just a note about using NFS with Vagrant, since I had great difficulty getting it to work with the correct permissions.
It seems that NFS mounts your shared directory from the host (desktop) on the vagrant VM using the SAME UID/GID found on the host. This means if your UID/GID on the desktop machine is, for example, 500/500, then the NFS share will be mounted on your Vagrant machine with the same UID/GID, which may not correspond to your vagrant user. In my case, my Vagrant user had a UID/GID of 501/501, since another user was already assigned the UID/GID of 500/500. This caused permission problems since the Vagrant user didn't have access to modify the files in the NFS share.
The easiest way to fix this is to reboot the Vagrant virtual machine into single user mode using the Oracle Virtualbox GUI application (enter the Grub boot menu when starting tup the VM, then append a space and the number 1 to the boot parameters), then modify the UID/GID of the vagrant user to match that of your desktop machine.
@adamcohen If you have different uid/gids between host and client, try this config parameters in your vagrant file. No need to change ids in your vm:
config.nfs.map_uid = Process.uid
config.nfs.map_gid = Process.gid
@luuf I've tried to use Vagrant with FreeNFS on Windows, but I can't make it work. On the Vagrant side everything seems to be configured properly, as I've tested it on OSX and NFS works there. On the FreeNFS side there is really not much configuration - you only provide path of a folder to mount and nothing more - so I don't know where I could make a mistake.
Have you managed to succesfully use Vagrant / FreeNFS combo on Windows? If so, please share how to configure it properly. Thanks!
I'm curious on two things, first being like @velesin & @luuf not there is FreeNFS on Windows, but does anyone know if it is stable and worked a lot with it? Also, any easy way to test to see if NFS is there to use? Cheers
@velesin I only selected a folder to share under the "server" tab on the freenfs app. Works like it should here.
I also have host-only networking (private network) enabled, and use nfs over that network. On Windows I changed the firewall settings to allow any traffic on that network. Vagrant usually handles the network setup, but check that you can ping between host and client. I am unable to test now, as I moved over to LinuxMint and only run virtual Windows.
@jeremybass It is stable enough for testing/development, but I would not use it in production. I used it a lot before moving on to LinuxMint.
Thanks! Useful tip!
I'm having troubles with running NFS shared directories. The error message is:
"mount.nfs: access denied by server while mounting 192.168.7.1:/home/user/work/my-project"
192.168.7.1 is host machine inside the private network
192.168.7.50 is guest machine inside the private network
Some more specifics on pastebin: http://pastebin.com/Yt5Aj0hE
Host is running Ubuntu 13.10 with Vagrant 1.3.5 and Virtualbox 4.2.16. Any suggestions what I may try next?
This is also perfect because I had a "need for speed".
by the way, for those of you new at this (like me)
config.vm.synced_folder "v-root", "/vagrant", :nfs => true
can be found in your Vagrant file
@fire thank you, its a pity I had too read the whole post to find your answer...
@szoper I had this problem and solved by adding the guesy IP to the host machines /etc/hosts file
@elbcoast wow, that's so much easier than my solution! Thanks for the tip!
@markblackmore please elaborate
thx