从存储帐户中的专用 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 映像”部分。
如果需要创建存储帐户,请执行以下步骤:
需要知道应创建存储帐户的资源组名称。 若要了解订阅中的所有资源组,请键入:
Get-AzResourceGroup
若要在 美国西部 区域中创建名为 myResourceGroup 的资源组,请键入:
New-AzResourceGroup -Name myResourceGroup -Location "West US"
使用 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 和子网。
创建子网。 此示例在资源组 myResourceGroup中创建名为 mySubNet的子网,并将子网地址前缀设置为 10.0.0.0/24。
$rgName = "myResourceGroup" $subnetName = "mySubNet" $singleSubnet = New-AzVirtualNetworkSubnetConfig -Name $subnetName -AddressPrefix 10.0.0.0/24
创建 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 地址 和网络接口。
创建公共 IP。 在此示例中,公共 IP 地址名称设置为 myIP。
$ipName = "myIP" $pip = New-AzPublicIpAddress -Name $ipName -ResourceGroupName $rgName -Location $location ` -AllocationMethod Dynamic
创建 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 磁盘
设置上传或复制的 VHD 的 URI。 在此示例中,名为 myOsDisk.vhd 的 VHD 文件保存在 名为 myStorageAccount 的存储帐户中,该文件名为 myContainer 。
$osDiskUri = "https://myStorageAccount.blob.core.windows.net/myContainer/myOsDisk.vhd"
添加 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 虚拟机。