在 Azure 中创建通用化 VM 的旧版托管映像

重要

本文介绍较旧的托管映像技术。 对于最新的技术,建议客户使用 Azure Compute Gallery。 只有通过 Azure Compute Gallery,才支持所有新功能(如 ARM64、受信任启动和机密 VM)。 如果已有托管映像,可将其用作源并创建 Azure Compute Gallery 映像。 有关详细信息,请参阅创建映像定义和映像版本

在 Azure 中将 VM 标记为 generalized 后,无法重启 VM。

一个托管映像最多支持 20 个同时部署。 如果尝试从同一托管映像同时创建超过 20 个 VM,则可能会由于单个 VHD 的存储性能限制而导致预配超时。 若要同时创建 20 个以上的 VM,请使用为每 20 个并发 VM 部署配置 1 个副本的 Azure Compute Gallery(以前称为共享映像库)。

有关托管映像如何计费的信息,请参阅托管磁盘定价

先决条件

CLI:创建 VM 的旧版托管映像

现在,使用 az image create 创建 VM 托管映像。 以下示例使用名为 myVM 的 VM 资源在名为 myResourceGroup 的资源组中创建名为 myImage 的映像 。

az image create \
  --resource-group myResourceGroup \
  --name myImage --source myVM

Note

The image is created in the same resource group as your source VM. You can create VMs in any resource group within your subscription from this image. From a management perspective, you may wish to create a specific resource group for your VM resources and images.

If you are capturing an image of a generation 2 VM, also use the --hyper-v-generation V2 parameter. for more information, see Generation 2 VMs.

If you would like to store your image in zone-resilient storage, you need to create it in a region that supports availability zones and include the --zone-resilient true parameter.

This command returns JSON that describes the VM image. Save this output for later reference.

PowerShell:创建 VM 的旧版托管映像

直接从 VM 创建映像,可确保映像包含所有与该 VM 关联的磁盘,包括 OS 磁盘和任何数据磁盘。 本示例演示如何从使用托管磁盘的 VM 创建托管映像。

在开始之前,请确保有最新版本的 Azure PowerShell 模块。 若要查找版本,请在 PowerShell 中运行 Get-Module -ListAvailable Az。 如需升级,请参阅使用 PowerShellGet 在 Windows 上安装 Azure PowerShell。 如果在本地运行 PowerShell,则运行 Connect-AzAccount 以创建与 Azure 的连接。

注意

如果希望将映像存储在具有区域冗余能力的存储中,需要在支持可用性区域的区域中创建该映像并在映像配置中包括 -ZoneResilient 参数(New-AzImageConfig 命令)。

若要创建 VM 映像,请遵循下列步骤:

  1. 创建一些变量。

    $vmName = "myVM"
    $rgName = "myResourceGroup"
    $location = "ChinaNorth"
    $imageName = "myImage"
    
  2. 确保 VM 已解除分配。

    Stop-AzVM -ResourceGroupName $rgName -Name $vmName -Force
    
  3. 将虚拟机的状态设置为“通用化”。

    Set-AzVm -ResourceGroupName $rgName -Name $vmName -Generalized
    
  4. 获取虚拟机。

    $vm = Get-AzVM -Name $vmName -ResourceGroupName $rgName
    
  5. 创建映像配置。

    $image = New-AzImageConfig -Location $location -SourceVirtualMachineId $vm.Id 
    
  6. 创建映像。

    New-AzImage -ImageName $imageName -ResourceGroupName $rgName -Image $imageConfig
    

PowerShell:从托管磁盘创建旧版托管映像

如果仅想创建 OS 磁盘的映像,则将托管磁盘 ID 指定为 OS 磁盘:

  1. 创建一些变量。

    $vmName = "myVM"
    $rgName = "myResourceGroup"
    $location = "ChinaNorth"
    $imageName = "myImage"
    
  2. 获取 VM。

    $vm = Get-AzVm -Name $vmName -ResourceGroupName $rgName
    
  3. 获取托管磁盘的 ID。

    $diskID = $vm.StorageProfile.OsDisk.ManagedDisk.Id
    
  4. 创建映像配置。

    $imageConfig = New-AzImageConfig -Location $location
    $imageConfig = Set-AzImageOsDisk -Image $imageConfig -OsState Generalized -OsType Windows -ManagedDiskId $diskID
    
  5. 创建映像。

    New-AzImage -ImageName $imageName -ResourceGroupName $rgName -Image $imageConfig
    

PowerShell:从快照创建旧版托管映像

通过执行以下步骤,可以从通用 VM 的快照创建托管映像:

  1. 创建一些变量。

    $rgName = "myResourceGroup"
    $location = "ChinaNorth"
    $snapshotName = "mySnapshot"
    $imageName = "myImage"
    
  2. 获取快照。

    $snapshot = Get-AzSnapshot -ResourceGroupName $rgName -SnapshotName $snapshotName
    
  3. 创建映像配置。

    $imageConfig = New-AzImageConfig -Location $location
    $imageConfig = Set-AzImageOsDisk -Image $imageConfig -OsState Generalized -OsType Windows -SnapshotId $snapshot.Id
    
  4. 创建映像。

    New-AzImage -ImageName $imageName -ResourceGroupName $rgName -Image $imageConfig
    

