Symbolic links and synced folders in Vagrant
Asked Answered
F

6

107

I want to use Vagrant to provide a common development environment to my team. The hosts are completely different:

  • Some use OS X, some Linux, and some Windows.
  • Some use VMware, some use VirtualBox.

Inside of the VM we want to run Linux.

So far, everything is fine.

Now our idea was that each developer shall be able use the IDE of their choice, and hence we have introduced a synced folder that shares the source code between the host and the VM. This basically, works as well … except for symbolic links.

Inside of our source code we actually do have a few symbolic links, which is not a problem within the Linux inside the VM, but on Windows as host this causes problems. The only thing that we can not do is get rid of the symbolic links, so we need another way to deal with this.

So far, we have tried a number of options:

  • There is a workaround mentioned in an issue of Vagrant, unfortunately this is VirtualBox-only and does not help those who run VMware. So far, we haven't found a way of running code in the Vagrantfile depending on the provider used.
  • Instead of using a standard shared folder we now have tried using the rsync type. This works on Windows, but crashes on OS X with a number of errors telling us that the symlink has no referent (one error per symbolic link).
  • We thought about NFS, but that only works if you do not use Windows as host.
  • We also though about SMB, but this again only works on Windows as host.

I can not imagine that we are the only or the first persons on this planet to experience problems with multi-platform hosts and symbolic links within the shared folder.

How can you solve this issue, so that we can keep symbolic links, but still use different host operating systems?

Fairleigh answered 13/6, 2014 at 7:53 Comment(2)
Discussion here: github.com/mitchellh/vagrant/issues/713#issuecomment-4416384Sells
@SteveBennett, that issue (which the current accepted answer references) was resolved in Vagrant 1.1, which was released 15 months before the OP posted the question. And it's about VirtualBox shared folders anyway, not rsync'd folders. See my answer below (the accepted answer is wrong).Cleistogamy
B
69

Virtualbox does not allow symlinks on shared folders for security reasons. To enable symlinks the following line needs to be added to the vm provider config block in the Vagrantfile:

config.vm.provider "virtualbox" do |v|
    v.customize ["setextradata", :id, "VBoxInternal2/SharedFoldersEnableSymlinksCreate/v-root", "1"]
end

Additionally, on windows vagrant up needs to be executed in a shell with admin rights. No workarounds necessary.

Bechuanaland answered 23/6, 2014 at 11:58 Comment(6)
I suspect the OP and many people viewing this question were using the term "shared" and "synced" interchangeably. Note the OP's second bullet point which strongly implies he was using shared folders, but tried switching to an rsynced folder because they didn't work. IIRC, the solution provided here solved the problem I was having, in any case.Sells
@SteveBennett, agreed re: potential confusion. All the more reason to clarify. It's hard to imagine this suggestion would have solved your issue when it refers to such an old [long-since-resolved] issue, unless you were using a considerably old version of vagrant. And even if it did, IMO it would have been of very little help considering VBox's abysmal filesystem performance for shared dirs (e.g. "git status" taking several seconds), though it's possible you were sharing only a small project with very few files. mitchellh.com/…Cleistogamy
Running vagrant up in a shell with admin rights is all that is required. As @Cleistogamy pointed out, this config option is already set by default in Vagrant, as of this commit which happened almost a year before this answer was posted. That said, running vagrant up in a shell with admin rights did resolve my problem.Eakin
Does not respond to the question. Its not working on synced folders.Denice
This answer is wrong for 2 major reasons. 1. It refers to VBox shared folders, not rsynced directories--two completely different things. 2. This setting was already a default anyway in Vagrant 1.1, released 15 months before the OP's question. See my answer below for more info.Cleistogamy
Vagrant up needs to be executed in a shell with admin rights on windows.Stowell
C
97

The accepted answer is no good. The question describes an issue with synced folders, not shared folders. The proposed solution would have no effect on an rsynced (not shared) folder. And even if the OP was using a shared folder, the accepted answer's suggestion is something that had already been integrated into vagrant as of 1.1, released 15 months before the OP posted the question (not to mention VirtualBox's shared folders are abysmally slow).


I encountered this same issue: on OS X, I got the symlink has no referent rsync error. I was personally able to solve it by adding particular rsync args to my vagrantfile:

config.vm.synced_folder ".", "/var/www", type: "rsync", rsync__args: ["--verbose", "--archive", "--delete", "-z"]

I also opened this issue on vagrant's github to point out something that appears to be wrong with their default value for rsync__args (specifically, that one of the default args, --copy-links, seems to be breaking another, --archive, at least as far as copying broken symlinks is concerned).

Cleistogamy answered 13/3, 2015 at 0:20 Comment(8)
Good call - thanks @jdunk. Yes, according to Vagrant docs, the --copy-links option is set by default. This was my problem. By removing that (using your answer above) - that takes care of it.Bainter
Very useful, thanks. Although I would wish for Windows alternative.Plaint
Note that according to the Vagrant docs, Shared folders are the default type of synced folder for VirtualBox users: "If you're using the VirtualBox provider, then VirtualBox shared folders are the default synced folder type." (docs.vagrantup.com/v2/synced-folders/virtualbox.html) The OP's question also seems to imply that VirtualBox shared folders are a concern, so the accepted answer does attempt to address at least part of the problem (and indeed did fix the problem for me).Eakin
Thank you so much for saving my ass, I've looked everywhere on the internet and finally someone who understands this problem!Jealousy
Thank you. This is what solved my issue (the one in the title, and the one which I arrived here looking for a solution to, and which confusingly is not the one being asked).Taffeta
This is probably common knowledge, but it's my first time using Vagrant and it took me a bit to figure this out. The answer uses ".", "/var/www/" but if you are using a different location for the project, make sure you replace /var/www with that. By default for me, /vagrant. If you're on a Mac and getting the referent error, you can update the host and guest paths from reading it from the error message: There was an error when attempting to rsync a synced folder. Please inspect the error message below for more info Host path: /Users/<user>/<path_to_project>/ Guest path: /vagrantFinagle
Thank you so much for the tip. It works. The only problem is that when I make changes in files in my host machine these changes are not reflected in the guest machine like it used to be earlier. Any advice would be helpful. ThanksBlakeslee
Nice, solved my problem tooBrainpan
B
69

