将非托管磁盘附加到 VM 进行脱机修复

Windows 虚拟机 (VM) 的一些故障排除方案(例如 VM 未启动时)需要脱机修复其 OS 磁盘。 本文介绍如何在失败的 OS 磁盘处于非托管状态时执行此类脱机修复。

确定 OS 磁盘是托管磁盘还是非托管磁盘

Azure 门户

打开 VM 的 “概述” 边栏选项卡。 如果 OS 磁盘不受托管,则信息性横幅指示 VM 未使用托管磁盘。

Azure 门户中横幅消息的屏幕截图,指示 V M 未使用托管磁盘。

此外,如果磁盘是非托管磁盘,则 OS 磁盘的“ 概述 ”边栏选项卡会将“ (非托管) ”追加到磁盘名称,如下所示:

屏幕截图显示附加到Azure 门户 V M 名称的“非托管”一词。

如果磁盘是托管的,则 OS 磁盘的“概述”边栏选项卡将显示“ 托管者 ”字段,如下所示:

Azure 门户中磁盘的“概述”边栏选项卡的屏幕截图,指示该磁盘由 V M 管理。

PowerShell

可以通过输入以下命令来验证 OS 磁盘是否不受管理。 (请务必将“MyResourceGroup”替换为资源组的名称,将“MyVM”替换为 VM 的名称。)

(get-azvm -ResourceGroupName MyResourceGroup -Name MyVM).StorageProfile.OsDisk

如果磁盘是非托管磁盘,则 ManagedDisk 旁边的输出中不会显示任何值,如以下示例所示:

OsType                  : Windows
EncryptionSettings      :
Name                    : MyVM-Disk1
Vhd                     : Microsoft.Azure.Management.Compute.Models.VirtualHardDisk
Image                   :
Caching                 : ReadWrite
WriteAcceleratorEnabled :
DiffDiskSettings        :
CreateOption            : FromImage
DiskSizeGB              : 127
ManagedDisk             :

如果磁盘是托管磁盘,则会在 ManagedDisk 旁边的输出中看到一个值,如以下示例所示:

OsType                  : Windows
EncryptionSettings      :
Name                    : MyVM2-Disk1
Vhd                     :
Image                   :
Caching                 : ReadWrite
WriteAcceleratorEnabled :
DiffDiskSettings        :
CreateOption            : FromImage
DiskSizeGB              :
ManagedDisk             : Microsoft.Azure.Management.Compute.Models.ManagedDiskParameters

Azure 命令行接口 (Azure CLI)

可以将 az vm show 命令与追加的查询 “storageProfile.osDisk.managedDisk” 结合使用来确定磁盘是否具有托管磁盘,如以下示例所示:

az vm show -n MyVM -g MyResourceGroup --query "storageProfile.osDisk.managedDisk"

如果磁盘是非托管的,该命令将不生成任何输出。 如果磁盘是托管的,它将生成输出,如以下示例所示:

{
  "diskEncryptionSet": null,
  "id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/MyResourceGroup/providers/Microsoft.Compute/disks/MyVm_OsDisk_1",
  "resourceGroup": "MyResourceGroup",
  "storageAccountType": null
}

创建附加到源的非托管 OS 磁盘的副本, (失败) VM

  1. 在Azure 门户中,停止 OS 磁盘未托管的源 VM。

  2. 在本地计算机上,下载、安装,然后启动 Microsoft Azure 存储资源管理器。 出现提示时提供 Azure 凭据。

  3. 在存储资源管理器导航窗格中,展开相应的订阅。

  4. 选择 VHD 所在的存储帐户,然后选择相应的磁盘容器。 默认情况下,非托管 OS 磁盘存储在 vhds (租用) 容器中。

    Azure 存储资源管理器的屏幕截图,其中在导航树中突出显示了存储帐户容器和 v h d s 租用容器。

  5. 在右窗格中,选择附加到要修复的源 VM 的 VHD,然后选择顶部的“ 复制 ”。 请注意,复制的磁盘只能粘贴到其他 Blob 容器中。

    Azure 存储资源管理器的屏幕截图,其中显示了选中的磁盘,其中突出显示了“复制”按钮。

  6. 通过右键单击导航窗格中的“ Blob 容器 ”,然后选择“创建 Blob 容器”,创建新的 Blob 容器。 为新 Blob 容器分配所选的名称,例如“disk-copies”。

    Azure 存储资源管理器显示导航菜单中 Blob 容器的快捷菜单,并突出显示了“创建 Blob 容器”。

  7. 选择“ 粘贴 ”,将复制的磁盘粘贴到新的 Blob 容器中。

    Azure 存储资源管理器的屏幕截图,其中突出显示了“粘贴”按钮。

