如何将 Vagrant 项目目录与现有 VirtualBox 虚拟机关联?
-
12-11-2019 - |
题
不知何故,我的 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还多了几个步骤:
设置id:
VBoxManage list vms
找到id并设置
{project-folder}/.vagrant/machines/default/virtualbox/id
.注意
default
如果在您的设置中可能会有所不同Vagrantfile
例如config.vm.define "someothername"
.停止机器配置:
创建一个名为
action_provision
在同一目录中id
文件,将其内容设置为:1.5:{id}
替换{id}
使用步骤 1 中找到的 ID。设置新的公钥/私钥:
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 更新了同样的问题:
- 有用的线程在 https://github.com/mitchellh/vagrant/issues/1755特别是使用以下命令:
例如,将框“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.1 在 OSX 埃尔卡皮坦
当我的计算机重新启动时,我的虚拟机没有正确关闭,所以当我尝试时 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