I had a problem getting symlinks to work with Vagrant. But let’s get symlinks setup first, before I get to the problem. The first thing to do – which is well documented – is you need to add the following line to your Vagrantfile:

config.vm.customize [“setextradata”, :id, “VBoxInternal2/SharedFoldersEnableSymlinksCreate/WebDocRoot”, “1”]

The problem most people have is that this line relates to your share_folder config value. See the following:

config.vm.share_folder “WebDocRoot”, “/var/www”, “www”

The share_folder config option has 3 initial params (identifier, guest path, host path). The customize option must relate to the identifier, look at the WebDocRoot value in those two options.

The problem is that I received the following error:

The following SSH command responded with a non-zero exit status.

Vagrant assumes that this means the command failed! 

mkdir -p /vagrant/www

So let’s look at the error. I can’t make the directory /vagrant/www, it’s returning an error.

vagrant ssh

ls -l /vagrant

In my case I could see that /vagrant/www already existed and was a dead symlink that pointed to a non-existent directory. But wait a minute. It links to a directory on my host machine, not my guest machine. Why is that?

The /vagrant directory in the guest is an automatically generated share_folder by Vagrant and it maps to the current directory your Vagrantfile is located in. I had put a symlink in this directory on my host machine and that symlink was then available in the guest as its parent was a share_folder already. Thus when I tried to create a new share_folder at the path /vagrant/www it failed as it already existed as a symlink.

Simple enough: don’t create a share_folder there, create it elsewhere inside the guest machine. I moved it from /vagrant/www/ to /var/www/ as outlined above and problem solved.