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

时间:2012-02-24 16:26:19

标签: virtualbox vagrant

我的Vagrant项目已经解除了与VirtualBox VM的关联,所以当我vagrant up Vagrant将导入基础框并创建一个新的虚拟机时。

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

9 个答案:

答案 0 :(得分:192)

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

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

VBoxManage list vms

你会有这样的事情:

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

2)转到以下路径:

cd .vagrant/machines/default/virtualbox

3)创建一个名为 id 的文件,其ID为xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx

4)保存文件并运行 vagrant up

答案 1 :(得分:87)

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

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

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

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

如果您的VM以某种方式取消关联,您可以执行VBoxManage list vms,它将列出VirtualBox通过其名称和UUID知道的每个VM。然后在与.vagrant相同的目录中手动创建Vagrantfile文件,并正确填写内容。

运行vagrant status以确保Vagrant选择了正确的更改。

注意: Vagrant并未对此进行正式支持,Vagrant可能会随时更改.vagrant的格式。但这在Vagrant 0.9.7中有效,对Vagrant 1.0有效。

答案 2 :(得分:48)

上层版本的解决方案完全相同。

但首先您需要手动启动.vbox文件,以使其显示在VBoxManage list vms

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

答案 3 :(得分:13)

如果今天出现问题,我的.vagrant文件夹丢失,发现除了设置ID之外还有一些步骤:

  1. 设置ID:

    VBoxManage list vms
    

    {project-folder}/.vagrant/machines/default/virtualbox/id中找到ID并进行设置。

    请注意,如果default中设置了Vagrantfile,则config.vm.define "someothername"可能会有所不同。 action_provision

  2. 停止配置机器:

    在与id文件相同的目录中创建名为1.5:{id}的文件,将其内容设置为:{id}.vagrant/machines/default/virtualbox/private_key替换为ssh-keygen -t rsa 第1步。

  3. 设置新的公钥/私钥:

    Vagrant使用存储在private_key中的私钥来进入机器。您需要生成一个新的。

    vagrant ssh

    将其命名为private_key.pub

    /home/vagrant/.ssh/authorized_keys然后将<?xml version="1.0" encoding="utf-8"?> <android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent"> <RelativeLayout android:layout_width="match_parent" android:layout_height="match_parent"> <ImageView android:id="@+id/imageView" android:layout_width="116dp" android:layout_height="178dp" android:layout_alignParentLeft="true" android:layout_alignParentStart="true" android:layout_alignParentTop="true" android:layout_marginLeft="16dp" android:layout_marginTop="16dp" tools:src="@drawable/pets"/> <TextView android:id="@+id/textView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignTop="@+id/imageView" android:layout_marginLeft="16dp" android:layout_marginRight="16dp" android:layout_toEndOf="@+id/imageView" android:layout_toRightOf="@+id/imageView" tools:text="Lorem ipsum dolor sit amet, consectetur adipiscing elit. Quisque molestie tincidunt mi a gravida. Aenean faucibus a sapien ut consequat. Praesent sed placerat quam."/> </RelativeLayout> </android.support.constraint.ConstraintLayout> 复制到//regvalu can be ^[-+]?[1-9]\d*$(dont alow zero in from ///or ^\d+$ for any digit var regex = new RegExp(regVal) if($('#textBox').length == 9 && regex.test($('#textBox').text()) { alert('Your value is invalid'); }

答案 4 :(得分:9)

今天使用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

答案 5 :(得分:6)

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

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

您可以从用于创建这些VM的Vagrant文​​件中获取vm名称。寻找这一行:

config.vm.define :web do |web_config|

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

答案 6 :(得分:3)

在Vagrant 1.9.1中:

我在Virtual Box中有一个名为'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

答案 7 :(得分:3)

这是从@Petecoop's answer修改的。

如果您尚未关闭此框,请运行vagrant halt

然后列出您的虚拟盒:VBoxManage list vms

它会列出所有虚拟盒。确定要还原到的框并获取大括号之间的ID:{}

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

将其替换为您从VB列表中复制的ID。

尝试vagrant reload

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

然后运行vagrant reload。它会说它识别出不安全的密钥并创建一个新密钥。

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!

你应该全力以赴。

答案 8 :(得分:0)

我在macos上发现删除盒子上的.locks解决了我的问题。

出于某种原因

vagrant halt

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

只剩下一个小问题,它启动进了grub,所以我不得不按一次输入,不知道这是否存在,但我很快就会发现。

我正在运行vagrant 1.7.4和virtualbox 5.0.2