如何将Vagrant项目目录与现有VirtualBox VM关联?

jrd*_*cgr 130 virtualbox vagrant

不知怎的,我的Vagrant项目已经解除了与VirtualBox虚拟机的关联,所以当我vagrant upVagrant将导入基础框并创建一个新的虚拟机时.

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

小智 200

对于Vagrant 1.6.3,请执行以下操作:

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

VBoxManage list vms
Run Code Online (Sandbox Code Playgroud)

你会有这样的事情:

"virtualMachine" {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}
Run Code Online (Sandbox Code Playgroud)

2)转到以下路径:

cd .vagrant/machines/default/virtualbox
Run Code Online (Sandbox Code Playgroud)

3)创建一个名为id的文件,其ID为VM xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx

4)保存文件并运行vagrant

  • 创建没有*换行符的`id`文件*的好方法是`echo -n'<your id here>'> id`. (8认同)

Mit*_*ell 89

警告:以下解决方案适用于Vagrant 1.0.x但不适用于 Vagrant 1.1+.

Vagrant使用与"Vagrantfile"相同的目录中的".vagrant"文件来跟踪VM的UUID.如果VM不存在,则此文件不存在.该文件的格式是JSON.如果存在单个VM,它看起来像这样:

{
   "active":{
      "default":"02f8b71c-75c6-4f33-a161-0f46a0665ab6"
   }
}
Run Code Online (Sandbox Code Playgroud)

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

如果您的VM以某种方式变得不相关,那么您可以做的是VBoxManage list vms列出VirtualBox通过其名称和UUID知道的每个VM.然后.vagrant在与您相同的目录中手动创建文件Vagrantfile并正确填写内容.

运行vagrant status以确保Vagrant获得正确的更改.

注意:这不是Vagrant正式支持的,Vagrant可能随时更改格式.vagrant.但这与Vagrant 0.9.7一样有效,并且对Vagrant 1.0有效.

  • 对于Vagrant 1.1,UUID存储在特定于机器的文件中,位于`.vagrant/machines/{name}/{provider}/id`.实际上,该文件包含的唯一内容是UUID. (46认同)
  • 使用Vagrant 1.1+时,请确保不要在ID的末尾添加换行符.有关详细信息,请参阅https://github.com/mitchellh/vagrant/issues/1755 (4认同)
  • 我试过这个技巧,但流浪者的状态只是报告状态未创建.然后Vagrant创建一个新的vm并且工作正常.如果我更改了id文件,则报告为未创建,即使我将其更改回刚创建的框的uuid. (2认同)

Nat*_*tim 48

上层版本的解决方案完全相同.

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

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

  • 此外,值得注意的是,如果您正在编辑`id`文件,则必须将其保留为一行.由于某种原因,它不喜欢最后的换行符(我的文本编辑器默认添加它,所以我遇到了问题). (4认同)
  • 我不确定是什么导致我的vagrant/machines/default/virtualbox/id指向错误的VirtualBox机器ID的断开连接.帮助的文件是$ HOME/.VirtualBox/VirtualBox.xml.它有一个MachineRegistry部分,其中VirtualBox机器UUID映射到机器名称.例如<MachineEntry uuid ="{f232f951-103b-af28-9f8d-b2ab21bs258f}"src ="$ HOME/VirtualBox VMs\<machine-name>\<machine-name> .vbox"/> (2认同)

Pet*_*oop 13

如果今天有问题,我的.vagrant文件夹丢失了,发现除了简单设置id之外还有一些步骤:

  1. 设置ID:

    VBoxManage list vms
    
    Run Code Online (Sandbox Code Playgroud)

    找到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-keygen -t rsa
    
    Run Code Online (Sandbox Code Playgroud)

    说出来private_key.

    vagrant ssh然后复制private_key.pub/home/vagrant/.ssh/authorized_keys.


eto*_*ceb 9

今天用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
Run Code Online (Sandbox Code Playgroud)


agw*_*ntr 6

对于多VM设置,它看起来像这样:

{
   "active":{
        "web":"a1fc9ae4-5d43-49cb-be31-ab3c4f74745d",
        "db":"13503bc5-76b8-4c26-95c4-32435b372212"
   }
}
Run Code Online (Sandbox Code Playgroud)

您可以从用于创建这些VM的Vagrantfile中获取vm名称.寻找这一行:

config.vm.define :web do |web_config|
Run Code Online (Sandbox Code Playgroud)

"web"是这种情况下vm的名称.


小智 6

这是根据@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!
Run Code Online (Sandbox Code Playgroud)

你应该已经准备好了。


Bre*_*dan 5

我在OSX El Capitan上使用Vagrant 1.8.1

当我的计算机重新启动时,我的虚拟机没有正确关闭,所以当我尝试vagrant up它时总是创建新的虚拟机.这里没有解决方案适合我.但是,工作是ingmmurillo的答案的变化

因此,而不是.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