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

Synchronization Vagrant中的符号链接和同步文件夹,synchronization,sync,vagrant,rsync,vagrantfile,Synchronization,Sync,Vagrant,Rsync,Vagrantfile,我想使用Vagrant为我的团队提供一个通用的开发环境。主机完全不同: 有些使用OSX,有些使用Linux,有些使用Windows 有些使用VMware,有些使用VirtualBox 在虚拟机内部,我们希望运行Linux 到目前为止,一切都很好 现在我们的想法是每个开发人员都可以使用他们选择的IDE,因此我们引入了一个同步文件夹,在主机和VM之间共享源代码。基本上,除了符号链接,它也可以工作 在我们的源代码中,我们确实有一些符号链接,这在Linux的VM中不是问题,但在Windows作为主机

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

  • 有些使用OSX,有些使用Linux,有些使用Windows
  • 有些使用VMware,有些使用VirtualBox
在虚拟机内部,我们希望运行Linux

到目前为止,一切都很好

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

在我们的源代码中,我们确实有一些符号链接,这在Linux的VM中不是问题,但在Windows作为主机时,这会导致问题。我们唯一不能做的就是去掉符号链接,所以我们需要另一种方法来处理这个问题

到目前为止,我们已经尝试了多种选择:

  • 在一篇关于Vagrant的文章中提到了一个变通方法,不幸的是,这只是VirtualBox,对运行VMware的人没有帮助。到目前为止,我们还没有找到在Vagrant文件中运行代码的方法,具体取决于所使用的提供程序
  • 我们不再使用标准的共享文件夹,而是尝试使用该类型。这在Windows上有效,但在OS X上崩溃,并出现大量错误,告诉我们
    符号链接没有引用对象(每个符号链接一个错误)
  • 我们考虑过,但这只有在不使用Windows作为主机时才有效
  • 我们也考虑过,但这同样只适用于Windows作为主机
我无法想象,我们是这个星球上唯一或第一个在共享文件夹中遇到多平台主机和符号链接问题的人


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

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

rsync类型的同步文件夹可能是您的最佳选择


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

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

config.vm.provider "virtualbox" do |v|
    v.customize ["setextradata", :id, "VBoxInternal2/SharedFoldersEnableSymlinksCreate/v-root", "1"]
end
config.vm.provider "virtualbox" do |v|
    v.customize ["setextradata", :id, "VBoxInternal2/SharedFoldersEnableSymlinksCreate/v-root", "1"]
end
此外,在windows上,vagrant up需要在具有管理员权限的shell中执行。
无需任何解决方法。

在忙乱了一个小时并尝试了几种不同的解决方案(“代码>vagrant vbguest”
,Marvin建议的修复方案)后,我无法在共享文件夹中获得符号链接以与VirtualBox 4.8.10、vagrant 1.5.1一起使用

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

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

公认的答案是不好的。该问题描述了同步的文件夹、共享的文件夹的问题。建议的解决方案对rsynced(非共享)文件夹没有影响。即使OP使用的是一个共享的文件夹,被接受的答案的建议也是必须的(更不用说)


我遇到了同样的问题:在OSX上,我得到了
symlinkhasnotreferent
rsync错误。我个人能够通过将特定的rsync参数添加到我的
vagrant文件中来解决这个问题

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


我还在vagrant的github上指出了
rsync_uuargs
的默认值似乎有问题(具体地说,其中一个默认args,
--copy links
,似乎正在破坏另一个,
--archive
,至少就复制损坏的符号链接而言是如此).

为了解决运行
npm安装时出现的错误,我尝试了所有这些选项

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


我返回并从Vagrant文件中删除了
SharedFolderEnableSymLinksCreate
配置,但一切正常。

在Vagrant文件中添加以下行:

config.vm.provider "virtualbox" do |v|
    v.customize ["setextradata", :id, "VBoxInternal2/SharedFoldersEnableSymlinksCreate/v-root", "1"]
end
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/config 更改为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

这里的讨论:@SteveBennett,这个问题(当前被接受的答案引用)在Vagrant 1.1中得到了解决,该版本在OP发布问题前15个月发布。这是关于VirtualBox共享文件夹,而不是rsync文件夹。请看下面我的答案(被接受的答案是错误的)。我怀疑OP和许多查看此问题的人交替使用了术语“共享”和“同步”。请注意OP的第二个要点,它强烈暗示他正在使用共享文件夹,但尝试切换到rsynced文件夹,因为它们不起作用。“IIRC,这里提供的解决方案解决了我遇到的问题,无论如何。”SteveBennett同意:潜在的困惑。更需要澄清的是。很难想象这个建议会解决你的问题,当它提到这样一个古老的[很久以前就解决了]问题时,除非你使用的是相当古老的流浪者版本。即使是这样,在我看来,考虑到VBox在共享dir方面糟糕的文件系统性能(例如,“git status”需要几秒钟),它也没有什么帮助,尽管您可能只共享了一个只有很少文件的小项目。在具有管理员权限的shell中运行
vagrant up
。正如@jdunk指出的那样