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


132

我的Vagrant项目以某种方式已经使其自身与其VirtualBox VM脱离关联,因此,当我vagrant upVagrant导入基础箱并创建新的虚拟机时。

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

Answers:


89

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

Vagrant使用与“ Vagrantfile”相同目录中的“ .vagrant”文件来跟踪VM的UUID。如果虚拟机不存在,则此文件将不存在。该文件的格式为JSON。如果存在单个VM,则如下所示:

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

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

如果您的VM失去联系,您可以做的是执行操作VBoxManage list vms,该操作将按VirtualBox的名称和UUID列出每个VirtualBox知道的VM。然后.vagrant,在与您的目录相同的目录中手动创建文件,Vagrantfile并正确填写内容。

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

注意: Vagrant并未对此提供正式支持,Vagrant可能随时更改其格式.vagrant。但这从Vagrant 0.9.7开始有效,并将对Vagrant 1.0有效。


太棒了!谢谢。我感觉有些东西丢失了。
jrdmcgr 2012年

48
对于Vagrant 1.1,UUID存储在特定于计算机的文件中,位于.vagrant/machines/{name}/{provider}/id。实际上,文件包含的唯一内容是UUID。

2
我尝试了这个技巧,但是无业游民的状态只是报告该状态为未创建。然后流浪汉创建一个新的虚拟机并正常工作。如果我更改了id文件,那么即使我将其更改回刚创建的框的uuid,它也会报告未创建。
Reece Marsland

4
使用Vagrant 1.1+,请确保不要在ID的末尾添加换行符。有关详细信息,请参见github.com/mitchellh/vagrant/issues/1755
MadsMobæk'13

1
我在个人资料(Mac)中寻找.vagrant。请注意(至少对我而言),它与cookbooks文件夹和VagrantFile位于同一文件夹中。(流浪者版本1.4.3)
allicarn 2014年

208

对于流浪汉1.6.3,请执行以下操作:

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

VBoxManage list vms

您将拥有以下内容:

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

2)转到以下路径:

cd .vagrant/machines/default/virtualbox

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

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


8
使用换行符创建id文件的好方法是。echo -n '<your id here>' > id
熊加米奥夫

1
效果很好。但是为什么会这样呢?
JohnnyQ

为我使用了Vagrant 1.7.2。谢谢!
拉芬,2016年

1
工作完美。
Casey Robinson

#test1和test2盒子...for box in test1 test2; do virtualboxid=$(VBoxManage list vms | grep $box | cut -d' ' -f2); echo -n $virtualboxid > .vagrant/machines/$box/virtualbox/id; done
luismartingil '18

48

高版本的解决方案是完全相同的。

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

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


4
另外,值得注意的是,如果要编辑id文件,则必须将其保持在一行中。由于某种原因,它不喜欢换行符结尾(我的文本编辑器默认情况下添加了换行符,所以我遇到了问题)。
Dan2552 2013年

我遇到了一个问题,因为我已经重命名了该文件夹所在的文件夹。Vagrant坚持使用与该文件夹相同的名称创建一个新的VM,而不是使用现有的VM。我通过创建.vagrant1.0格式的文件来修复它,并自动对其进行了升级。我这样做后,实际上将旧VM重命名为新项目目录名称。
约拿(Jonah)

2
我不确定是什么原因导致断开连接,而我的vagrant / machines / default / virtualbox / id指向错误的VirtualBox机器ID。帮助的文件是$ HOME / .VirtualBox / VirtualBox.xml。它有一个MachineRegistry部分,其中的VirtualBox机器UUID映射到机器名称。例如<MachineEntry uuid =“ {f232f951-103b-af28-9f8d-b2ab21bs258f}” src =“ $ HOME / VirtualBox VMs \ <计算机名称> \ <计算机名称> .vbox” />
arntg 2014年

14

今天遇到了这个问题,我的.vagrant文件夹不见了,发现除了简单地设置id以外,还有更多步骤:

  1. 设置ID:

    VBoxManage list vms
    

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

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

  2. 停止供应机器:

    创建一个action_provision与该id文件位于同一目录中的文件,并将其内容设置为:1.5:{id}{id}在步骤1中找到的ID 替换。

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

    Vagrant使用存储在其中的私钥.vagrant/machines/default/virtualbox/private_key来SSH进入计算机。您需要生成一个新的。

    ssh-keygen -t rsa
    

    命名private_key

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


是“ authorized_keys”文件或目录?
user2568374

这是一个文件,如果您对其进行搜索,则会发现很多东西,这是标准的ssh内容
Petecoop

因为我使用的是相同的键,所以不必执行最后一个setp(第三次)。否则,解释得很好,一切都完美。
达札

如何在win10上进行第三步?
navono

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

6

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

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

您可以从用于创建这些虚拟机的Vagrantfile中获取虚拟机名称。查找以下行:

config.vm.define :web do |web_config|

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


db是默认的VM?
罗伯特

1
我认为这里没有默认值,只有web和db。根据Vagrantfile,有一个先构建vm的顺序。
agwntr 2014年

5

我在OSX El Capitan上使用Vagrant 1.8.1

重新启动计算机后,我的虚拟机未正确关闭,因此当我尝试运行时,vagrant up它总是在创建新的虚拟机。这里没有解决方案对我有用。但是有效的是英格米里洛答案的变化

因此,与其.vagrant/machines/default/virtualbox/id根据运行的ID 进行创建,不如说它是基于ID的VBoxManage list vms。我必须更新ID.vagrant/machines/local/virtual_box/id

我有一个班轮,基本上可以帮我做到这一点:

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

假设第一个框是我需要从运行开始的那个框 VBoxManage list vms


4

这是从@Petecoop的答案中修改

运行vagrant halt如果你还没有关闭箱呢。

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

它将列出您的所有virtualbox。确定您要还原的框并抓住大括号之间的ID :{}

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

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

尝试vagrant reload

如果那行不通,并且挂在SSH授权上(我绊倒了),请从无所事事的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!

你应该准备好了。


3

在流浪汉1.9.1中:

我在Virtual Box中有一个名为'Ubuntu 16.04.1'的VM,因此我将其打包为一个无聊的盒子,其内容如下:

vagrant package --base "Ubuntu 16.04.1"

回应...

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

0

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

因为某些原因

vagrant halt

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

仅剩下一个小问题,它启动到grub中,因此我不得不按Enter键一次,不知道这种情况是否会持续,但是我很快就会发现。

我正在运行流浪汉1.7.4和virtualbox 5.0.2

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.