【问题标题】:Creating Azure VM from custom image从自定义映像创建 Azure VM
【发布时间】:2017-05-07 11:00:06
【问题描述】:

我有一个存储在 Azure 中的映像,我想从中启动多个 VM。我创建了一个模板,它将为我创建必要的资源,并且除了创建 VM 之外,所有资源都成功了。

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

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

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

如果 VM 是从平台或用户映像创建的,则无法附加现有的 OS 磁盘。

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

  1. 指向主图像
  2. 为主副本提供所需的目标
  3. 将主映像复制到目标位置
  4. 创建虚拟机
  5. 将副本附加到 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'))]"
        }
      ]
    }
  }
}

【问题讨论】:

  • 你检查你的图像是否经过系统准备?
  • +1 给 Fred Han。 Windows 映像需要进行系统准备,Linux 映像需要取消配置才能正确启动。
  • 为了记录,即使我的形象被概括,这也发生在我身上。我正在从上传的 VHD 创建映像,然后尝试从中创建 VM。看来我需要按原样附加通用 VHD 或将其上传到空的托管磁盘中。

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


【解决方案1】:

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

如果您使用未经过 sysprep 的映像创建 VM,可能会导致错误,因此请确保您的映像已经过 sysprep。

如果 VM 是从平台或用户映像创建的,则无法附加现有的 OS 磁盘。

当你指定 CreateOption 来附加(它将从一个专用磁盘创建一个虚拟机)时,不要指定 SourceImageUri 参数。更多信息请查看this documentation的“-CreateOption”。

【讨论】:

  • 如果我的图像没有经过系统准备,我该怎么办?
  • 文档链接失效了
【解决方案2】:

正如 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-11
    • 2016-01-21
    • 2015-12-07
    相关资源
    最近更新 更多