Vagrant虚拟机不能保存任何更改,每次执行`halt/suspend + up`操作就会创建新的虚拟机(Windows Vagrant,VirtualBox,RailsDevBox)。

4
我正在尝试在Windows机器上使用Virtual Box + Vagrant + Rails Dev Box。我可以运行vagrant upvagrant ssh进入虚拟机,但是我所做的更改都未被保存,例如安装rails。每次我停止Vagrant并重新开始时,就像我第一次加载它一样。该过程通过所有步骤,使第一个vagrant up
然而,我注意到Vagrantfile(同步文件夹位置)所做的一个更改仍在持续。此外,如果我使用vagrant reload,更改似乎会持久存在。因此,看起来只有在我使用vagrant haltvagrant suspend后跟vagrant up时才会出现问题。但我没有印象vagrant halt(特别是不是vagrant suspend)应该销毁VM。
当我打开VirtualBox Manager时,我可以看到已创建了许多rails-dev-box VM实例。
我在Vagrant Github issues 上发现了一个类似于这样的问题,但说实话,讨论内容完全超出了我的理解范围,即使该线程已关闭,我也无法理解解决方法。如果有人知道是什么原因并能用“新手”术语解释一下,或者如果我的问题太难以理解,能够引导我执行下一步调试操作,我将不胜感激!
编辑:在写出这篇文章并仔细思考后,我意识到问题实际上并不是“更改没有被保存”。它们被保存了……但每次运行vagrant up时,我都会进入一个全新的虚拟机。
3个回答

1

你试过使用vagrant resume而不是vagrant up吗?


1
我认为vagrant resume只有在之前使用了vagrant suspend才能正常工作。我想解决这个问题的“变通方法”是永远不要使用vagrant halt + vagrant up,而是始终使用vagrant suspend + vagrant resume。但这并不能真正解决问题。vagrant up本来就不应该每次都创建一个新的虚拟机。 - sixty4bit
根据文档,“vagrant up”命令确实会创建一个新的虚拟机。“此命令将根据您的Vagrantfile创建和配置客户机。”https://docs.vagrantup.com/v2/cli/up.html - Tarik

1
我一直遇到这个问题,有几种可能的解决方法。
Vagrant用于跟踪默认VM的文件是.vagrant/machines/default/virtualbox/id。(该文件的内容将是VM的UUID,可以在VirtualBox.xml文件中找到。)如果那里引用的VM有任何问题,那么Vagrant显然会删除该文件并告诉你重新开始。
一个GitHub issue报告了同样的问题,在那种情况下,VM在VirtualBox中处于“无效状态”。通过删除损坏的保存状态来解决了该问题。
这可能是您正在遇到的问题,尽管这不是我的问题。如果我想出为什么我遇到这个问题的方法,我会更新这个答案。

编辑:我手动从VirtualBox Manager启动了我的vagrant虚拟机(尽管我无法用它进行开发,因为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。我在我的.bashrc中将其设置为我的Windows主目录(/cygdrive/c/Users/<me>),并解决了问题,这次更加永久。

TL;DR:

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

1
非常感谢!从我的角度来看,这似乎是正确的答案。我的虚拟机ID一定发生了变化。不过我不知道是怎么回事,也许是我直接在VirtualBox的图形界面中进行了调整... - robert

0

首先,将虚拟机的状态设置为所需状态,即安装和配置所有内容。

当虚拟机正在运行时,执行vagrant global-status获取盒子的“id”,然后使用vagrant package {id}将其打包成本地的package.box文件。

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

然后,您可以创建一个新的Vagrantfile或修改现有的文件以使用此新名称加载虚拟机。

希望这可以帮助到您。


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