将 Windows 虚拟机从非托管磁盘迁移到托管磁盘

适用于:✔️ Windows VM

如果有使用非托管磁盘的现有 Windows 虚拟机 (VM),可通过 Azure 托管磁盘服务迁移 VM 以使用托管磁盘。 此过程同时转换操作系统 (OS) 磁盘和任何附加的数据磁盘。

准备阶段

  • 该迁移将重启 VM,因此请在预先存在的维护时段内规划 VM 迁移。

  • 该迁移不可逆。

  • 任何具有虚拟机参与者角色的用户将不能更改 VM 大小(因为它们可以预迁移)。 这是因为包含托管磁盘的 VM 要求用户对 OS 磁盘具有 Microsoft.Compute/disks/write 权限。

  • 请务必测试迁移。 在生产环境中执行迁移之前迁移测试性虚拟机。

  • 在迁移过程中,将解除分配 VM。 迁移完成后,VM 在启动时会接收新的 IP 地址。 如果需要,可向 VM 分配静态 IP 地址

  • 查看 Azure VM 代理支持迁移过程所需的最低版本。 有关如何检查和更新代理版本的信息,请参阅 Azure 中 VM 代理的最低版本支持

  • 不会删除在迁移之前由 VM 使用的原始 VHD 和存储帐户。 它们会继续产生费用。 若要避免这些项目产生的费用,请在验证迁移已完成后删除原始的 VHD Blob。 如果需要找到这些未附加的磁盘以删除它们,请参阅我们的文章查找并删除未附加的 Azure 托管和非托管磁盘

迁移单实例 VM

本部分介绍如何将单实例 Azure VM 从非托管磁盘迁移到托管磁盘。 (如果 VM 位于可用性集中,请参阅下一部分。)

  1. 使用 Stop-AzVM cmdlet 解除分配 VM。 以下示例在名为 myResourceGroup 的资源组中解除分配名为 myVM 的 VM:

    $rgName = "myResourceGroup"
    $vmName = "myVM"
    Stop-AzVM -ResourceGroupName $rgName -Name $vmName -Force
    
  2. 使用 ConvertTo-AzVMManagedDisk cmdlet 将 VM 迁移到托管磁盘。 以下过程转换之前的 VM,包括 OS 磁盘和任何数据磁盘,并启用虚拟机:

    ConvertTo-AzVMManagedDisk -ResourceGroupName $rgName -VMName $vmName
    

迁移可用性集中的 VM

如果要迁移到托管磁盘的 VM 位于可用性集中,则需要先将可用性集迁移到托管可用性集。

  1. 使用 Update-AzAvailabilitySet cmdlet 迁移可用性集。 以下示例在名为 myResourceGroup 的资源组中更新名为 myAvailabilitySet 的可用性集:

    $rgName = 'myResourceGroup'
    $avSetName = 'myAvailabilitySet'
    
    $avSet = Get-AzAvailabilitySet -ResourceGroupName $rgName -Name $avSetName
    Update-AzAvailabilitySet -AvailabilitySet $avSet -Sku Aligned 
    

    如果可用性集所在的区域只有 2 个托管容错域,但却有 3 个非托管容错域,则此命令会显示类似于“指定的容错域计数为 3,但该计数必须在 1 到 2 的范围内。”的错误消息。若要解决此错误,请将容错域更新为 2,并按如下所示将 Sku 更新为 Aligned

    $avSet.PlatformFaultDomainCount = 2
    Update-AzAvailabilitySet -AvailabilitySet $avSet -Sku Aligned
    
  2. 解除分配 VM,并迁移可用性集中的 VM。 以下脚本使用 Stop-AzVM cmdlet 解除分配每个 VM,使用 ConvertTo-AzVMManagedDisk 进行转换,并在迁移过程结束后自动将其重启:

    $avSet = Get-AzAvailabilitySet -ResourceGroupName $rgName -Name $avSetName
    
    foreach($vmInfo in $avSet.VirtualMachinesReferences)
    {
     $vm = Get-AzVM -ResourceGroupName $rgName | Where-Object {$_.Id -eq $vmInfo.id}
     Stop-AzVM -ResourceGroupName $rgName -Name $vm.Name -Force
     ConvertTo-AzVMManagedDisk -ResourceGroupName $rgName -VMName $vm.Name
    }
    

故障排除

  • 在转换之前,确保所有 VM 扩展都处于“预配成功”状态,否则迁移将失败,并出现错误代码 409。
  • 如果迁移过程中出现错误,或先前迁移中的问题导致 VM 处于“失败”状态,请再次运行 ConvertTo-AzVMManagedDisk cmdlet。 简单的重试通常可以解决这种情况。
  • 如果要将 Linux VM 转换为托管磁盘,请使用最新版本的 Azure Linux 代理。 使用 Azure Linux 代理 2.2.0 及更低版本的操作可能会失败。 也不支持在通用 VM 或属于经典可用性集的 VM 上运行迁移。
  • 如果迁移失败并出现“SnapshotCountExceeded”错误,请删除一些快照并重试该操作。

使用 Azure 门户进行迁移

还可以使用 Azure 门户将非托管磁盘迁移到托管磁盘。

  1. 登录到 Azure 门户
  2. 从门户的 VM 列表中选择 VM。
  3. 在 VM 的边栏选项卡中,从菜单中选择“磁盘”。
  4. 在“磁盘”边栏选项卡的顶部,选择“迁移到托管磁盘”。
  5. 如果 VM 位于可用性集中,则“迁移到托管磁盘”边栏选项卡上会出现“首先需要迁移可用性集”的警告。 此警告应该有一个链接,单击该链接即可迁移可用性集。 转换可用性集后,或者如果 VM 不在可用性集中,请单击“迁移”以启动将磁盘迁移到托管磁盘的过程。

VM 将会停止并在完成迁移后重新启动。

后续步骤

使用快照获取 VM 的只读副本。