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

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

可以使用两个选项:

选项 1:上传专用 VHD

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

准备 VM

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

  • 准备好要上传到 Azure 的 Windows VHD不要使用 Sysprep 通用化 VM。
  • 删除 VM 上安装的所有来宾虚拟化工具和代理(例如 VMware 工具)。
  • 确保 VM 配置为通过 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。

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

Azure 门户中该 VM 的“状态”将从“已停止”更改为“已停止(已解除分配)” 。

获取存储帐户 URL

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

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

  • 门户:单击>">所有服务>存储帐户存储帐户>Blobs,源 VHD 文件可能位于 vhds 容器中。 单击容器的“属性”并复制标记为 URL 的文本。 你会需要用到源和目标容器的 URL。
  • Powershell:使用 Get-AzVM 可获取资源组 myResourceGroup 中名为 myVM 的 VM 的信息。 在结果中,查看 Vhd UriStorage profile 部分。 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 或辅助存储密钥,则请尝试使用主密钥或第一个存储密钥。

创建新 VM

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

创建子网和 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 规则的详细信息,请参阅 Opening ports to a VM in Azure using PowerShell(使用 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 文件保存在容器(名为 myContainer)中名为 myStorageAccount 的存储帐户中。

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

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

可选:如果有需要附加到 VM 的数据磁盘,可使用数据 VHD 的 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

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

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

如果此命令成功,会看到类似于下面的输出:

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

验证是否已创建 VM

Azure 门户中,应当可以在“所有服务”>“虚拟机” 下看到新建的 VM,也可以使用以下 PowerShell 命令查看该 VM:

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

后续步骤

登录新虚拟机。 有关详细信息,请参阅 How to connect and log on to an Azure virtual machine running Windows(如何连接并登录到运行 Windows 的 Azure 虚拟机)。