从存储帐户中的专用 VHD 创建 VM

通过使用 Powershell 将专用非托管磁盘附加为 OS 磁盘来创建新的 VM。 专用磁盘是现有 VM 中的 VHD 副本,用于维护原始 VM 中的用户帐户、应用程序和其他状态数据。

可以使用两个选项:

选项 1:上传专用 VHD

可以从使用本地虚拟化工具(如 Hyper-V)创建的专用 VM 上传 VHD,或从另一个云导出的 VM。

准备虚拟机

可以上传使用本地 VM 创建的专用 VHD 或从另一个云导出的 VHD。 专用 VHD 维护原始 VM 中的用户帐户、应用程序和其他状态数据。 如果打算使用 VHD as-is 创建新的 VM,请确保完成以下步骤。

  • 准备 Windows VHD 上传到 Azure 之用请勿 使用 Sysprep 对 VM 进行通用化。
  • 删除 VM 上安装的任何来宾虚拟化工具和代理(即 VMware 工具)。
  • 确保虚拟机配置为通过 DHCP 获取其 IP 地址和 DNS 设置。 这可确保服务器在启动 VNet 时获取 IP 地址。

获取存储帐户

需要在 Azure 中使用存储帐户来存储上传的 VM 映像。 可以使用现有存储帐户,也可以创建新的存储帐户。

若要显示可用的存储帐户,请键入:

Get-AzStorageAccount

如果要使用现有存储帐户,请转到“上传 VM 映像”部分。

如果需要创建存储帐户,请执行以下步骤:

  1. 需要知道应创建存储帐户的资源组名称。 若要了解订阅中的所有资源组,请键入:

    Get-AzResourceGroup
    

    若要在 美国西部 区域中创建名为 myResourceGroup 的资源组,请键入:

    New-AzResourceGroup -Name myResourceGroup -Location "West US"
    
  2. 使用 New-AzStorageAccount cmdlet 在此资源组中创建名为 mystorageaccount 的存储帐户:

    New-AzStorageAccount -ResourceGroupName myResourceGroup -Name mystorageaccount -Location "West US" `
        -SkuName "Standard_LRS" -Kind "Storage"
    

将 VHD 上传到存储帐户

使用 Add-AzVhd cmdlet 将映像上传到存储帐户中的容器。 此示例将 myVHD.vhd 的文件从 "C:\Users\Public\Documents\Virtual hard disks\" 上传到 myResourceGroup 资源组中 名为 mystorageaccount 的存储帐户。 该文件将放置在名为 mycontainer 的容器中,新文件名将 myUploadedVHD.vhd

$rgName = "myResourceGroup"
$urlOfUploadedImageVhd = "https://mystorageaccount.blob.core.windows.net/mycontainer/myUploadedVHD.vhd"
Add-AzVhd -ResourceGroupName $rgName -Destination $urlOfUploadedImageVhd `
    -LocalFilePath "C:\Users\Public\Documents\Virtual hard disks\myVHD.vhd"

如果成功,则会收到如下所示的响应:

MD5 hash is being calculated for the file C:\Users\Public\Documents\Virtual hard disks\myVHD.vhd.
MD5 hash calculation is completed.
Elapsed time for the operation: 00:03:35
Creating new page blob of size 53687091712...
Elapsed time for upload: 01:12:49

LocalFilePath           DestinationUri
-------------           --------------
C:\Users\Public\Doc...  https://mystorageaccount.blob.core.windows.net/mycontainer/myUploadedVHD.vhd

根据网络连接和 VHD 文件的大小,此命令可能需要一段时间才能完成。

选项 2:从现有 Azure VM 复制 VHD

可以将 VHD 复制到另一个存储帐户,以在创建新的重复 VM 时使用。

开始之前

请确保:

  • 获取源存储帐户和目标存储帐户的相关信息。 对于源 VM,需要具有存储帐户和容器名称。 通常,容器名称将是 vhds。 还需要有一个目标存储帐户。 如果还没有帐户,可以使用门户(所有服务> 存储帐户 > 添加)或使用 New-AzStorageAccount cmdlet 创建一个。
  • 已下载并安装 AzCopy 工具

解除分配 VM

解除分配 VM,以便释放 VHD 进行复制。

  • 门户:单击 虚拟机>myVM,> 停止
  • Powershell:使用 Stop-AzVM 停止(解除分配)在资源组 myResourceGroup中名为 myVM 的虚拟机。
Stop-AzVM -ResourceGroupName myResourceGroup -Name myVM

在 Azure 门户中,VM 的 状态已停止 变更为 已停止(已解除分配)

获取存储帐户 URL

