使用Packer构建的OVA在VCenter部署时陷入无限重启循环求助
问题描述
使用Packer从ISO文件构建OVA,在vCenter中部署该OVA时出现无限重启循环,但直接部署原ISO文件可正常运行。请求排查Packer代码是否存在缺失,并提供分析建议。
提供的Packer HCL代码
packer { required_plugins { vsphere = { version = "~> 1" source = "github.com/hashicorp/vsphere" } } } source "vsphere-iso" "vi-it-iotedge-kairos" { vcenter_server = var.vcenter_server username = var.vsphere_username password = var.vsphere_password insecure_connection = true vm_name = "${var.vm_name}-iotedge-kairos" cluster = var.vsphere_cluster resource_pool = var.vsphere_resource_pool datastore = var.vsphere_datastore folder = var.vsphere_folder vm_version = var.vm_hw_version guest_os_type = "ubuntu64Guest" boot_order = "disk,cdrom" communicator = "ssh" ssh_username = var.ssh_username ssh_password = var.ssh_password ssh_handshake_attempts = "100" ssh_timeout = "30m" CPUs = var.vm_numcpu RAM = var.vm_memory RAM_reserve_all = true network_adapters { network = "DPortGroup-Public" network_card = "vmxnet3" } dynamic "storage" { for_each = var.disks_hardened content { disk_size = storage.value disk_thin_provisioned = true } } disk_controller_type = ["pvscsi"] iso_url = var.iso_url iso_checksum = var.iso_checksum export { image_files = false output_directory = "/tmp/vm-export" } remove_cdrom = true } build { sources = [ "source.vsphere-iso.vi-it-iotedge-kairos" ] provisioner "shell" { inline = ["echo 'Completed template build'"] } post-processor "shell-local" { only = ["vsphere-iso.vi-it-iotedge-kairos"] inline = [ "pwsh -command \"& /workspace/source/buildscripts/ova/Update-OvfConfiguration.ps1 \\\"", " -OVFFile '/tmp/vm-export/${var.vm_name}-iotedge-kairos.ovf' \\\"", " -Role 'iotedge' \\\"", " -Parameter @{'vi.release.name'='${var.vm_releasename}';'vi.release.version'='${var.vm_releaseversion}';'disksize_2'='${var.disks_hardened[1]}'}\"", "pwsh -file /workspace/source/buildscripts/ova/Update-Manifest.ps1 \\\"", " -ManifestFileName '/tmp/vm-export/${var.vm_name}-iotedge-kairos.mf'", "ovftool --allowExtraConfig \\\"", " '/tmp/vm-export/${var.vm_name}-iotedge-kairos.ovf' \\\"", "/workspace/build/container/vm/vi_it_srv_lin_ubuntu-vmtemplate-${var.vm_releaseversion}-iotedge-kairos.ova" ] } }
分析与排查建议
- 检查自动安装配置完整性:代码中未配置
boot_command参数,若Ubuntu ISO需要自动应答(preseed)完成安装,Packer构建时可能未完成完整的OS初始化流程,导致系统引导文件或核心配置缺失。需确认是否通过ISO内置的自动应答或Packer的boot_command完成了OS的完整安装。 - 验证磁盘与挂载配置:
- 动态存储
var.disks_hardened若包含多磁盘,需确认OS是否正确识别所有磁盘,且/etc/fstab中无错误挂载项(比如引用了不存在的磁盘UUID),挂载失败会触发系统重启。 disk_controller_type设置为pvscsi,需确认Ubuntu系统已安装pvscsi驱动,直接ISO部署时可能自动加载驱动,但Packer构建后的镜像可能未固化驱动,导致启动时无法识别磁盘。
- 动态存储
- 清理CDROM源依赖:
remove_cdrom = true仅移除硬件设备,但系统中可能残留CDROM作为apt源的配置(/etc/apt/sources.list中的cdrom条目),启动时系统尝试访问已移除的CDROM会报错,需在provisioner中添加清理命令:sed -i '/cdrom/d' /etc/apt/sources.list。 - 排查OVF后处理脚本问题:post-processor中的PowerShell脚本修改了OVF配置,需确认:
disksize_2参数与实际磁盘大小匹配,避免vCenter部署时磁盘配置不兼容。- OVF的硬件版本(
vm_version)与目标vCenter版本兼容,过高的硬件版本可能导致启动异常。
- 确认系统初始化与SSH时机:虽然设置了
ssh_timeout = 30m,但系统可能在SSH可用时仍未完成全部初始化,可添加ssh_wait_timeout参数延长等待时间,或在boot_command中加入等待系统完全启动的步骤(比如等待特定日志输出)。 - 查看启动控制台日志:部署OVA时,在vCenter中打开虚拟机控制台,观察启动过程中的报错信息(如GRUB加载失败、initramfs提示磁盘错误),这是定位无限重启的最直接方式。
内容的提问来源于stack exchange,提问作者cz75ww
相关产品推荐
相关产品推荐

