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


99

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

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

在虚拟机内部,我们要运行Linux。

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

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

在我们的源代码内部,我们实际上确实有一些符号链接,这在VM内部的Linux中不是问题,但是在作为主机的Windows上会引起问题。我们唯一不能做的就是摆脱符号链接,因此我们需要另一种方式来处理这个问题。

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

  • Vagrant 问题中提到了一种解决方法,很遗憾,这仅适用于VirtualBox,对运行VMware的人员没有帮助。到目前为止,根据所使用的提供程序,我们还没有找到在Vagrantfile中运行代码的方法。
  • 现在,我们尝试使用rsync类型而不是使用标准的共享文件夹。这在Windows上有效,但在OS X上崩溃,并显示许多错误symlink has no referent(每个符号链接一个错误)。
  • 我们考虑过NFS,但这仅在不将Windows用作主机的情况下有效。
  • 我们虽然也关于SMB,但是这再次只能在Windows上作为主机工作。

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

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



@SteveBennett,该问题(当前接受的答案参考)已在Vagrant 1.1中解决,该问题已在OP发布问题之前15个月发布。无论如何,这都是关于VirtualBox共享文件夹,而不是rsync文件夹。请参阅下面的答案(接受的答案是错误的)。
jdunk

Answers:


64

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

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

另外,在Windows上,需要在具有管理员权限的shell中执行vagrant up。无需任何解决方法。


9
我怀疑OP和许多查看此问题的人都在交替使用“共享”和“同步”一词。注意OP的第二个要点,强烈暗示他正在使用共享文件夹,但是由于它们不起作用而尝试切换到rsynced文件夹。IIRC,无论如何,这里提供的解决方案解决了我遇到的问题。
史蒂夫·本内特

2
@SteveBennett,同意重新:潜在的混乱。还有更多原因需要澄清。除非您使用的是旧版本的无业游民,否则很难想象这个建议在解决了这么老的问题(早已解决)时会解决您的问题。即使这样做,对于IMO,考虑到VBox对于共享目录的糟糕的文件系统性能(例如,“ git status”需要花费几秒钟),它也几乎没有帮助,尽管您可能只共享一个很少文件的小项目。 mitchellh.com/…–
jdunk

5
只需要vagrant up在具有管理员权限的shell中运行。正如@jdunk所指出的那样,自该提交之日起,在提交此答案之前将近一年,该配置选项已在Vagrant中默认设置。就是说,vagrant up在具有管理员权限的shell中运行确实解决了我的问题。
Ajedi32

2
不回答问题。它不适用于同步文件夹。
Manel

这个答案是错误的,主要有两个原因。1.它指的是VBox共享文件夹,而不是rsync目录-完全不同的两件事。2.无论如何,此设置在Vagrant 1.1中已经是默认设置,在OP提出问题之前15个月发布。请参阅下面的我的答案以获取更多信息。
jdunk

94

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


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

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

我还在流浪者的github上打开了这个问题,以指出其默认值似乎有误rsync__args(特别--copy-links--archive,至少在复制复制的符号链接方面,默认args之一似乎在破坏另一个))。


好的电话-感谢@jdunk。是的,根据Vagrant文​​档,该--copy-links选项默认设置。这是我的问题。通过删除(使用上面的答案),即可解决问题。
Phil Birnie 2015年

1
非常有用,谢谢。虽然我希望Windows可以替代。
Aleksandr Makov

4
请注意,根据Vagrant文​​档,共享文件夹是VirtualBox用户的默认同步文件夹类型:“如果使用VirtualBox提供程序,则VirtualBox共享文件夹是默认的同步文件夹类型。” (docs.vagrantup.com/v2/synced-folders/virtualbox.html)OP的问题似乎也暗示了VirtualBox共享文件夹是一个问题,因此,被接受的答案确实试图解决至少部分问题(确实如此)为我解决问题)。
Ajedi32

非常感谢您保存我的屁股,我在互联网上到处可见,终于有人知道了这个问题!
Dovizu 2015年

1
谢谢。这就是解决我的问题的方法(标题中的一个,而我到达这里寻求解决的一个,但令人困惑的不是被问到的那个)。
johncip '16

6

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

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

我返回并SharedFoldersEnableSymlinksCreate从Vagrantfile中删除了配置,一切仍然正常。


npm update在我的vagrant共享文件夹中不起作用。此解决方案由于某种原因对其进行了修复。
Emre'2

1
经过更多研究,事实证明,默认情况下,创建符号链接需要Windows中的管理员权限。要修改权限,请参见此处的答案: superuser.com/a/125981
gameweld

2

默认的同步文件夹类型是vboxsf已知的性能问题,其中包含大量文件/目录,并且不支持符号链接和硬链接(请参见故障单818 -7年以上的错误)。避免使用它。

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

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


[wdd@localhost ~]$ sudo mount -t rsync node share mount: unknown filesystem type 'rsync'
Musa Haidari '16

1
当我读到这个答案时,我感到很高兴,认为它可以解决我的问题,但是当我遇到sudo mount -t rsync shared /var/www错误时,我得到的和上面相同mount: unknown filesystem type 'rsync'
samayo

rsync永远不是文件系统类型,因此您将无法挂载它。
Terry Wang

@samyo请参阅vagrantup.com/docs/synced-folders/rsync.html,您需要在中进行配置Vagrantfile并手动运行vagrant rsyncvagrant rsync-auto。否则,它将仅在启动时进行同步并重新加载。
特里·王

1

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

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

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

1
我不明白 你能举个例子解释吗?谢谢
Cassiano

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 / 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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.