如何将Vagrant项目目录与现有的VirtualBox虚拟机关联?

140

我的Vagrant项目不知何故与其VirtualBox VM脱离了联系,这样当我运行vagrant up时,Vagrant会导入基础盒并创建一个新的虚拟机。

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

11个回答

223

对于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


9
创建 id 文件而不换行的好方法是使用命令 echo -n '<你的ID>' > id - Xiong Chiamiov
1
运行得很好。但是为什么会发生这种情况呢? - JohnnyQ
在我的电脑上使用Vagrant 1.7.2可以正常工作。谢谢! - Rafen
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
显示剩余3条评论

91

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

Vagrant使用与您的“Vagrantfile”位于同一目录中的“.vagrant”文件来跟踪虚拟机的UUID。如果不存在VM,则该文件将不存在。该文件的格式为JSON。如果存在单个VM,则它看起来像这样:

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

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

如果您的虚拟机某些原因已经失联,您可以执行 VBoxManage list vms 命令列出 VirtualBox 知道的每个 VM 的名称和 UUID。然后在与您的 Vagrantfile 相同的目录中手动创建一个 .vagrant 文件,并正确填写其内容。

运行 vagrant status 命令以确保 Vagrant 已经正确地读取了更改。

注意:这并不是官方支持的方式,Vagrant 可能随时更改 .vagrant 文件的格式。但此方法适用于 Vagrant 0.9.7 版本,并将适用于 Vagrant 1.0 版本。


48
对于 Vagrant 1.1 版本,UUID 存储在特定于机器的文件中,路径为 .vagrant/machines/{name}/{provider}/id。实际上,该文件唯一包含的就是 UUID。 - user879121
2
我尝试了这个技巧,但是vagrant status仅报告状态为未创建。然后,vagrant up会创建一个新的虚拟机,并正常工作。如果我更改id文件,则即使将其更改回刚刚创建的框的uuid,它也会报告为未创建。 - Reece Marsland
4
在使用Vagrant 1.1及以上版本时,请确保在ID的末尾不要添加换行符。有关详细信息,请参阅https://github.com/mitchellh/vagrant/issues/1755。 - Mads Mobæk
1
我在我的个人资料(Mac)中寻找“.vagrant”文件夹。请注意(至少对于我来说),它与cookbooks文件夹和VagrantFile位于同一文件夹中。(Vagrant版本1.4.3) - allicarn
@Mitchell,有一个受欢迎的 Vagrant 插件 https://github.com/tknerr/vagrant-managed-servers,它允许您使用来自许多项目的现有虚拟机。例如,我在 Windows/OSX 上开发,有一个 vagrant docker-host 机器,我的所有其他项目只需将一些文件夹映射到 docker-host,并在那里启动容器。不幸的是,这个插件有些问题,特别是 rsync/rsync-auto 不能与之一起工作。为什么不将这种可能性作为 Vagrant 的组成部分,这样我们就不必对 .vagrant 文件夹进行修改了呢? - Ross
显示剩余3条评论

48

有更高版本的解决方案与此相同。

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

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


4
值得注意的是,如果您正在编辑 id 文件,则必须将其保留为单行。由于某种原因它不喜欢行末换行符(我的文本编辑器默认添加它,所以我遇到了问题)。 - Dan2552
我遇到了一个问题,因为我重命名了它所在的文件夹。Vagrant 坚持要创建一个与文件夹同名的新 VM,而不是使用现有的 VM。我通过创建一个 1.0 格式的 .vagrant 文件来解决这个问题,并自动升级它。一旦我这样做了,它实际上将旧的 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\<machine-name>\<machine-name>.vbox"/>。 - arntg

15
今天遇到了一个问题,我的 .vagrant 文件夹不见了,发现需要比简单地设置id多几个步骤:
  1. Set the id:

    VBoxManage list vms
    

    Find the id and set in {project-folder}/.vagrant/machines/default/virtualbox/id.

    Note that default may be different if set in your Vagrantfile e.g. config.vm.define "someothername".

  2. Stop the machine from provisioning:

    Create a file named action_provision in the same dir as the id file, set it's contents to: 1.5:{id} replacing {id} with the id found in step 1.

  3. Setup a new public/private key:

    Vagrant uses a private key stored in .vagrant/machines/default/virtualbox/private_key to ssh into the machine. You'll need to generate a new one.

    ssh-keygen -t rsa
    

    name it private_key.

    vagrant ssh then copy the private_key.pub into /home/vagrant/.ssh/authorized_keys.


“authorized_keys” 是一个文件还是目录? - user2568374
这是一个文件,如果你搜索它,你会找到很多东西,这是一个标准的SSH事情。 - Petecoop
因为我使用了相同的键,所以我不必执行最后一步(第三步)。否则,解释得非常好,一切都完美。 - Dazag
如何在Win10上执行第三步? - navono

9

今天使用Vagrant 1.7.4遇到同样的问题:

例如,将'vip-quickstart_default_1431365185830_12124'这个box与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

6
对于多虚拟机设置,它会像这样:
{
   "active":{
        "web":"a1fc9ae4-5d43-49cb-be31-ab3c4f74745d",
        "db":"13503bc5-76b8-4c26-95c4-32435b372212"
   }
}

您可以从用于创建这些虚拟机的Vagrantfile中获取虚拟机名称。请查找以下行:
config.vm.define :web do |web_config|

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

而且 db 是一个默认的虚拟机吗? - Robert
1
我认为这里没有默认值,只有Web和DB。根据Vagrantfile的设置,会有一个虚拟机先被构建。 - agwntr

6

这是从@Petecoop的答案修改而来。

如果您还没有关闭虚拟机,请运行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!

你应该已经准备好了。

5
我正在使用OSX El Capitan操作系统下的Vagrant 1.8.1
我的虚拟机在计算机重启时未正确关闭,因此当我尝试vagrant up命令时,它总是创建新的虚拟机。这里的所有解决方案都对我无效。但是真正起作用的是ingmmurillo的答案的变体。
所以,我不是基于运行VBoxManage list vms的ID创建.vagrant/machines/default/virtualbox/id,而是必须更新.vagrant/machines/local/virtual_box/id中的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开始的那个。

3
在Vagrant 1.9.1中:
我有一个在Virtual Box中命名为“Ubuntu 16.04.1”的VM,因此我使用以下命令将其打包为vagrant box:
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

对我来说删除

cd yourVagrantProject/.vagrant/machines/default/virtualbox/
rm id

工作了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接