Virtualbox does not allow symlinks on shared folders for security reasons. To enable symlinks the following line needs to be added to the vm provider config block in the Vagrantfile:

config.vm.provider "virtualbox" do |v|
    v.customize ["setextradata", :id, "VBoxInternal2/SharedFoldersEnableSymlinksCreate/v-root", "1"]
end

Additionally, on windows vagrant up needs to be executed in a shell with admin rights. No workarounds necessary.

Bechuanaland answered 23/6, 2014 at 11:58 Comment(6)
I suspect the OP and many people viewing this question were using the term "shared" and "synced" interchangeably. Note the OP's second bullet point which strongly implies he was using shared folders, but tried switching to an rsynced folder because they didn't work. IIRC, the solution provided here solved the problem I was having, in any case.Sells
@SteveBennett, agreed re: potential confusion. All the more reason to clarify. It's hard to imagine this suggestion would have solved your issue when it refers to such an old [long-since-resolved] issue, unless you were using a considerably old version of vagrant. And even if it did, IMO it would have been of very little help considering VBox's abysmal filesystem performance for shared dirs (e.g. "git status" taking several seconds), though it's possible you were sharing only a small project with very few files. mitchellh.com/…Cleistogamy
Running vagrant up in a shell with admin rights is all that is required. As @Cleistogamy pointed out, this config option is already set by default in Vagrant, as of this commit which happened almost a year before this answer was posted. That said, running vagrant up in a shell with admin rights did resolve my problem.Eakin
Does not respond to the question. Its not working on synced folders.Denice
This answer is wrong for 2 major reasons. 1. It refers to VBox shared folders, not rsynced directories--two completely different things. 2. This setting was already a default anyway in Vagrant 1.1, released 15 months before the OP's question. See my answer below for more info.Cleistogamy
Vagrant up needs to be executed in a shell with admin rights on windows.Stowell
A
8

I tried all these options in order to resolve an error running npm install.

Simply running vagrant in an admin prompt and loading the vm (vagrant reload), resolved the issue.

I went back and removed the SharedFoldersEnableSymlinksCreate configuration from the Vagrantfile, and everything was still fine.

Achievement answered 9/1, 2017 at 0:15 Comment(3)
npm update was not working in my vagrant shared folder. This solution fixed it for some reason.Maeve
After more research, it turns out creating a symbolic link requires admin permission in windows by default. To modify permissions, see answer here: superuser.com/a/125981Achievement
Running the Vagrant and command promt as Administrator in Window 10 machine worked for me on npx create-react-app 'project_name'.Gisellegish
C
2

The default synced folder type is vboxsf has known performance issue with large number of files / directories, and lacks support for symbolic links and hard links (see ticket 818 - a 7+ year old bug). Avoid using it.

rsync type synced folder may be your best choice.

You mentioned that it crashed, what version of rsync are you running? Try to update it to 3.1.0 via brew, I know the OOTB one is way too old (2.x), which could be causing issues.

Canned answered 17/6, 2014 at 6:26 Comment(4)
[wdd@localhost ~]$ sudo mount -t rsync node share mount: unknown filesystem type 'rsync'Stauffer
I was glad when I read this answer, thinking it would solve my problem but I get the same as above when I do sudo mount -t rsync shared /var/www the error being mount: unknown filesystem type 'rsync'Barbe
rsync is never a file system type so you won't be able to mount it.Canned
@samyo refer to vagrantup.com/docs/synced-folders/rsync.html you need to configure in the Vagrantfile and manually run vagrant rsync or vagrant rsync-auto. Otherwise it'll be only synced at up and reload.Canned
H
1

After fussing around for an hour and trying a few different solutions (vagrant-vbguest, Marvin's suggested fix), I wasn't able to get symlinks in shared folders to work with VirtualBox 4.8.10, Vagrant 1.5.1.

I found that a simpler solution is to configure a separate shared folder and then use Ruby's File.readlink to read in the underlying path:

config.vm.synced_folder File.readlink('SYMLINK'), "/mount/path"
Honorific answered 25/11, 2014 at 18:15 Comment(1)
I don't get it. Could you explain with an example? ThanksPerkoff
S
1

Add the following line to Vagrantfile:

config.vm.provider "virtualbox" do |v|
    v.customize ["setextradata", :id, "VBoxInternal2/SharedFoldersEnableSymlinksCreate/v-root", "1"]
end

This worked for me ONLY after i downgraded virtualbox 6.0.8 to 6.0.4 and vagrant 2.2.4 to 2.2.1.

when you open terminal ( i use git bash on windows 10) with "Run as Admin".

also try in git bash changing : in project file: $ vim .git/config change to symlinks = true

[core]
        repositoryformatversion = 0
        filemode = false
        bare = false
        logallrefupdates = true
        symlinks = true
        ignorecase = true
[remote "origin"]
        fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
        remote = origin
        merge = refs/heads/master
Smithy answered 30/6, 2019 at 11:41 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.