需要源和目标存储帐户的 URL。 URL 如下所示:https://<storageaccount>.blob.core.windows.net/<containerName>/。 如果已知道存储帐户和容器名称,只需替换括号之间的信息即可创建 URL。

可以使用 Azure 门户或 Azure Powershell 获取 URL:

  • 门户:单击 > 以访问 所有服务>存储帐户>存储帐户>Blob,您的源 VHD 文件可能位于 vhds 容器中。 单击容器 属性,并复制 URL标记的文本。 需要源容器和目标容器的 URL。
  • Powershell:使用 Get-AzVM 获取资源组 myResourceGroup中 VM 名为 myVM 的信息。 在结果中,在 存储配置文件 部分查找 Vhd Uri。 Uri 的第一部分是容器的 URL,最后一部分是 VM 的 OS VHD 名称。
Get-AzVM -ResourceGroupName "myResourceGroup" -Name "myVM"

获取存储访问密钥

查找源存储帐户和目标存储帐户的访问密钥。 有关访问密钥的详细信息,请参阅 关于 Azure 存储帐户

  • 门户:单击 所有服务>存储帐户>存储帐户>访问密钥。 复制标记为 key1 的密钥
  • Powershell:使用 Get-AzStorageAccountKey 获取资源组 myResourceGroup中存储帐户 mystorageaccount 的存储密钥。 复制标记为 key1的密钥。
Get-AzStorageAccountKey -Name mystorageaccount -ResourceGroupName myResourceGroup

复制 VHD

可以使用 AzCopy 在存储帐户之间复制文件。 对于目标容器,如果指定的容器不存在,则会为你创建它。

若要使用 AzCopy,请在本地计算机上打开命令提示符,并导航到安装 AzCopy 的文件夹。 它类似于 C:\Program Files (x86)\Microsoft SDKs\Azure\AzCopy

若要复制容器中的所有文件,请使用 /S 开关。 这可用于复制 OS VHD 和所有数据磁盘(如果它们位于同一容器中)。 此示例展示如何将存储帐户 mysourcestorageaccount 中的容器 mysourcecontainer 内的所有文件复制到存储帐户 mydestinationstorageaccount 中的容器 mydestinationcontainer。 将存储帐户和容器的名称替换为自己的名称。 将 <sourceStorageAccountKey1><destinationStorageAccountKey1> 替换为自己的密钥。

AzCopy /Source:https://mysourcestorageaccount.blob.core.windows.net/mysourcecontainer `
    /Dest:https://mydestinationatorageaccount.blob.core.windows.net/mydestinationcontainer `
    /SourceKey:<sourceStorageAccountKey1> /DestKey:<destinationStorageAccountKey1> /S

如果只想在包含多个文件的容器中复制特定 VHD,还可以使用 /Pattern 开关指定文件名。 在此示例中,将仅复制名为 myFileName.vhd 的文件

AzCopy /Source:https://mysourcestorageaccount.blob.core.windows.net/mysourcecontainer `
  /Dest:https://mydestinationatorageaccount.blob.core.windows.net/mydestinationcontainer `
  /SourceKey:<sourceStorageAccountKey1> /DestKey:<destinationStorageAccountKey1> `
  /Pattern:myFileName.vhd

完成后,将收到如下所示的消息:

Finished 2 of total 2 file(s).
[2016/10/07 17:37:41] Transfer summary:
-----------------
Total files transferred: 2
Transfer successfully:   2
Transfer skipped:        0
Transfer failed:         0
Elapsed time:            00.00:13:07

故障排除

  • 使用 AZCopy 时,如果看到错误“服务器无法对请求进行身份验证”,请确保授权标头的值已正确构成,包括签名。 如果使用密钥 2 或辅助存储密钥,请尝试使用主存储密钥或第 1 个存储密钥。

创建新 VM

需要创建新 VM 要使用的网络和其他 VM 资源。

创建 subNet 和 vNet

创建 虚拟网络的 vNet 和子网。

  1. 创建子网。 此示例在资源组 myResourceGroup中创建名为 mySubNet的子网,并将子网地址前缀设置为 10.0.0.0/24

    $rgName = "myResourceGroup"
    $subnetName = "mySubNet"
    $singleSubnet = New-AzVirtualNetworkSubnetConfig -Name $subnetName -AddressPrefix 10.0.0.0/24
    
  2. 创建 vNet。 此示例将虚拟网络名称设置为 myVnetName美国西部的位置,并将虚拟网络的地址前缀设置为 10.0.0.0/16

    $location = "West US"
    $vnetName = "myVnetName"
    $vnet = New-AzVirtualNetwork -Name $vnetName -ResourceGroupName $rgName -Location $location `
        -AddressPrefix 10.0.0.0/16 -Subnet $singleSubnet
    

    创建网络安全组和 RDP 规则

    若要能够使用 RDP 登录到 VM,需要有一个允许在端口 3389 上进行 RDP 访问的安全规则。 由于新 VM 的 VHD 是从现有专用 VM 创建的,因此创建 VM 后,可以使用源虚拟机中的现有帐户,该帐户有权使用 RDP 登录。 在创建要与之关联的网络接口之前,需要完成此作。
    本示例将 NSG 名称设置为 myNsg,将 RDP 规则名称设置为 myRdpRule

