Vagrant中的符号链接和同步文件夹

时间:2014-06-13 07:53:15

标签: synchronization sync vagrant rsync vagrantfile

我想使用Vagrant为我的团队提供一个共同的开发环境。主机完全不同:

  • 有些人使用OS X,某些Linux和某些Windows。
  • 有些使用VMware,有些使用VirtualBox。

我们希望在VM内部运行Linux。

到目前为止,一切都很好。

现在我们的想法是每个开发人员都应该能够使用他们选择的IDE,因此我们引入了一个同步文件夹,该文件夹共享主机和VM之间的源代码。这基本上也适用......除了符号链接。

在我们的源代码中,我们确实有一些符号链接,这在VM内部的Linux中不是问题,但在Windows上作为主机会导致问题。我们做的唯一事情是摆脱符号链接,所以我们需要另一种方法来解决这个问题。

到目前为止,我们尝试了很多选择:

  • 在Vagrant的issue中提到了一种解决方法,遗憾的是这只是VirtualBox,并没有帮助那些运行VMware的人。到目前为止,我们还没有找到在 Vagrantfile 中运行代码的方法,具体取决于所使用的提供程序。
  • 我们现在尝试使用rsync类型,而不是使用标准的共享文件夹。这适用于Windows,但在OS X上发生崩溃,但有一些错误告诉我们symlink has no referent(每个符号链接一个错误)。
  • 我们考虑了NFS,但这只有在您不使用Windows作为主机时才有效。
  • 我们也讨论SMB,但这只能在Windows上作为主机使用。

我无法想象我们是这个星球上唯一或第一个遇到共享文件夹中多平台主机和符号链接问题的人。

如何解决此问题,以便我们可以保留符号链接,但仍使用不同的主机操作系统?

6 个答案:

答案 0 :(得分:90)

接受的答案是不好的。该问题描述了同步文件夹, 共享 文件夹的问题。建议的解决方案对rsynced( not shared )文件夹没有影响。即使OP使用共享文件夹,已接受答案的建议也是already been integrated into vagrant as of 1.1, released 15 months before the OP posted the question(更不用说VirtualBox's shared folders are abysmally slow)。


我遇到了同样的问题:在OS X上,我收到了symlink has no referent rsync错误。我个人能够通过向我的vagrantfile添加特定的rsync args来解决它:

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

我也在流浪汉的github上opened this issue指出了rsync__args的默认值(特别是默认args --copy-links之一)似乎错误的东西打破另一个,--archive,至少就复制破碎的符号链接而言。)

答案 1 :(得分:56)

出于安全原因,Virtualbox不允许在共享文件夹上使用符号链接。要启用符号链接,需要将以下行添加到Vagrantfile中的vm提供程序配置块:

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

此外,在Windows上,需要在具有管理员权限的shell中执行vagrant up。 没有必要的解决方法。

答案 2 :(得分:5)

我尝试了所有这些选项,以解决运行npm install的错误。

只需在管理员提示符中运行vagrant并加载vm(vagrant reload)即可解决问题。

我回去并从Vagrantfile中删除了SharedFoldersEnableSymlinksCreate配置,一切都还不错。

答案 3 :(得分:2)

默认的同步文件夹类型vboxsf已知存在大量文件/目录的性能问题,并且缺少对符号链接和硬链接的支持(请参阅ticket 818 - 一个7岁以上的bug )。避免使用它。

rsync type synced文件夹可能是您的最佳选择。

你提到它崩溃了,你在运行什么版本的rsync?尝试通过brew将它更新到3.1.0,我知道OOTB太旧了(2.x),这可能会导致问题。

答案 4 :(得分:1)

经过一个小时的忙碌并尝试了几个不同的解决方案(vagrant-vbguest,Marvin的建议修复),我无法在共享文件夹中获取符号链接以使用VirtualBox 4.8。 10,Vagrant 1.5.1。

我发现更简单的解决方案是配置一个单独的共享文件夹,然后使用Ruby的File.readlink来读取基础路径:

config.vm.synced_folder File.readlink('SYMLINK'), "/mount/path"

答案 5 :(得分:0)

将以下行添加到Vagrantfile:

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

在我将virtualbox 6.0.8降级到6.0.4之后,这对我唯一有效 和无业游民2.2.4至2.2.1

当您打开终端时(我在Windows 10上使用git bash) 使用“以管理员身份运行”。

也可以尝试git bash更改: 在项目文件中: $ vim .git /配置 更改为 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
相关问题