我的Vagrant项目不知何故与其VirtualBox VM脱离了联系,这样当我运行vagrant up
时,Vagrant会导入基础盒并创建一个新的虚拟机。
有没有办法重新将Vagrant项目与现有的VM关联起来? Vagrant如何在内部将Vagrantfile与VirtualBox VM目录关联?
我的Vagrant项目不知何故与其VirtualBox VM脱离了联系,这样当我运行vagrant up
时,Vagrant会导入基础盒并创建一个新的虚拟机。
有没有办法重新将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 xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
4) 保存文件并运行vagrant up
警告:以下解决方案适用于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 版本。
.vagrant/machines/{name}/{provider}/id
。实际上,该文件唯一包含的就是 UUID。 - user879121有更高版本的解决方案与此相同。
但是首先您需要手动启动.vbox文件,以便它出现在VBoxManage list vms
中。
然后您可以检查.vagrant/machines/default/virtualbox/id
,以确保uuid是正确的。
id
文件,则必须将其保留为单行。由于某种原因它不喜欢行末换行符(我的文本编辑器默认添加它,所以我遇到了问题)。 - Dan2552.vagrant
文件来解决这个问题,并自动升级它。一旦我这样做了,它实际上将旧的 VM 重命名为新的项目目录名称。 - Jonah.vagrant
文件夹不见了,发现需要比简单地设置id多几个步骤:
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"
.
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.
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
.
今天使用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
{
"active":{
"web":"a1fc9ae4-5d43-49cb-be31-ab3c4f74745d",
"db":"13503bc5-76b8-4c26-95c4-32435b372212"
}
}
config.vm.define :web do |web_config|
这是从@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!
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
开始的那个。vagrant package --base "Ubuntu 16.04.1"
响应...
==> Ubuntu 16.04.1: Exporting VM...
==> Ubuntu 16.04.1: Compressing package to: blah blah/package.box
对我来说删除
cd yourVagrantProject/.vagrant/machines/default/virtualbox/
rm id
工作了。
id
文件而不换行的好方法是使用命令echo -n '<你的ID>' > id
。 - Xiong Chiamiovtest1 和 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