101

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

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

在我们想要运行 Linux 的 VM 内部。

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

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

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

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

  • Vagrant 的一期中提到了一种解决方法,不幸的是,这仅适用于 VirtualBox,对运行 VMware 的人没有帮助。到目前为止,我们还没有找到根据所使用的提供程序在Vagrantfile中运行代码的方法。
  • 我们现在尝试使用rsync类型,而不是使用标准共享文件夹。这在 Windows 上有效,但在 OS X 上崩溃并出现许多错误,告诉我们symlink has no referent(每个符号链接一个错误)。
  • 我们考虑过NFS,但这仅在您不使用 Windows 作为主机时才有效。
  • 我们也考虑过SMB,但这同样只适用于作为主机的 Windows。

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

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

4

6 回答 6

96

接受的答案不好。该问题描述了同步文件夹而不是 共享文件夹的问题。建议的解决方案对 rsynced(非共享)文件夹没有影响。即使 OP 使用的是共享文件夹,接受的答案的建议也是从 1.1 开始已经集成到 vagrant 中的东西,在 OP 发布问题前 15 个月发布(更不用说VirtualBox 的共享文件夹非常慢)。


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

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

我还在vagrant 的 github 上打开了这个问题,以指出它们的默认值似乎有问题rsync__args(具体来说,默认参数之一--copy-links,,似乎正在破坏另一个,,--archive至少就复制损坏的符号链接而言)。

于 2015-03-13T00:20:03.150 回答
68

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

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

此外,在 Windows 上,vagrant up 需要在具有管理员权限的 shell 中执行。无需变通方法。

于 2014-06-23T11:58:21.157 回答
7

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

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

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

于 2017-01-09T00:15:53.267 回答
2

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

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

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

于 2014-06-17T06:26:42.577 回答
1

在大惊小怪了一个小时并尝试了几种不同的解决方案(vagrant-vbguestMarvin 建议的修复)之后,我无法在共享文件夹中获取符号链接以与 VirtualBox 4.8.10、Vagrant 1.5.1 一起使用。

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

config.vm.synced_folder File.readlink('SYMLINK'), "/mount/path"
于 2014-11-25T18:15:52.553 回答
1

将以下行添加到 Vagrantfile:

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

只有在我将 virtualbox 6.0.8 降级到 6.0.4 并将 vagrant 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
于 2019-06-30T11:41:00.370 回答