我有一个存储在Azure中的图像,我希望从中提取多个虚拟机。我创建了一个模板,它将为我创建必要的资源,除了创建VM之外,所有这些资源都成功。
使用CreateOption.FromImage运行部署大约40分钟,直到我收到错误:
'VM'vmName'的操作系统配置未在指定的时间内完成。但是,检测到VM guest虚拟机代理正在运行。这表明客户操作系统尚未准备好用作VM映像(使用CreateOption = FromImage)。要解决此问题,请按原样使用VHD与CreateOption = Attach或正确准备以用作图像
将CreateOption.FromImage
更改为CreateOption.Attach
会立即给出以下错误:
如果从平台或用户映像创建VM,则无法附加现有操作系统磁盘。
我想通过模板实现的目标:
以下是我用于部署的模板的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'))]"
}
]
}
}
}
答案 0 :(得分:2)
'VM'vmName'的操作系统配置未在指定的时间内完成。但是,检测到VM guest虚拟机代理正在运行。这表明客户操作系统尚未准备好用作VM映像(使用CreateOption = FromImage)。要解决此问题,请按原样使用VHD与CreateOption = Attach或正确准备以用作图像
如果您使用的是未编译的图像来创建VM,则可能会导致错误,因此请确保您的图像是sysprepped。
如果从平台或用户映像创建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