在Dropbox上的Vagrant .vagrant文件

3
我在家和办公室两台机器上使用Vagrant,并将我的工作目录存储在Dropbox中。我经常遇到以下问题:
The VirtualBox VM was created with a user that doesn't match the
current user running Vagrant. VirtualBox requires that the same user
be used to manage the VM that was created. Please re-run Vagrant with
that user. This is not a Vagrant issue.

这个问题可以轻松地通过 brute-force 方法解决,即使用命令 rm -rf .vagrant,但我想找到更加优雅的解决方法——例如一种便捷的自动化方式,将.vagrant文件放在其他地方。
更新:
以下是场景:共用一个工作目录,通过 Dropbox 在办公室和家里的机器之间共享。
  1. 我在办公室的机器上执行了 vagrant up 命令,成功启动虚拟机。
  2. 我关掉了办公室的机器并回家了。
  3. 当我再次执行 vagrant up 命令时,出现了错误提示,说id 的值与创建时不同(通常情况下是 503 和 501)。
  4. 我执行 rm -rf .vagrant 命令,然后再次执行 vagrant up 命令,成功启动虚拟机。
  5. 当我回到办公室时,遇到了同样的问题。

它是什么时候发生的?当你运行vagrant up时吗?所以要明确一下,你的.vagrant目录在Dropbox中,但虚拟机不在其中?你的虚拟机也在Dropbox中吗?VirtualBox的问题在于VM位于一个中央文件夹中(例如,对于Mac,是/Users/user/Documents/Virtual Machines)(例如,VMware将VM存储在.vagrant目录中,这比备份项目容易,但另一个故事),因此可能不是工作目录的一部分,然后你的两台机器中的每一台都创建了自己的VM,并具有自己的ID,因此当你切换机器时会出现问题。 - Frederic Henri
是的,当我运行 vagrant up 时会出现这种情况。请参见上面的内容。 - Charlie Martin
我可以问一下你为什么要这样做吗?Vagrant背后的一般理念是VMs易于重新创建,因此您应该能够轻松地为家庭和办公室创建盒子,而不需要共享.vagrant目录-它们具有不同的机器ID是可以接受的,因为您的配置脚本应确保构建相同的盒子。 - Brian Brownton
我想这么做是因为我在家和办公室都使用同样的文件。配置脚本没有帮助,因为这个问题是由于一个机器镜像在一个盒子上建立了id 501,而在另一个盒子上建立了id 503; vbox根本没有查看机器内部。不幸的是,这确实有所区别,因为它会导致上面的错误消息。 - Charlie Martin
2个回答

2

关于原始问题:

我收到了有关vagrant up的消息,说id值与创建时不同。(通常为503 vs 501)

您可以通过编辑以下文件中的UID来修复它.vagrant\machines\default\virtualbox\creator_uid,并将501/503更改为0。(0表示您以sudo身份运行)

但我认为另一个问题将出现,即每个机器都会创建自己的虚拟机,并将其存储在/Users/user/Documents/Virtual Machines下,您没有共享这些文件。

当您使用VirtualBox创建VM时,vb将分配VM和ID-此ID是关键,将在vagrant和vb之间建立链接。由于您创建了2个不同的VM,因此VM具有不同的ID,vagrant无法在两者之间切换。

