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.
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.