You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 07:55:36