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

如何将Vagrant项目目录与现有VirtualBox VM关联?,virtualbox,vagrant,Virtualbox,Vagrant,不知何故,我的Vagrant项目已经从它的VirtualBox VM中分离出来,这样当我Vagrant启动时Vagrant将导入基本框并创建一个新的虚拟机 有没有办法将Vagrant项目与现有VM重新关联? Vagrant如何在内部将Vagrant文件与VirtualBox VM目录关联?警告:以下解决方案适用于Vagrant 1.0.x,但不适用于Vagrant 1.1+ Vagrant使用与“Vagrantfile”位于同一目录中的“.Vagrant”文件来跟踪VM的UUID。如果VM不存在

不知何故,我的Vagrant项目已经从它的VirtualBox VM中分离出来,这样当我
Vagrant启动时
Vagrant将导入基本框并创建一个新的虚拟机

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

警告:以下解决方案适用于Vagrant 1.0.x,但不适用于Vagrant 1.1+

Vagrant使用与“Vagrantfile”位于同一目录中的“.Vagrant”文件来跟踪VM的UUID。如果VM不存在,则此文件将不存在。文件的格式是JSON。如果存在单个VM,则看起来是这样的:

{
   "active":{
      "default":"02f8b71c-75c6-4f33-a161-0f46a0665ab6"
   }
}
default
是默认虚拟机的名称(如果未使用多VM设置)

如果您的虚拟机以某种方式被解除关联,您可以做的是执行
VBoxManage list vms
,它将按名称和UUID列出VirtualBox知道的每个虚拟机。然后在与您的
vagrant文件
相同的目录中手动创建一个
.vagrant
文件,并正确填写内容

运行
vagrant status
,确保vagrant获得了正确的更改


注意:这不是Vagrant的官方支持,Vagrant可能会随时更改
.Vagrant
的格式。但这从Vagrant 0.9.7开始有效,并且将对Vagrant 1.0有效。

对于多VM设置,它将如下所示:

{
   "active":{
        "web":"a1fc9ae4-5d43-49cb-be31-ab3c4f74745d",
        "db":"13503bc5-76b8-4c26-95c4-32435b372212"
   }
}
"virtualMachine" {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}
您可以从用于创建这些虚拟机的文件中获取虚拟机名称。请看这一行:

config.vm.define :web do |web_config|

在这种情况下,“web”是vm的名称。

使用更高版本的解决方案是完全相同的

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


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

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

1) 在文件所在的目录中,运行命令

VBoxManage list vms
您将有如下内容:

{
   "active":{
        "web":"a1fc9ae4-5d43-49cb-be31-ab3c4f74745d",
        "db":"13503bc5-76b8-4c26-95c4-32435b372212"
   }
}
"virtualMachine" {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}
2) 转到以下路径:

cd .vagrant/machines/default/virtualbox
3) 创建一个名为id的文件,其id为您的虚拟机xxxxxxxx-xxxx-xxxx-xxxx-XXXXXXXXXXXXXX


4) 保存文件并运行vagrant up

更新,今天vagrant 1.7.4出现同样的问题:

  • 有用的线程在 特别是使用以下命令:
例如,将“vip-quickstart\u default\u 1431365185830\u 12124”框与vagrant配对

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

我在macos上,发现移除盒子上的.锁解决了我的问题

出于某种原因

vagrant halt
没有移除这些锁,在使用timemachine还原.vagrant/machine/default/virtualbox中的所有设置后,移除这些锁,正确的机器启动

只剩下一个小问题,它被引导到grub中,所以我不得不按一下enter键,不知道这是否会继续,但我很快就会发现


我正在运行vagrant 1.7.4和virtualbox 5.0.2

我在OSX El Capitan上使用vagrant 1.8.1

当我的计算机重新启动时,我的虚拟机没有正确关闭,所以当我尝试
vagrant up
时,它总是在创建新的虚拟机。这里没有解决方案对我有效。但真正起作用的是

因此,不要基于运行
VBoxManage list vms
的id创建
.vagrant/machines/default/virtualbox/id
。我必须更新
.vagrant/machines/local/virtual\u box/id

我有一个单行程序,基本上为我做到了这一点:

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


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

开始的框。今天,我的
.vagrant
文件夹丢失,发现除了简单设置id之外,还有几个步骤:

  • 设置id:

    VBoxManage list vms
    
    {project folder}/.vagrant/machines/default/virtualbox/id
    中查找id并进行设置

    请注意,如果在
    vagrant文件中设置了
    default
    ,则可能会有所不同,例如
    config.vm.define“someothername”

  • 停止计算机设置:

    在与
    id
    文件相同的目录中创建一个名为
    action\u provision
    的文件,将其内容设置为:
    1.5:{id}
    用步骤1中找到的id替换
    {id}

  • 设置新的公钥/私钥:

    Vagrant使用存储在
    .Vagrant/machines/default/virtualbox/private_key
    中的私钥通过ssh连接到机器中。您需要生成一个新的

    ssh-keygen -t rsa
    
    命名为
    私钥

    vagrant ssh
    然后将
    private_-key.pub
    复制到
    /home/vagrant/.ssh/authorized_-key

  • 在第1.9.1条中:

    我在虚拟机中有一个名为“Ubuntu 16.04.1”的虚拟机,所以我将其打包为一个流浪者的虚拟机,其中包含:

    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

    然后列出您的虚拟机盒:
    vboxmanagelistmvm

    它会列出你所有的虚拟箱。确定要还原到的框,并在花括号之间抓取id:
    {}

    然后编辑项目id文件:
    sudo nano.vagrant/machines/default/virtualbox/id
    (从项目目录)

    将其替换为从VBs列表复制的id

    尝试
    流浪者重新加载

    如果这不起作用,并挂起SSH授权(我在那里绊倒了),请从中复制不安全的公钥。替换
    /.vagrant/machines/default/virtualbox/private_key
    的内容。当然,备份原始文件:
    cp private\u key private\u key-bak