Vagrant VM不保存任何更改;每次`halt / suspend + up`时都会创建新的VM(Windows Vagrant,VirtualBox,RailsDevBox)

时间:2014-08-25 16:14:29

标签: ruby-on-rails linux virtual-machine vagrant virtualbox

我正在尝试在Windows机器上使用Virtual Box + Vagrant + Rails Dev Box。我能够运行vagrant upvagrant ssh进入虚拟机,但我没有保存任何更改,例如安装rails。每当我halt Vagrant并重新开始时,它就好像我是第一次加载它一样。该过程将完成构成第一个vagrant up的所有步骤。

但是,我注意到,我对Vagrantfile(同步文件夹位置)所做的一项更改是持久的。此外,如果我使用vagrant reload,则更改似乎仍然存在。因此,只有当我使用vagrant haltvagrant suspend后跟vagrant up时才会出现问题。但我并不认为vagrant halt(尤其不是vagrant suspend)应该销毁虚拟机。

当我打开VirtualBox Manager时,我可以看到一堆已创建的rails-dev-box VM实例。

我在Vagrant Github issues网站上发现了一个看起来像这样的问题,但老实说,讨论完全在我头上,即使该线程已关闭,我也无法理解解决方案。

如果有人知道原因是什么,并且可以在" newbie"术语,或者,如果我的问题太不透明,可以引导我完成下一步的调试,我真的很感激!

修改 写完这篇文章并进一步思考之后,我意识到问题实际上并不是“变化没有得到保存。”#34;他们正在被保存......但我只是在我vagrant up运行时被带到一个全新的VM。

3 个答案:

答案 0 :(得分:1)

您是否尝试过vagrant resume而不是vagrant up

答案 1 :(得分:1)

我一直有同样的问题,并且有几种可能的解决方案。

Vagrant用于跟踪默认VM的文​​件是.vagrant/machines/default/virtualbox/id。 (该文件的内容将是VM的UUID,可以在VirtualBox.xml文件中找到。)如果在那里引用的VM有任何问题,那么Vagrant显然只删除该文件并告诉您重新开始。

一个GitHub issue报告了同样的问题,在这种情况下,VM处于"无效状态"在VirtualBox中。通过删除损坏的保存状态解决了该问题。

这可能是你遇到的问题,虽然它不是我的。 如果我弄清楚为什么会遇到这个问题,我会更新这个答案。

编辑:我从VirtualBox Manager手动启动了我的流浪虚拟机(虽然我无法将其用于开发,因为共享文件夹不是由Vagrant设置的)。我没有看到任何重大问题,所以我把它关了。接下来,我手动替换了id文件,如上所述。我又做了vagrant up并且有效。请注意,为了防止重新配置,您还需要在同一文件夹中重新创建action_provision文件。我的内容是:1.5:<uuid>,其中<uuid>是机器的UUID。 (我不确定1.5意味着什么..)我已经多次完成了vagrant suspendvagrant halt(每个vagrant up后面),并且避难所有任何进一步的问题。我仍然不知道是什么导致了这个问题。如果我有任何其他问题,或者发现为什么会这样,我会再次在这里报告。

编辑2:我终于找到了问题所在。首先,为了帮助追踪事情,我做了VAGRANT_LOG=debug vagrant status。这产生了很多输出,但是当我挖掘它时,我发现了一条特别感兴趣的行:VBoxManage.exe: error: could not find a registered machine with uuid <uuid>。然后我做了一些手动调试,发现VBoxManage.exe list vms返回空白。事实证明,VirtualBox已经忘记了我的.VirtualBox文件夹,因为我在Cygwin中完成了所有这些操作。更多的调试,我发现VirtualBox正在寻找的环境变量是HOME。我将其设置为我的/cygdrive/c/Users/<me>中的Windows主目录(.bashrc),它解决了问题,这次更加永久。

<强> TL; DR:

  1. 打开VirtualBox GUI并确保没有与您的VM相关的错误。
  2. 如果您在Cygwin,请确保HOME设置为正确的值。
  3. 否则,将VAGRANT_LOG=debug添加到任何Vagrant命令以进一步调试。

答案 2 :(得分:0)

首先,将VM的状态设置为您想要的状态,即安装和配置所有内容。

当VM正在运行时,执行vagrant global-status会获得“ID”。然后执行vagrant package {id}将其打包到本地package.box文件中。

vagrant box add package.box --name {whatever-name} - 应该将您的方框添加到可用的方框列表中。

然后,您可以创建新的 Vagrantfile ,也可以修改现有的 Vagrantfile ,以使用此新名称加载vm。

希望这有帮助。