从自定义映像创建Azure VM

时间:2016-12-21 22:00:45

标签: .net azure virtual-machine azure-storage azure-resource-manager

我有一个存储在Azure中的图像,我希望从中提取多个虚拟机。我创建了一个模板,它将为我创建必要的资源,除了创建VM之外,所有这些资源都成功。

使用CreateOption.FromImage运行部署大约40分钟,直到我收到错误:

  

'VM'vmName'的操作系统配置未在指定的时间内完成。但是,检测到VM guest虚拟机代理正在运行。这表明客户操作系统尚未准备好用作VM映像(使用CreateOption = FromImage)。要解决此问题,请按原样使用VHD与CreateOption = Attach或正确准备以用作图像

CreateOption.FromImage更改为CreateOption.Attach会立即给出以下错误:

  

如果从平台或用户映像创建VM,则无法附加现有操作系统磁盘。

我想通过模板实现的目标:

  1. 指向主图像
  2. 为主副本提供所需的目的地
  3. 将主图像复制到目的地
  4. 创建VM
  5. 将副本附加到VM
  6. 以下是我用于部署的模板的VM部分:

    {
      "apiVersion": "2015-06-15",
      "type": "Microsoft.Compute/virtualMachines",
      "name": "[parameters('vmName')]",
      "location": "[resourceGroup().location]",
      "tags": {
        "displayName": "VirtualMachine"
      },
      "dependsOn": [
        "[concat('Microsoft.Network/networkInterfaces/', parameters('nicName'))]"
      ],
      "properties": {
        "osProfile": {
          "computerName": "[parameters('vmName')]",
          "adminUsername": "[parameters('adminUsername')]",
          "adminPassword": "[parameters('adminPassword')]"
        },
        "hardwareProfile": {
          "vmSize": "[variables('vmSize')]"
        },
        "storageProfile": {
          "osDisk": {
            "name": "[parameters('OSDiskName')]",
            "osType": "windows",
            "caching": "ReadWrite",
            "createOption": "FromImage",
            "image": {
              "uri": "[concat('https://', parameters('storageAccountName'), '.blob.core.windows.net/', parameters('sourceStorageContainerName'), '/', parameters('sourceVHDName'), '.vhd')]"
            },
            "vhd": {
              "uri": "[concat('https://', parameters('storageAccountName'), '.blob.core.windows.net/', parameters('vhdStorageContainerName'), '/', parameters('OSDiskName'), '.vhd')]"
            }
          }
        },
        "networkProfile": {
          "networkInterfaces": [
            {
              "id": "[resourceId('Microsoft.Network/networkInterfaces', parameters('nicName'))]"
            }
          ]
        }
      }
    }
    

2 个答案:

答案 0 :(得分:2)

  

'VM'vmName'的操作系统配置未在指定的时间内完成。但是,检测到VM guest虚拟机代理正在运行。这表明客户操作系统尚未准备好用作VM映像(使用CreateOption = FromImage)。要解决此问题,请按原样使用VHD与CreateOption = Attach或正确准备以用作图像

如果您使用的是未编译的图像来创建VM,则可能会导致错误,因此请确保您的图像是sysprepped。

enter image description here

  

如果从平台或用户映像创建VM,则无法附加现有操作系统磁盘。

如果指定CreateOption to Attach(它将从专用磁盘创建虚拟机),请不要指定SourceImageUri参数。有关详细信息,请查看this documentation中的“-CreateOption”。

答案 1 :(得分:0)

正如 Fei Han 所说,您的机器看起来不是通用的(VM 的通用化通过创建通用映像来准备它,这意味着它会删除特定于实例的数据(路径、注册表项等)。

为了概括机器,您可以在其上运行此脚本(警告!这将使您无法再使用此虚拟机)

if( Test-Path $Env:SystemRoot\\System32\\Sysprep\\unattend.xml ){ 
    rm $Env:SystemRoot\\System32\\Sysprep\\unattend.xml -Force
}

& $env:SystemRoot\\System32\\Sysprep\\Sysprep.exe /oobe /generalize /quiet /quit

while($true) { 
    $imageState = Get-ItemProperty HKLM:\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Setup\\State | Select ImageState; 

    if($imageState.ImageState -ne 'IMAGE_STATE_GENERALIZE_RESEAL_TO_OOBE') { 
        Write-Output $imageState.ImageState; Start-Sleep -s 10  
    } else {
        break
    }
}

但是,我尝试从 Azure 门户中的此类 VM(已反序列化)创建 Azure 映像,但遇到了同样的错误。这就是为什么,我明确地将它传递给命令以将我的 VM 视为通用的:

$rgName = "rg-my-images"
$location = "Your Region"
$imageName = "vmimg-name-of-your-image"
$osVhdUri = "https://xxxxx.blob.core.windows.net/system/Microsoft.Compute/Images/images/packer-osDisk.[ID of your image].vhd"


$imageConfig = New-AzImageConfig -Location $location
$imageConfig = Set-AzImageOsDisk -Image $imageConfig -OsType Windows -OsState Generalized -BlobUri $osVhdUri
$image = New-AzImage -ImageName $imageName -ResourceGroupName $rgName -Image $imageConfig