在使用Azure VM的过程中,我们可能会遇到移动虚拟机的需求,比如从区域A移动到区域B去,甚至有可能需要跨订阅的对虚拟机进行迁移。在以前我们通过Azcopy可以很方便的完成存储的迁移,今天我们要分享的是通过Azure Storage Explorer来完成存储迁移,再通过Azure PowerShell快速的完成其他资源的迁移。 首先,我们需要在Azure Storage Explorer里面添加不同订阅的帐户。然后找到源虚拟机的VHD文件,右键选择copy。 ![](https://s4.51cto.com/images/blog/201711/29/cccad963099c446e9bae80012bba703f.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=) 然后我们直接在目标存储帐户对应的blob容器中进行粘贴。 ![](https://s4.51cto.com/images/blog/201711/29/ca35f990aa3a1640c2008f5a7b421d4d.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=) 我们可以在下方看到存储迁移的进度,也可以通过PowerShell更直观的看到VHD的移动进展。 ![](https://s4.51cto.com/images/blog/201711/29/c7f58d9e7d539072c29cd359879b89c2.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=) 然后在存储帐户中找到Blob存储,找到对应的VHD文件,并复制它的URL。 ![](https://s4.51cto.com/images/blog/201711/29/ff0380dddcb50ea0399b4aa7443ce29b.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=) 接下来就要用到我们的PowerShell了,如果没有安装,请在以下地址下载最新版Azure PowerShell: https://github.com/Azure/azure-powershell/releases ![](https://s4.51cto.com/images/blog/201711/29/67d0826575f5e1b09492a363f7d4cbf9.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=) 关于更多安装和使用Azure PowerShell的文章请浏览: http://reinember.blog.51cto.com/2919431/1857099 然后我们通过PowerShell 完成登录,这里我的环境还是国内由世纪互联提供的Azure服务。 Login-AzureRmAccount -EnvironmentName azurechinacloud ![](![](https://s4.51cto.com/images/blog/201711/29/dfe82cfba0c9b348e264fcad8d692e4e.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)https://s4.51cto.com/images/blog/201711/29/830bf593bde9fa9b4e099a18ec7f76aa.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=) 然后我们提前定义以下变量信息: $VMNAME = "虚拟机名称" $RG="资源组" $VNETNAME=$RG+"-VNET" $SUBNETNAME=$RG+"-SUBNET" $NSGNAME=$RG+"-NSG" $OSDN = $VMNAME + "_OSDisk" $OSDU = "https://rstorageaccount.blob.core.chinacloudapi.cn/vhds/XXXXXXXXXXXXXXXXX.vhd" $LOC="China North" 以上信息的命名是自定义的,其中OSDU是我们前面复制的VHD的URL地址。 ![](https://s4.51cto.com/images/blog/201711/29/9a35fdd61a776f98c3a97ebc8114d71a.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=) 然后我们通过以下命令来重建虚拟网络: $vnet=New-AzureRmVirtualNetwork -Name $VNETNAME -ResourceGroupName $RG -Location $LOC -AddressPrefix 11.0.0.0/24 ![](https://s4.51cto.com/images/blog/201711/29/d4d26924f16d7882bea2d35b1c4fd22d.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=) 通过以下命令重建网络安全规则:(可以使用多条此命令添加多个规则) $nsgrule = New-AzureRmNetworkSecurityRuleConfig -Name RDP -Description "Allow RDP" -Access Allow -Protocol Tcp -Direction Inbound -Priority 100 -SourceAddressPrefix Internet -SourcePortRange * -DestinationAddressPrefix * -DestinationPortRange 3389 ![](https://s4.51cto.com/images/blog/201711/29/5bf4b14f8becc30aa54c89d15856bbb1.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=) 然后使用以下命令重建网络安全组: $nsg = New-AzureRmNetworkSecurityGroup -ResourceGroupName $RG -Location $LOC -Name $NSGNAME -SecurityRules $nsgrule ![](https://s4.51cto.com/images/blog/201711/29/1a06081dc47d2a847c66daaa9b76582d.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=) 重新添加子网配置: Add-AzureRmVirtualNetworkSubnetConfig -Name $SUBNETNAME -VirtualNetwork $vnet -AddressPrefix 11.0.0.0/24 -NetworkSecurityGroup $nsg ![](https://s4.51cto.com/images/blog/201711/29/35490e9efb8299eabec95bea54fc9b78.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=) 完成子网配置: $vnet=Set-AzureRmVirtualNetwork -VirtualNetwork $vnet ![](https://s4.51cto.com/images/blog/201711/29/dbe5b934294e97ec4e4f3e3234a3874e.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=) 通过以下命令获取子网ID: $subnet = Get-AzureRmVirtualNetworkSubnetConfig -Name $SUBNETNAME -VirtualNetwork $vnet 可以通过以下命令检查输出结果: $subnet.id ![](https://s4.51cto.com/images/blog/201711/29/ba6fe1f06a36c834623f3f3c33692fcc.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=) 重新为虚拟机创建公网IP地址,当然这是按需创建的,在此命令中我们可以指定是创建动态公网地址还是静态公网地址,通过AllocationMethod参数进行控制。 $pip =New-AzureRmPublicIpAddress -Name $VMNAME"-PIP" -ResourceGroupName $RG -Location $LOC -AllocationMethod Static -IpAddressVersion IPv4 -Force ![](https://s4.51cto.com/images/blog/201711/29/d4db53889ebd8f89a5079f32f8bc95e2.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=) 重新为虚拟机创建网络接口卡,也就是虚拟机的网卡。需要使用到我们前面已经创建好的子网、公网IP地址以及网络安全组信息。 $nic = New-AzureRmNetworkInterface -Name $VMNAME"-NIC" -ResourceGroupName $RG -Location $LOC -SubnetId $subnet.id -PublicIpAddressId $pip.id -NetworkSecurityGroupid $nsg.id ![](https://s4.51cto.com/images/blog/201711/29/08870fb6a71197f53d344b1c36d1a233.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=) 一切就绪,将所有配置信息全部添加到我们虚拟机的配置信息中,其中VMSize是可以自己控制的,如果不清楚当前区域有哪些虚拟机大小,可以通过Get-AzureRmVMSize命令来查看。 $vmconfig = New-AzureRmVMConfig -VMName $VMNAEME -VMSize Standard_D2 |Set-AzureRmVMOSDisk -Name $OSDN -VhdUri $OSDU -CreateOption Attach -Windows | Add-AzureRmVMNetworkInterface -Id $nic.id -Primary ![](https://s4.51cto.com/images/blog/201711/29/686fed41963f018321e4089400d8a090.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=) 最后一步当然是创建虚拟机了,通过新建虚拟机命令,完成虚拟机的迁移重建,这里我没有截图,完成之后会有一个返回创建成果的显示: New-AzureRmVM -ResourceGroupName $RG -Location $LOC -VM $vmconfig 完成之后,就可以在管理门户中,查看虚拟机的状态了,如果是正在运行,那就已经迁移完成了,整个过程还是非常简单的,可以快速、跨地域的完成虚拟机迁移,再也不用担心虚拟机位置不能变的问题了。