Bento
Bento是一个封装了Packer模板的项目,用于构建Vagrant基础镜像。部分模板会被构建并发布到Vagrant Cloud上的bento组织。这些已发布的镜像作为kitchen-vagrant的默认镜像。
*注意:
- 需要Vagrant 2.4.0+版本以支持新的CPU架构
- 要使用
bento test
命令,需要安装test-kitchen和kitchen-vagrant gem - Virtualbox 6.x需要禁用允许vbox 7.x客户机连接到主机的nat配置。要使用,请注释掉bento/packer_templates/pkr-variables.pkr.hcl文件中的第161和162行,或在os_pkrvars文件中添加变量
vboxmanage = []
- 运行packer build命令时,输出目录是相对于当前工作目录的。建议从bento根目录运行packer build命令,这样构建文件默认会放在bento/builds/(build_name)目录中。如果没有覆盖output_directory变量,将在当前工作目录下创建builds/(build_name)目录
使用公共镜像
向Vagrant添加bento镜像
vagrant box add bento/ubuntu-18.04
在Vagrantfile中使用bento镜像
Vagrant.configure("2") do |config|
config.vm.box = "bento/ubuntu-18.04"
end
安装Bento
- 安装Ruby环境
- 克隆仓库
- cd <path/to>/bento
- gem build bento.gemspec
- gem install bento-*.gem
构建镜像
要求
- Packer >= 1.7.0
- Vagrant >= 2.4.0
- 至少一个以下虚拟化提供商:
- VirtualBox*2
- VMware Fusion*2
- VMware Workstation*2
- Parallels Desktop Pro 对于19.x以下版本还需要Parallels Virtualization SDK
- qemu *1 *2
- Hyper-V *1 *2
*1 注意: 这些提供商的支持被认为是实验性的,相应的Vagrant Cloud镜像可能存在也可能不存在。
*2 注意: AARCH64或ARM64支持仍在进行中,目前只能通过parallels和vmware提供商保证。
使用bento
可执行文件
build
要使用bento工具和os_pkrvars
目录中的模板构建Debian vagrant镜像,可以使用以下命令:
bento build --cpus 2 os_pkrvars/debian/debian-12-x86_64.pkrvars.hcl
其他可用选项:
- cpus - 指定新构建所需的CPU数量
- mem - 指定内存
- config - 使用默认builds.yml以外的配置文件
- vars - 逗号分隔的变量名=值列表(例如:boot_wait="2s",ssh_timeout="5s")
- var_files - 逗号分隔的要包含在构建中的pkrvar.hcl文件列表(例如:/path/to/var_file.pkrvars.hcl,/path/to/next/var_file2.pkrvars.hcl)
- metadata_only - 仅生成元数据json文件
- mirror - 模板会有默认的镜像链接,如果想使用其他链接,可以使用这个配置
- dry-run - 不会创建任何构建,但会创建一个参考用的元数据文件
- only - 仅构建某些Packer构建(默认:parallels-iso.vm,virtualbox-iso.vm,vmware-iso.vm)
- except - 构建除这些之外的所有Packer构建(例如:parallels-iso.vm,virtualbox-iso.vm,vmware-iso.vm)
- debug - 打印调试日志
- gui - Packer将通过启动显示正在构建的机器控制台的GUI来构建VirtualBox虚拟机。此选项默认为false
- single - 可用于禁用并行构建
list
用于列出工作站CPU架构可用的所有构建。这个列表也会通过build.yml文件的do_not_build部分进行过滤。所有条目都通过正则表达式匹配来从列表中过滤掉构建模板。
这只显示bento build
没有指定模板时会构建的内容。如果指定了任何模板,即使它在build.yml中被过滤,也会覆盖过滤器。
bento list
test
如果你已成功使用bento工具构建了vagrant镜像,在builds
文件夹中应该有vagrant镜像和元数据文件。你可以使用这些文件和test-kitchen配置来测试构建。运行以下命令来测试构建:
bento test
upload
要将builds目录中的镜像上传到你的vagrant cloud账户,请更新build.yml文件以指定你的账户名和哪些操作系统将公开。
确保你已配置vagrant cli并登录到你的账户,以便上传命令能够工作。
bento upload
运行bento upload
时,它会读取每个<box_name>._metadata.json文件,并使用提供的数据生成vagrant cloud publish
命令,其中描述、版本、提供商和校验和都来自<box_name>._metadata.json文件。
使用packer
仅为VirtualBox提供商构建Ubuntu 22.04镜像
cd <path/to>/bento
packer init -upgrade ./packer_templates
packer build -only=virtualbox-iso.vm -var-file=os_pkrvars/ubuntu/ubuntu-22.04-x86_64.pkrvars.hcl ./packer_templates
为所有可能的提供商同时构建最新的Debian 12镜像
cd <path/to>/bento
packer init -upgrade ./packer_templates
packer build -var-file=os_pkrvars/debian/debian-12-x86_64.pkrvars.hcl ./packer_templates
为除VMware和Parallels外的所有提供商构建最新的CentOS 7镜像
cd <path/to>/bento
packer init -upgrade ./packer_templates
packer build -except=parallels-iso.vm,vmware-iso.vm -var-file=os_pkrvars/centos/centos-7-x86_64.pkrvars.hcl ./packer_templates
使用其他URL
cd <path/to>/bento
packer init -upgrade ./packer_templates
packer build -var 'iso_url=https://mirrors.rit.edu/fedora/fedora/linux/releases/39/Server/x86_64/iso/Fedora-Server-dvd-x86_64-39-1.5.iso' -var-file=os_pkrvars/fedora/fedora-39-x86_64.pkrvars.hcl ./packer_templates
如果构建成功,你的镜像文件将位于仓库根目录的builds
目录中。
Windows的KVM/qemu支持
你必须下载包含用于半虚拟化KVM/qemu硬件的Windows驱动程序的ISO镜像并将其放在builds/iso/目录中。
你可以使用命令行执行此操作: mkdir -p builds/iso/; wget -nv -nc https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/stable-virtio/virtio-win.iso -O builds/iso/virtio-win.iso
你可以使用以下示例命令来构建KVM/qemu Windows镜像:
packer init -upgrade ./packer_templates
packer build --only=qemu.vm -var-file=os_pkrvars/windows/windows-2022-x86_64.pkrvars.hcl ./packer_templates
专有模板
仓库中还提供了仅通过许可或订阅获得的操作系统模板,这些包括但不限于:Red Hat Enterprise Linux和SUSE Linux Enterprise。由于ISO不是公开可用的,因此需要适当地覆盖URL值。我们依赖于那些能够访问这些操作系统许可版本的人的努力来保持这些模板的更新。
网络/防火墙
大多数提供商都期望能不受限制地访问网络以按预期进行构建。我们无法列举所有可能的防火墙配置,但在下面包含了一些可能对用户有用的代码片段。
Windows
$VS = "Standardswitch"
$IF_ALIAS = (Get-NetAdapter -Name "vEthernet ($VS)").ifAlias
New-NetFirewallRule -Displayname "Allow incomming from $VS" -Direction Inbound -InterfaceAlias $IF_ALIAS -Action Allow
Hyper-V第二代虚拟机
Hyper-V第二代虚拟机不支持软盘驱动器。如果你之前通过软盘驱动器提供资源,必须将这些文件添加到第二代ISO镜像中,特别是:
autounattend.xml
:第二代autounattend.xml
文件支持 EFI 分区。请根据您的系统更新autounattend.xml
中的 Windows 版本,并确保分区设置适合您的情况。您还需要管理包含 Hyper-V 访客服务驱动程序的驱动器磁盘,并相应地调整autounattend.xml
文件。
错误和问题
请使用 GitHub issues 报告错误、功能或其他问题。
相关项目
非常感谢以下相关项目,我们从中获得了灵感,并经常将其作为解决基础镜像构建复杂问题的解决方案来源。
- https://github.com/boxcutter
- https://github.com/lavabit/robox
- https://github.com/mcandre/packer-templates
- https://github.com/timsutton/osx-vm-templates
- https://github.com/ferventcoder/vagrant-windows-puppet/tree/master/baseboxes
许可证和作者
这些基础镜像模板最初是从 veewee 定义转换而来,基于 Tim Dysinger 的工作,旨在创建"不重复自己"(DRY)的模块化基础镜像。感谢 Tim!
- 作者:Chris McClimans (chris@hippiehacker.org)
- 作者:Fletcher Nichol (fnichol@nichol.ca)
- 作者:Joshua Timberman (joshua@chef.io)
- 作者:Julian Dunn (jdunn@chef.io)
- 作者:Ross Timson (ross@rosstimson.com)
- 作者:Seth Chisamore (schisamo@chef.io)
- 作者:Stephen Delano (stephen@chef.io)
- 作者:Tim Dysinger (tim@dysinger.net)
- 作者:Tim Smith (tsmith@chef.io)
- 作者:Tom Duffield (tom@chef.io)
- 作者:Corey Hemminger (corey.hemminger@progress.com)
版权所有 2012-2024,Progress Software, Inc. (legal@chef.io)
版权所有 2011-2012,Tim Dysinger (tim@dysinger.net)
根据 Apache 许可证 2.0 版("许可证")授权;
除非遵守许可证,否则您不得使用此文件。
您可以在以下位置获得许可证副本:
http://www.apache.org/licenses/LICENSE-2.0
除非适用法律要求或书面同意,否则根据许可证分发的软件是基于
"按原样"分发的,不附带任何明示或暗示的担保或条件。
有关许可证下的特定语言管理权限和限制,请参阅许可证。