我正在尝试在Windows机器上使用Virtual Box + Vagrant + Rails Dev Box。我能够运行vagrant up
和vagrant ssh
进入虚拟机,但我没有保存任何更改,例如安装rails。每当我halt
Vagrant并重新开始时,它就好像我是第一次加载它一样。该过程将完成构成第一个vagrant up
的所有步骤。
但是,我注意到,我对Vagrantfile(同步文件夹位置)所做的一项更改是持久的。此外,如果我使用vagrant reload
,则更改似乎仍然存在。因此,只有当我使用vagrant halt
或vagrant suspend
后跟vagrant up
时才会出现问题。但我并不认为vagrant halt
(尤其不是vagrant suspend
)应该销毁虚拟机。
当我打开VirtualBox Manager时,我可以看到一堆已创建的rails-dev-box VM实例。
我在Vagrant Github issues网站上发现了一个看起来像这样的问题,但老实说,讨论完全在我头上,即使该线程已关闭,我也无法理解解决方案。
如果有人知道原因是什么,并且可以在" newbie"术语,或者,如果我的问题太不透明,可以引导我完成下一步的调试,我真的很感激!
修改
写完这篇文章并进一步思考之后,我意识到问题实际上并不是“变化没有得到保存。”#34;他们正在被保存......但我只是在我vagrant up
运行时被带到一个全新的VM。
答案 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 suspend
和vagrant 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:强>
HOME
设置为正确的值。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。
希望这有帮助。