Answers:
警告:以下解决方案适用于Vagrant 1.0.x,但不适用于 Vagrant 1.1+。
Vagrant使用与“ Vagrantfile”相同目录中的“ .vagrant”文件来跟踪VM的UUID。如果虚拟机不存在,则此文件将不存在。该文件的格式为JSON。如果存在单个VM,则如下所示:
{
"active":{
"default":"02f8b71c-75c6-4f33-a161-0f46a0665ab6"
}
}
default
是默认虚拟机的名称(如果您未使用多VM设置)。
如果您的VM失去联系,您可以做的是执行操作VBoxManage list vms
,该操作将按VirtualBox的名称和UUID列出每个VirtualBox知道的VM。然后.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的文件,其ID为您的VM的xxxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
4)保存文件并运行流浪汉
id
文件的好方法是。echo -n '<your id here>' > id
for box in test1 test2; do virtualboxid=$(VBoxManage list vms | grep $box | cut -d' ' -f2); echo -n $virtualboxid > .vagrant/machines/$box/virtualbox/id; done
高版本的解决方案是完全相同的。
但是首先您需要手动启动.vbox文件,以便它出现在 VBoxManage list vms
然后,您可以检查.vagrant/machines/default/virtualbox/id
来检查uuid是否正确。
id
文件,则必须将其保持在一行中。由于某种原因,它不喜欢换行符结尾(我的文本编辑器默认情况下添加了换行符,所以我遇到了问题)。
.vagrant
1.0格式的文件来修复它,并自动对其进行了升级。我这样做后,实际上将旧VM重命名为新项目目录名称。
今天遇到了这个问题,我的.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更新相同的问题:
例如,将框“ vip-quickstart_default_1431365185830_12124”与流浪者配对。
$ 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
它总是在创建新的虚拟机。这里没有解决方案对我有用。但是有效的是英格米里洛答案的变化
因此,与其.vagrant/machines/default/virtualbox/id
根据运行的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
这是从@Petecoop的答案中修改的。
运行vagrant halt
如果你还没有关闭箱呢。
然后列出您的虚拟箱: VBoxManage list vms
它将列出您的所有virtualbox。确定您要还原的框并抓住大括号之间的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!
你应该准备好了。