不知何故,我的 Vagrant 项目已与其 VirtualBox VM 解除关联,因此当我 vagrant up Vagrant 将导入基础盒子并创建一个新的虚拟机。

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

有帮助吗?

解决方案

警告: 下面的解决方案适用于 Vagrant 1.0.x,但是 不是 流浪者 1.1+。

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

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

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

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

跑步 vagrant status 以确保 Vagrant 接受正确的更改。

笔记: 这不受 Vagrant 官方支持,Vagrant 可能会改变格式 .vagrant 随时。但这从 Vagrant 0.9.7 开始有效,并且对于 Vagrant 1.0 也有效。

其他提示

为了 流浪者1.6.3 请执行下列操作:

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

VBoxManage list vms

你会得到这样的东西:

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

2)进入以下路径:

cd .vagrant/machines/default/virtualbox

3)创建一个名为 ID 使用您的 VM 的 ID xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx

4)保存文件并运行 流浪向上

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

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

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

今天遇到这个问题,我的 .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.

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

例如,将框“vip-quickstart_default_1431365185830_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

对于多虚拟机设置,它看起来像这样:

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

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

config.vm.define :web do |web_config|

在本例中,“web”是虚拟机的名称。

我在用着 流浪者1.8.1OSX 埃尔卡皮坦

当我的计算机重新启动时,我的虚拟机没有正确关闭,所以当我尝试时 vagrant up 它总是在创建新的虚拟机。这里没有任何解决方案对我有用。但有效的是 英格穆里洛的回答

所以而不是创建 .vagrant/machines/default/virtualbox/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

在 Vagrant 1.9.1 中:

我在 Virtual Box 中有一个名为“Ubuntu 16.04.1”的虚拟机,因此我将其打包为一个 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

这是修改自 @Petecoop 的回答.

跑步 vagrant halt 如果您还没有关闭盒子。

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

它将列出您的所有虚拟盒。确定要恢复到的框并获取大括号之间的 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!

你应该已经准备好了。

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

因为某些原因

vagrant halt

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

只剩下 1 个小问题了,它启动到 grub 中,所以我必须按一次 Enter 键,不知道这是否会留下来,但我很快就会发现。

我正在运行 vagrant 1.7.4 和 virtualbox 5.0.2

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top