不知何故,我的 Vagrant 项目与它的 VirtualBox VM 脱离了关联,因此当我vagrant up
Vagrant 将导入 base-box 并创建一个新的虚拟机时。
有没有办法将 Vagrant 项目与现有 VM 重新关联?Vagrant 如何在内部将 Vagrantfile 与 VirtualBox VM 目录关联?
不知何故,我的 Vagrant 项目与它的 VirtualBox VM 脱离了关联,因此当我vagrant up
Vagrant 将导入 base-box 并创建一个新的虚拟机时。
有没有办法将 Vagrant 项目与现有 VM 重新关联?Vagrant 如何在内部将 Vagrantfile 与 VirtualBox VM 目录关联?
对于Vagrant 1.6.3,请执行以下操作:
1) 在你的 Vagrantfile 所在目录中,运行命令
VBoxManage list vms
你会有这样的东西:
"virtualMachine" {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}
2)转到以下路径:
cd .vagrant/machines/default/virtualbox
3) 创建一个名为id的文件,其 ID 为您的 VM xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
4) 保存文件并运行vagrant up
警告:以下解决方案适用于 Vagrant 1.0.x,但不适用于Vagrant 1.1+。
Vagrant 使用与“Vagrantfile”相同目录中的“.vagrant”文件来跟踪 VM 的 UUID。如果 VM 不存在,则该文件将不存在。文件格式为 JSON。如果存在单个 VM,它看起来像这样:
{
"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 有效。
与上版本的解决方案是完全一样的。
但首先您需要手动启动 .vbox 文件,以便它出现在VBoxManage list vms
然后您可以检查.vagrant/machines/default/virtualbox/id
以检查 uuid 是否正确。
今天遇到问题,我的.vagrant
文件夹不见了,发现除了简单的设置id还有几个步骤:
设置标识:
VBoxManage list vms
找到 id 并设置在{project-folder}/.vagrant/machines/default/virtualbox/id
.
请注意,default
如果在您的Vagrantfile
eg中设置可能会有所不同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 更新同样的问题:
例如,将框“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
对于多 VM 设置,它看起来像这样:
{
"active":{
"web":"a1fc9ae4-5d43-49cb-be31-ab3c4f74745d",
"db":"13503bc5-76b8-4c26-95c4-32435b372212"
}
}
您可以从用于创建这些虚拟机的 Vagrantfile 中获取虚拟机名称。寻找这一行:
config.vm.define :web do |web_config|
在这种情况下,“web”是虚拟机的名称。
我在OSX El Capitan上使用Vagrant 1.8.1
当我的计算机重新启动时,我的虚拟机没有正确关闭,所以当我尝试时vagrant up
它总是在创建新的虚拟机。这里没有解决方案对我有用。但是起作用的是ingmmurillo 的答案的变体
因此,不要.vagrant/machines/default/virtualbox/id
根据 running 的 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
这是从@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!
你应该准备好了。
在流浪者 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
我在 macos 上,发现删除盒子上的 .locks 解决了我的问题。
由于某些原因
vagrant halt
没有删除这些锁,并且在使用 timemachine 恢复我在 .vagrant/machine/default/virtualbox 中的所有设置后,删除了锁,正确的机器启动了。
只剩下 1 个小问题,它引导到 grub,所以我不得不按回车键一次,不知道这是否会留下来,但我很快就会发现。
我正在运行 vagrant 1.7.4 和 virtualbox 5.0.2
对我来说删除
cd yourVagrantProject/.vagrant/machines/default/virtualbox/
rm id
工作。