PowerShell:从使用存储帐户的 VM 创建旧版托管映像

若要从不使用托管磁盘的 VM 创建托管映像,需要存储帐户中 OS VHD 的 URI,格式如下: https://mystorageaccount.blob.core.chinacloudapi.cn/vhdcontainer/vhdfilename.vhd。 在本示例中,VHD 位于名为 vhdcontainer 的容器中的 mystorageaccount 中,且 VHD 文件名为 vhdfilename.vhd。

  1. 创建一些变量。

    $vmName = "myVM"
    $rgName = "myResourceGroup"
    $location = "ChinaNorth"
    $imageName = "myImage"
    $osVhdUri = "https://mystorageaccount.blob.core.chinacloudapi.cn/vhdcontainer/vhdfilename.vhd"
    
  2. 停止/解除分配 VM。

    Stop-AzVM -ResourceGroupName $rgName -Name $vmName -Force
    
  3. 将 VM 标记为通用。

    Set-AzVm -ResourceGroupName $rgName -Name $vmName -Generalized    
    
  4. 使用通用化的 OS 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
    

CLI:从旧版托管映像创建 VM

使用通过 az vm create 创建的映像来创建 VM。 以下示例从名为 myImage 的映像创建名为 myVMDeployed 的 VM 。

az vm create \
  --resource-group myResourceGroup \
  --name myVMDeployed \
  --image myImage\
  --admin-username azureuser \
  --ssh-key-value ~/.ssh/id_rsa.pub

CLI:从旧托管映像在另一个资源组中创建 VM

可在订阅内的任何资源组中根据映像创建 VM。 要在与映像不同的资源组中创建 VM,请指定映像的完整资源 ID。 使用 az image list 查看映像列表。 输出类似于以下示例。

"id":
"/subscriptions/guid/resourceGroups/MYRESOURCEGROUP/providers/Microsoft.Compute/images/myImage",
"location": "chinanorth", "name": "myImage",

以下示例使用 az vm create,通过指定映像资源 ID,在与源映像不同的资源组中创建 VM。

az vm create \
  --resource-group myOtherResourceGroup \
  --name myOtherVMDeployed \
  --image "/subscriptions/guid/resourceGroups/MYRESOURCEGROUP/providers/Microsoft.Compute/images/myImage" \
  --admin-username azureuser \
  --ssh-key-value ~/.ssh/id_rsa.pub

门户:从旧版托管映像创建 VM

在 Azure 中创建 VM:在门户中查找映像,选择“创建 VM”,填写详细信息,选择大小,调整设置,然后部署。

  1. 转到 Azure 门户查找托管映像。 搜索并选择“映像”。

  2. 从列表中选择需要使用的映像。 随即打开映像“概述”页。

  3. 从菜单中选择“创建 VM”。

  4. 输入虚拟机信息。 在此处输入的用户名和密码将用来登录到虚拟机。 完成后选择“确定”。 可以在现有资源组中创建新的 VM,或者选择“新建”创建一个新的资源组用于存储 VM。

  5. 为 VM 选择大小。 若要查看更多的大小,请选择“全部查看”或更改“支持的磁盘类型”筛选器。

  6. 在“设置”下,根据需要进行更改并选择“确定” 。

  7. 在摘要页上,应该可以看见你的映像名称作为“专用映像”列出。 选择“确定”以启动虚拟机部署。

PowerShell:从旧版托管映像创建 VM

可以使用 PowerShell 通过使用 New-AzVm cmdlet 的简化参数集来基于映像创建 VM。 该映像需要位于你要在其中创建 VM 的同一资源组中。

New-AzVm 的简化参数集仅要求提供名称、资源组和映像名称便可基于映像创建 VM。 New-AzVm 将使用 -Name 参数的值作为它自动创建的所有资源的名称。 在此示例中,我们为每个资源提供更详细的名称,但让 cmdlet 自动创建这些资源。 你还可以提前创建资源(例如虚拟网络)并将名称传递给 cmdlet。 如果 New-AzVm 可以通过名称找到现有资源,就会使用现有资源。

以下示例在“myResourceGroup”资源组中从名为“myImage”的映像创建名为“myVMFromImage”的 VM。

New-AzVm `
    -ResourceGroupName "myResourceGroup" `
    -Name "myVMfromImage" `
    -ImageName "myImage" `
    -Location "China North" `
    -VirtualNetworkName "myImageVnet" `
    -SubnetName "myImageSubnet" `
    -SecurityGroupName "myImageNSG" `
    -PublicIpAddressName "myImagePIP" 

下一步