$nsgName = "myNsg"

$rdpRule = New-AzNetworkSecurityRuleConfig -Name myRdpRule -Description "Allow RDP" `
    -Access Allow -Protocol Tcp -Direction Inbound -Priority 110 `
    -SourceAddressPrefix Internet -SourcePortRange * `
    -DestinationAddressPrefix * -DestinationPortRange 3389
$nsg = New-AzNetworkSecurityGroup -ResourceGroupName $rgName -Location $location `
    -Name $nsgName -SecurityRules $rdpRule
	

有关终结点和 NSG 规则的详细信息,请参阅 使用 PowerShell在 Azure 中打开 VM 的端口。

创建公共 IP 地址和 NIC

若要在虚拟网络中启用与虚拟机的通信,需要 公共 IP 地址 和网络接口。

  1. 创建公共 IP。 在此示例中,公共 IP 地址名称设置为 myIP

    $ipName = "myIP"
    $pip = New-AzPublicIpAddress -Name $ipName -ResourceGroupName $rgName -Location $location `
        -AllocationMethod Dynamic
    
  2. 创建 NIC。 在此示例中,NIC 名称设置为 myNicName。 此步骤还将前面创建的网络安全组与此 NIC 相关联。

    $nicName = "myNicName"
    $nic = New-AzNetworkInterface -Name $nicName -ResourceGroupName $rgName `
     -Location $location -SubnetId $vnet.Subnets[0].Id -PublicIpAddressId $pip.Id -NetworkSecurityGroupId $nsg.Id
    

设置 VM 名称和大小

本示例将 VM 名称设置为“myVM”,VM 大小设置为“Standard_A2”。

$vmName = "myVM"
$vmConfig = New-AzVMConfig -VMName $vmName -VMSize "Standard_A2"

添加 NIC

$vm = Add-AzVMNetworkInterface -VM $vmConfig -Id $nic.Id

配置 OS 磁盘

  1. 设置上传或复制的 VHD 的 URI。 在此示例中,名为 myOsDisk.vhd 的 VHD 文件保存在 名为 myStorageAccount 的存储帐户中,该文件名为 myContainer

    $osDiskUri = "https://myStorageAccount.blob.core.windows.net/myContainer/myOsDisk.vhd"
    
  2. 添加 OS 磁盘。 在此示例中,创建 OS 磁盘时,术语“osDisk”将追加到 VM 名称,以创建 OS 磁盘名称。 此示例还指定此基于 Windows 的 VHD 应作为 OS 磁盘附加到 VM。

    $osDiskName = $vmName + "osDisk"
    $vm = Set-AzVMOSDisk -VM $vm -Name $osDiskName -VhdUri $osDiskUri -CreateOption attach -Windows
    

可选:如果您有需要附加到虚拟机的数据磁盘,请使用数据虚拟硬盘的 URL 和相应的逻辑单元号(Lun)来添加数据磁盘。

$dataDiskName = $vmName + "dataDisk"
$vm = Add-AzVMDataDisk -VM $vm -Name $dataDiskName -VhdUri $dataDiskUri -Lun 1 -CreateOption attach

使用存储帐户时,数据和操作系统磁盘 URL 如下所示:https://StorageAccountName.blob.core.windows.net/BlobContainerName/DiskName.vhd。 可以在门户中,浏览到目标存储容器,单击已复制的操作系统或数据 VHD,然后复制 URL 的内容来查找此信息。

完成虚拟机设置

使用刚刚创建的配置创建 VM。

#Create the new VM
New-AzVM -ResourceGroupName $rgName -Location $location -VM $vm

如果此命令成功,你将看到如下所示的输出:

RequestId IsSuccessStatusCode StatusCode ReasonPhrase
--------- ------------------- ---------- ------------
                         True         OK OK   

验证是否已创建 VM

您应该在 Azure 门户中看到新创建的 VM,可以在 所有服务>的虚拟机下查看,或者通过使用以下 PowerShell 命令来查看:

$vmList = Get-AzVM -ResourceGroupName $rgName
$vmList.Name

后续步骤

登录到新虚拟机。 有关详细信息,请参阅 如何连接和登录到运行 Windows 的 Azure 虚拟机