我已经创建了一个用于Hyper-V提供程序的新盒子。当我尝试添加该框时,它会死于以下内容:
PS C:\> vagrant box add sbx-misc-app01 .\img-misc-w2k16.box
==> box: Box file was not detected as metadata. Adding it directly...
==> box: Adding box 'sbx-misc-app01' (v0) for provider:
box: Unpacking necessary files from: file://C:/img-misc-w2k16.box
box:
C:/HashiCorp/Vagrant/embedded/gems/2.0.3/gems/vagrant-2.0.3/lib/vagrant/box_collection.rb:156:in `block (3 levels) in add': undefined method `to_sym' for nil:NilClass (NoMethodError)
from C:/HashiCorp/Vagrant/embedded/gems/2.0.3/gems/vagrant-2.0.3/lib/vagrant/box_collection.rb:461:in `with_temp_dir'
from C:/HashiCorp/Vagrant/embedded/gems/2.0.3/gems/vagrant-2.0.3/lib/vagrant/box_collection.rb:134:in `block (2 levels) in add'
from C:/HashiCorp/Vagrant/embedded/gems/2.0.3/gems/vagrant-2.0.3/lib/vagrant/box_collection.rb:461:in `with_temp_dir'
from C:/HashiCorp/Vagrant/embedded/gems/2.0.3/gems/vagrant-2.0.3/lib/vagrant/box_collection.rb:115:in `block inadd' from C:/HashiCorp/Vagrant/embedded/gems/2.0.3/gems/vagrant-2.0.3/lib/vagrant/box_collection.rb:448:in `block in with_collection_lock'
from C:/HashiCorp/Vagrant/embedded/mingw64/lib/ruby/2.4.0/monitor.rb:214:in `mon_synchronize'
from C:/HashiCorp/Vagrant/embedded/gems/2.0.3/gems/vagrant-2.0.3/lib/vagrant/box_collection.rb:447:in `with_collection_lock'
from C:/HashiCorp/Vagrant/embedded/gems/2.0.3/gems/vagrant-2.0.3/lib/vagrant/box_collection.rb:104:in `add'
from C:/HashiCorp/Vagrant/embedded/gems/2.0.3/gems/vagrant-2.0.3/lib/vagrant/action/builtin/box_add.rb:357:in `box_add'
from C:/HashiCorp/Vagrant/embedded/gems/2.0.3/gems/vagrant-2.0.3/lib/vagrant/action/builtin/box_add.rb:146:in `add_direct'
from C:/HashiCorp/Vagrant/embedded/gems/2.0.3/gems/vagrant-2.0.3/lib/vagrant/action/builtin/box_add.rb:120:in `call'
from C:/HashiCorp/Vagrant/embedded/gems/2.0.3/gems/vagrant-2.0.3/lib/vagrant/action/warden.rb:34:in `call'
from C:/HashiCorp/Vagrant/embedded/gems/2.0.3/gems/vagrant-2.0.3/lib/vagrant/action/builder.rb:116:in `call'
from C:/HashiCorp/Vagrant/embedded/gems/2.0.3/gems/vagrant-2.0.3/lib/vagrant/action/runner.rb:66:in `block in run'
from C:/HashiCorp/Vagrant/embedded/gems/2.0.3/gems/vagrant-2.0.3/lib/vagrant/util/busy.rb:19:in `busy'
from C:/HashiCorp/Vagrant/embedded/gems/2.0.3/gems/vagrant-2.0.3/lib/vagrant/action/runner.rb:66:in `run'
from C:/HashiCorp/Vagrant/embedded/gems/2.0.3/gems/vagrant-2.0.3/plugins/commands/box/command/add.rb:78:in `execute'
from C:/HashiCorp/Vagrant/embedded/gems/2.0.3/gems/vagrant-2.0.3/plugins/commands/box/command/root.rb:66:in `execute'
from C:/HashiCorp/Vagrant/embedded/gems/2.0.3/gems/vagrant-2.0.3/lib/vagrant/cli.rb:46:in `execute'
from C:/HashiCorp/Vagrant/embedded/gems/2.0.3/gems/vagrant-2.0.3/lib/vagrant/environment.rb:269:in `cli'
from C:/HashiCorp/Vagrant/embedded/gems/2.0.3/gems/vagrant-2.0.3/bin/vagrant:151:in `<main>'
问题:
...环境
盒子的内容......
C:\ img-misc-w2k16 \虚拟硬盘
C:\ img-misc-w2k16 \虚拟机
C:\ IMG-MISC-w2k16 \ metadata.json
C:\ img-misc-w2k16 \虚拟硬盘\ img-misc-w2k16.vhdx
C:\ img-misc-w2k16 \虚拟机\ AB56D8F5-4F71-4CCD-97E6-237713B79FD8 ....
C:\ img-misc-w2k16 \ Virtual Machines \ AB56D8F5-4F71-4CCD-97E6-237713B79FD8 ....
metadata.json的内容......
{
"name": "foo/windowsServer2016x64",
"description": "This box contains Windows Server 2016 64-bit standard edition.",
"versions": [
{
"version": "1.0.0",
"providers": [
{
"name": "hyperv"
}
]
}
]
}
答案 0 :(得分:3)
似乎对盒子的不同方面存在一些混淆。
所以从https://www.vagrantup.com/docs/boxes/format.html
开始Box文件 - 这是一个压缩的(tar,tar.gz,zip)文件 特定于单个提供者并且可以包含任何内容。流浪汉核心 不会使用此文件的内容。相反,他们通过了 给提供者。因此,VirtualBox框文件有所不同 来自VMware盒子文件的内容等等。
Box Catalog Metadata - 这是一个JSON文档(通常是交换的 在与HashiCorp的Vagrant Cloud交互时,指定了 盒子的名称,描述,可用的版本,可用 提供者,以及每个提供者的实际盒子文件(下一个组件)的URL 提供者和版本。如果此目录元数据不存在,则为一个框 文件仍可以直接添加,但不支持版本控制 和更新。
文件C:\img-misc-w2k16\metadata.json
是盒子文件的一部分 - 它与盒子目录元数据(如果你想分发你的盒子时使用)不同,但你共享的内容是盒子目录元数据。
进一步阅读
在存档中,Vagrant确实需要一个文件:metadata.json。 这是一个与上面的框完全无关的JSON文件 目录元数据组件; 每个框只有一个metadata.json 文件(在盒子文件中),而一个目录元数据JSON文件 可以描述同一个框的多个版本,可能跨越 多个提供商。
metadata.json必须至少包含“provider”键 提供框是为了。 Vagrant使用它来验证提供者 盒子。例如,如果你的盒子是针对VirtualBox的,那么 metadata.json看起来像这样:
{ "provider": "virtualbox" }
如果没有metadata.json文件或 该文件不包含至少具有“提供者”密钥的有效JSON, 然后Vagrant在添加框时会出错,因为它无法验证 提供者。
所以当你打包你的盒子时,metadata.json的内容应该是
{
"provider": "hyperv"
}
替换文件内容后,您可以重新打包该框,并且您应该能够从此框中运行VM。