希望到目前为止这很清楚,但如何继续-您将有几个选项:

  1. 显然,您并不太关心虚拟机的内容(因为您使用rm -rf,所以每次切换计算机时都会重新创建虚拟机),因此您可以创建一个.vagrant.home.vagrant.office文件夹,并在更改计算机时将.vagrant指向相应的文件夹,这样您就不需要重新创建虚拟机了,只需从相应的计算机启动虚拟机。这不是理想的解决方案,但是可行。

  2. 您可以通过设置环境变量VAGRANT_CWD来避免从上述步骤中切换.vagrant目录,这样您将不会将.vagrant目录存储在您的Dropbox帐户下,但是您可以编写一个脚本来导出此变量并将.vagrant目录分别存储在每台计算机上的不共享的文件夹中,这样每台计算机都将创建自己的虚拟机。 如果您计划在不同位置拥有不同的位置,则可以在每台计算机的bash配置文件中设置VAGRANT_CWD,但是如果您在两台计算机上具有相同的设置,则可以例如有一个workhere.sh脚本,它将只执行export VAGRANT_CWD=/folder...,如果您在两台计算机上具有相同的设置,则只需在执行vagrant up之前执行source workhere

  3. 另一个选项(我没有测试)需要几个步骤:将VirtualBox中创建的虚拟机从一个计算机导出/导入到另一个计算机。问题在于保留Id。我不确定,但通常情况下,当您将其导入到另一台计算机时,虚拟框应该保留Id。

    • 您可以检查/Users/<user>/Library/VirtualBox/VirtualBox.xml下的文件,并查看<MachineRegistry>下的条目,您将获得机器条目的uuid,在导出/导入后,请确保两台计算机之间的uuid匹配。
    • 对于vagrant,您需要在两台计算机之间同步另一个文件/Users/<user>/.vagrant.d/data/machine-index/index,其中列出了计算机上可用的VM列表。如果您在一台计算机上有其他VM在此计算机上不可用,则同步是可以的,但最好仅复制要同步的VM所需的条目。

完成此操作并同步.vagrant文件夹后,您应该能够从一台计算机或另一台计算机上执行vagrant up

再次说明,我没有测试所有步骤,但我认为这应该可以解决问题。

一些注意事项:

  • 仅当两台计算机具有相同的设置(相同的操作系统(如果不是版本至少是相同的系列),文件夹结构因为某些文件涉及完整路径,相同的虚拟机版本等)时,此方法才有效。
  • Vagrant box应在两台计算机上同步(但我假设这是情况,因为您可以从相同的Vagrantfile启动vagrant up)。
  • 如果您在任何一台计算机上销毁/创建VM,则需要再次同步ID,因为虚拟机将每次创建新VM都分配一个新ID。

问题不在于Vagrant密钥,而在于该镜像是由一个盒子上的UID 503创建的,而在另一个盒子上是501。 - Charlie Martin
可能现在还不是机器ID,但它将是 - 我怀疑Vagrant会在两台机器上分配相同的机器ID - 现在编辑.vagrant\machines\default\virtualbox\creator_uid并将其设置为0 - Frederic Henri
@FrédéricHenri,当您说“创建.vagrant.home和.vagrant.office并切换.vagrant以指向相应的文件夹”时,您是在说要将.vagrant作为符号链接指向适当的文件夹吗? - clarity123
@user454038,符号链接是理想的选择,但由于需要在Dropbox中共享,因此您无法真正拥有它。我添加了另一个选项,使用VAGRANT_CWD环境变量,您可以使用它来指向不在Dropbox文件夹中的a.vagrant目录。 - Frederic Henri
那么,如果有一个符号链接链 a -> b -> 实际目标,那么 Dropbox 就会在其文件夹外部保留一个指向中间符号链接 b 的符号链接 a。这个中间符号链接 b 在家时指向主目录,而在办公室时则指向办公室。 - clarity123
@user454038,这可能是可行的,尽管使用VAGRANT_CWD环境变量可能更容易,因此您可以直接定位到正确的文件夹。 - Frederic Henri

1

Vagrant提供了一个环境变量,专门用于这种情况: VAGRANT_DOTFILE_PATH

请查看此处的文档:

https://www.vagrantup.com/docs/other/environmental-variables.html#vagrant_dotfile_path

VAGRANT_DOTFILE_PATH

VAGRANT_DOTFILE_PATH可以被设置为更改Vagrant存储虚拟机特定状态(例如VirtualBox虚拟机UUID)的目录。默认情况下,它被设置为.vagrant。如果您将Vagrantfile保存在Dropbox文件夹中以便在桌面和笔记本电脑之间共享文件夹(例如),Vagrant会用最近使用的主机上VM的详细信息覆盖此目录中的文件。为了避免这种情况,您可以在各自的机器上将VAGRANT_DOTFILE_PATH设置为.vagrant-laptop.vagrant-desktop。(记得更新您的.gitignore!)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接