使用非托管 OS 磁盘创建修复 VM

  1. 在Azure 门户,开始创建基于 Windows Server 2019 的新 VM 的过程。 此新 VM 将充当修复 VM,其自己的 OS 磁盘必须是非托管的。

  2. 在“创建虚拟机”向导的“基本信息”页上,在“可用性选项”列表中选择“不需要基础结构冗余”。

    “创建虚拟机”向导的“基本信息”页的屏幕截图,其中显示了为不需要基础结构而选择的选项。

  3. 在“磁盘”页上,展开“数据磁盘”下面的“高级”,然后清除“使用托管磁盘检查”框。 为非托管 OS 磁盘选择存储帐户。 不要选择附加现有磁盘。 “创建虚拟机”向导的“磁盘”页的屏幕截图,其中清除了“使用托管磁盘”选项。 如果无法取消选择 “使用托管磁盘 ”选项,请尝试使用以下命令创建 VM:

    ## Get the subnet ID of the VM
    
    $SubnetID = az network vnet subnet show --resource-group <RG name> --name <Subnet name> --vnet-name <VNet name> --query id -o tsv
    
    ## Create a VM with the unmanaged disk
    
    az vm create \
        --resource-group <RG name>\
        --name <VM name>\
        --image <Image name>\
        --location <location of the VM>\
        --admin-username <Admin name>\
        --subnet $SubnetID\
        --size <VM size>\
        --use-unmanaged-disk  
    
  4. 通过指定适合组织的配置详细信息,完成“创建虚拟机”向导。

将非托管磁盘的副本附加到修复 VM

  1. 在Azure 门户中,打开刚创建的新修复 VM 的“磁盘”边栏选项卡。

  2. 选择“ + 添加数据磁盘”。

    Azure 门户中修复 VM 的“磁盘”边栏选项卡的屏幕截图,其中突出显示了“添加数据磁盘”按钮。

  3. “附加非托管磁盘” 页上,选择“ 现有 Blob ”作为 “源类型”。

    “附加非托管磁盘”窗口的屏幕截图,其中选择了“现有 blob”选项。

  4. “源 blob”下,选择“ 浏览”,然后浏览以选择之前创建的 OS 磁盘副本。

    “附加非托管磁盘”窗口的屏幕截图,其中突出显示了“浏览”按钮。

    磁盘复制容器的屏幕截图,其中选择了磁盘并突出显示了“选择”按钮。

  5. “附加非托管磁盘” 页上,接受默认存储 Blob 名称,然后选择“ 确定”。

  6. 在新修复 VM 的“ 磁盘 ”边栏选项卡中,选择“ 保存”。

    “磁盘”边栏选项卡的屏幕截图,其中突出显示了“保存”按钮。

解锁磁盘(如果已加密)

如果磁盘已使用 Azure 磁盘加密 (ADE) 进行加密,则需要先解锁磁盘,然后才能修复它。 为此,请使用 解决方法 #3:手动方法解锁修复 VM 上的加密磁盘中所述的步骤。

可以使用下面的过程确定磁盘是否已加密: 确认磁盘上已启用 ADE

更换源 VM 上的 OS 磁盘

修复完磁盘后,请执行以下步骤:

  1. 使用 Azure CLI 或 PowerShell 分离源 VM OS 磁盘。

    Azure CLI

    使用 az vm unmanaged-disk detach 命令,如以下示例所示:

    az vm unmanaged-disk detach -g MyResourceGroup --vm-name MyVm -n disk_name
    

    PowerShell

    在 Azure Cloud Shell中输入以下命令,一次输入一个命令:

    $VirtualMachine = Get-AzVM -ResourceGroupName "MyResourceGroup" -Name "MyVm" 
    Remove-AzVMDataDisk -VM $VirtualMachine -Name "disk_name"
    Update-AzVM -ResourceGroupName "MyResourceGroup" -VM $VirtualMachine
    

    分离磁盘后,可以替换源 VM 上的 OS 磁盘。

  2. 当提示返回时,打开文本编辑器(如记事本),并记录以下值:

    • 订阅 ID ($subscriptionID) :与 Azure 订阅关联的 32 位全局唯一标识符 (GUID) 。
    • 资源组名称 ($rgname) :源 VM 的资源组。
    • VM 名称 ($vmname) :源 (的名称) VM 失败。
    • OS 磁盘 VHD URI ($vhduri) :刚从修复 VM 分离的非托管 OS 磁盘副本的 URI。 (右键单击存储资源管理器中的磁盘,然后选择“复制 URL.)
  3. 在 Azure Cloud Shell的 PowerShell 命令提示符处输入以下命令,一次输入一个。 在每个命令中,将值“订阅 ID”、“资源组名称”、“VM 名称”和“OS 磁盘 VHD URI”替换为刚从环境中记录的相应值。

    $subscriptionID = "Subscription ID"
    $rgname = "Resource group name"
    $vmname = "VM Name"
    $vhduri = "OS disk VHD URI"
    #Add-AzAccount
    Select-AzSubscription -SubscriptionID $subscriptionID
    Set-AzContext -SubscriptionID $subscriptionID
    $vm = Get-AzVM -ResourceGroupName $rgname -Name $vmname
    $vm.StorageProfile.OsDisk.Vhd.Uri = $vhduri
    Update-AzVM -ResourceGroupName $rgname -VM $vm       
    

    操作完成后,应会看到以下输出:

    RequestId IsSuccessStatusCode StatusCode ReasonPhrase
    --------- ------------------- ---------- ------------
                             True         OK OK
    
  4. 在Azure 门户中,打开 VM 上的“磁盘”边栏选项卡。 选择 OS 磁盘,然后验证 VHD URI 是否与在上一步中提供的值匹配。

后续步骤

若要阅读 ADE 的概述,请参阅 为 Windows VM 启用 Azure 磁盘加密。 有关可用于管理非托管磁盘的命令的详细信息,请参阅 az vm unmanaged-disk

联系我们寻求帮助

如果你有任何疑问或需要帮助,请创建支持请求联系 Azure 社区支持。 还可以向 Azure 反馈社区提交产品反馈。