如何将Vagrant项目目录与现有的VirtualBox VM相关联?

不知何故,我的Vagrant项目已经从VirtualBox虚拟机中解脱出来,所以当我vagrant up Vagrant的时候会导入基本框并创build一个新的虚拟机。

有没有办法将Vagrant项目与现有的VM重新关联? Vagrant如何在内部将Vagrantfile与VirtualBox VM目录相关联?

警告:下面的解决scheme适用于Vagrant 1.0.x,但不适用于 Vagrant 1.1+。

Vagrant使用与“Vagrantfile”相同目录下的“.vagrant”文件来跟踪虚拟机的UUID。 如果虚拟机不存在,该文件将不存在。 该文件的格式是JSON。 看起来像这样,如果一个虚拟机存在:

 { "active":{ "default":"02f8b71c-75c6-4f33-a161-0f46a0665ab6" } } 

default是默认虚拟机的名称(如果您不使用多虚拟机设置)。

如果您的虚拟机以某种方式失去联系,您可以做的是做VBoxManage list vms虚拟机,它将列出VirtualBox知道的每个虚拟机的名称和UUID。 然后在.vagrant文件所在的目录下手动创build一个.vagrant文件并正确填写内容。

运行vagrant status以确保stream浪汉获得适当的变化。

注意:这并不是由Vagrant官方支持的,Vagrant可以随时更改.vagrant的格式。 但是,这是有效的stream浪者0.9.7,并将在Vagrant 1.0有效。

对于Vagrant 1.6.3,请执行以下操作:

1)在Vagrantfile所在的目录中,运行该命令

 VBoxManage list vms 

你会有这样的事情:

 "virtualMachine" {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx} 

2)转到以下path:

 cd .vagrant/machines/default/virtualbox 

3)使用虚拟机的ID创build一个名为id的文件xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx

4)保存文件并运行stream浪汉

高版本的解决scheme是相同的。

但首先你需要手动启动.vbox文件,以便它出现在VBoxManage list vms

然后你可以检查.vagrant/machines/default/virtualbox/id来检查uuid是否正确。

有这个问题今天,我的.vagrant文件夹丢失,发现有几个步骤比简单地设置ID:

  1. 设置id:

     VBoxManage list vms 

    findid并在{project-folder}/.vagrant/machines/default/virtualbox/id

    请注意,如果设置在Vagrantfiledefault可能会有所不同,例如config.vm.define "someothername"

  2. 停止configuration机器:

    在与id文件相同的目录中创build一个名为action_provision的文件,将其内容设置为: 1.5:{id}{id}replace为在步骤1中find的id。

  3. build立一个新的公钥/私钥:

    Vagrant使用存储在.vagrant/machines/default/virtualbox/private_key中的.vagrant/machines/default/virtualbox/private_key ssh进入机器。 你需要生成一个新的。

     ssh-keygen -t rsa`, name it `private_key 

    vagrant ssh然后将private_key.pub复制到/home/vagrant/.ssh/authorized_keys

今天用Vagrant 1.7.4更新同样的问题:

例如,将箱子“vip-quickstart_default_1431365185830_12124”配对为无用的。

 $ VBoxManage list "vip-quickstart_default_1431365185830_12124" {50feafd3-74cd-40b5-a170-3c976348de27} $ echo -n "50feafd3-74cd-40b5-a170-3c976348de27" > .vagrant/machines/default/virtualbox/id 

对于多VM设置,它看起来像这样:

 { "active":{ "web":"a1fc9ae4-5d43-49cb-be31-ab3c4f74745d", "db":"13503bc5-76b8-4c26-95c4-32435b372212" } } 

您可以从用于创build这些虚拟机的Vagrant文​​件中获取虚拟机名称。 找这条线:

 config.vm.define :web do |web_config| 

在这种情况下,“web”是虚拟机的名称。

我在OSX El Capitan上使用Vagrant 1.8.1

当我的电脑重新启动时,我的虚拟机没有正确closures,所以当我试图vagrant up它总是创build新的虚拟机。 这里没有解决scheme为我工作。 但是工作是什么ingmmurillo的答案变化

因此,不要根据运行VBoxManage list vms的id创build.vagrant/machines/default/virtual_box/id 。 我不得不在.vagrant/machines/local/virtual_box/id更新.vagrant/machines/local/virtual_box/id

我有一个class轮,基本上是这样对我来说:

echo -n `VBoxManage list vms | head -n 1 | awk '{print substr($2, 2, length($2)-2)}'` > .vagrant/machines/local/virtualbox/id

这假设第一个盒子是我需要从运行VBoxManage list vms

在Vagrant 1.9.1中:

我有一个名为“Ubuntu 16.04.1”的虚拟机中的虚拟机,所以我把它作为一个stream浪箱子打包:

 vagrant package --base "Ubuntu 16.04.1" 

回应…

 ==> Ubuntu 16.04.1: Exporting VM... ==> Ubuntu 16.04.1: Compressing package to: blah blah/package.box 

我在马科斯,发现删除箱子上的锁解决了我的问题。

因为某些原因

 vagrant halt 

没有删除这些锁,在使用timemachine恢复.vagrant / machine / default / virtualbox中的所有设置后,删除锁,启动了正确的机器。

只剩下1个小问题,它被引导到grub,所以我不得不按一次进入,不知道这是否留下,但我很快就会发现。

我运行vagrant 1.7.4和virtualbox 5.0.2

这是从@ Petecoop的答案修改。

如果你还没有把箱子关掉,你可以逃跑。

然后列出你的virtualboxes: VBoxManage list vms

它会列出所有的虚拟机。 确定您想要还原到的方框,并在大括号之间抓取ID: {}

然后编辑项目ID文件: sudo nano /.vagrant/machines/default/virtualbox/id

将它replace为您从VB列表中复制的ID。

尝试vagrant reload

如果这不起作用,挂在SSH授权 (我偶然发现),从stream氓git复制不安全的公钥。 replace/.vagrant/machines/default/virtualbox/private_key的内容。 当然备份原来的: cp private_key private_key-bak

然后运行vagrant reload 。 它会说这是确定的不安全的关键,并创build一个新的。

 default: Vagrant insecure key detected. Vagrant will automatically replace default: this with a newly generated keypair for better security. default: Inserting generated public key within guest... default: Removing insecure key from the guest if it's present... default: Key inserted! Disconnecting and reconnecting using new SSH key... ==> default: Machine booted and ready! 

你应该全部设置。