一、使用Azure powershell复制正在运行VM的VHD并新建虚拟机的操作步骤


详细的操作步骤如下,我使用"xxx"隐去了特殊信息

Login-AzureRmAccount -EnvironmentName AzureChinaCloud   #登录订阅
Get-AzureRmSubscription  #获取订阅
Select-AzureSubscription -SubscriptionId xxx  #选择当前订阅

#复制正在运行的虚拟机的VHD,请提前将待复制的VHD所在的存储容器改为允许公网访问的“容器”选项
Get-AzureRmStorageAccount -ResourceGroupName cranetest -Name cranetestdiag549
$storageAccountName = "cranenorthtest"
$storageContainerName = "vhds"
$storageAccountKey =“xxx”'
$destinationVHDFileName = "Testcranecentos69.vhd"
$destinationContext = New-AzureStorageContext –StorageAccountName $storageAccountName -StorageAccountKey $storageAccountKey
start-AzureStorageBlobCopy -AbsoluteUri "https://xxx.blob.core.chinacloudapi.cn/vhds/CraneCentos20170724112854.vhd" -DestContainer $storageContainerName -DestContext $destinationContext -DestBlob $destinationVHDFileName

#获取VNET & Subnet(本例中使用已经存在的VNET)
$vnet=Get-AzureRmVirtualNetwork -Name cranevnetnorth -ResourceGroupName crane
$Subnet1=Get-AzureRmVirtualNetworkSubnetConfig -Name subnet1 -VirtualNetwork $vnet


#创建一个公网IP地址:
$publicIP=New-AzureRmPublicIpAddress -Name cranetestfromVHD -ResourceGroupName crane -Location "China North" -AllocationMethod Dynamic -IpAddressVersion IPv4 -Force  #新建
Get-AzureRmPublicIpAddress -Name cranetestfromVHD -ResourceGroupName crane #查看刚刚创建的公网IP信息

#创建可用性集:
$Availabilityset = New-AzureRmAvailabilitySet -Name cranetestAV -ResourceGroupName crane -Location "China North"

#创建网卡:
$NIC= New-AzureRmNetworkInterface -Name cranetestvmfromVHDNIC -ResourceGroupName crane -Location "China North" -SubnetId $Subnet1.Id -PublicIpAddressId $publicIP.Id -PrivateIpAddress 172.10.1.20
$NIC= Get-AzureRmNetworkInterface -Name cranetestvmfromVHDNIC -ResourceGroupName crane

#配置要使用的存储账号以及系统盘名称:
$storage = Get-AzureRmStorageAccount -Name cranenorthtest -ResourceGroupName crane
$vmname = "cranevmfromVHD"
$osdiskname = $vmname + "_OSDisk"
$osdiskurl = ”https://cranenorthtest.blob.core.chinacloudapi.cn/vhds/Testcranecentos69.vhd“

#生成虚拟机的配置,将新建的虚拟机放在虚拟网络及可用性集中:
$vmconfig = New-AzureRmVMConfig -VMName $vmname -VMSize Standard_A1 -AvailabilitySetId $Availabilityset.Id | Set-AzureRmVMOSDisk -Name $osdiskname -VhdUri $osdiskurl  -CreateOption Attach -Linux | Add-AzureRmVMNetworkInterface -Id $NIC.Id -Primary

#创建虚拟机:
New-AzureRmVM -ResourceGroupName crane -Location "China North" -VM $vmconfig 

创建成功的截图如下:

[Azure][ARM]使用Azure powershell复制正在运行VM的VHD并新建虚拟机时可能遇到的HostName异常

在Azure管理portal上已经可以看到上述创建的虚拟机:

[Azure][ARM]使用Azure powershell复制正在运行VM的VHD并新建虚拟机时可能遇到的HostName异常


二、注意事项及可能遇到的问题:

Azure平台官方推荐对虚拟机执行一般化操作后,再通过捕获镜像的方式创建新的虚拟机,(参考链接:

https://blogs.technet.microsoft.com/canitpro/2016/08/31/step-by-step-capture-a-linux-vm-image-from-a-running-vm/

Azure平台并不推荐使用如上方式创建新的虚拟机。因为新的虚拟机和全来的虚拟机所有的特殊配置都是一致的。这可能导致一定的冲突。如果源虚拟机未删除,那么我们将会遇到如下问题。

由于新创建的虚拟机其VHD中的网卡配置文件同之前的网卡配置文件是一样的,DHCP_HOSTNAME与原虚拟机是一致的,原虚拟机的配置文件如下:

[[email protected] ~]$ cat /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
ONBOOT=yes
BOOTPROTO=dhcp
TYPE=Ethernet
USERCTL=no
PEERDNS=yes
IPV6INIT=no
DHCP_HOSTNAME=CraneCentos


因此,Azure平台会将新虚拟机网卡HOSTNAME中名称对应的IP替换为新创建虚拟机(cranevmfromVHD)的内网IP,我们登陆新建的虚拟机(cranevmfromVHD)截图如下:

[Azure][ARM]使用Azure powershell复制正在运行VM的VHD并新建虚拟机时可能遇到的HostName异常


我们可以看到截图中新虚拟机的HOSTNAME与原来正在运行的虚拟机是一致的,此时运行"host name”命令后,此HostName在Azure平台解析出来的IP为新创建虚拟机(cranevmfromVHD)的内网IP,而非源虚拟机的内网IP。这是因为新虚拟机创建后,Azure平台的DNS会将自己DNS中HostName记录更新为新创建虚拟机的IP地址172.10.1.20 :

[[email protected] ~]$ host CraneCentos
CraneCentos.0w2jigzwqggenpfyzenup22n0b.ax.internal.chinacloudapp.cn has address 172.10.1.20

而host新建虚拟机在portal上显示的名称则提示无法找到HostName:

[[email protected] ~]$ host cranevmfromVHD
Host cranevmfromVHD not found: 3(NXDOMAIN)

需要注意的是,我们在实际应用中,在同一个VNET下是通过Hostname的方式访问其它虚拟机的,那么我们在此种情况下就会出现混乱。我们在实际troubleshooting客户的案例中,曾经遇到客户的应用因为无法正常解析Hostname而出现应用无法正常安装的情况。此种情况则是导致该异常的原因。


三、解决方法:

针对如上问题,以Linux CentOS 6.9为例,参考解决方案如下:

1. 确保 /etc/waagent.conf文件中的如下选项为”y”:

Provisioning.MoninorHostName=y

2.通过命令vi /etc/sysconfig/network-scripts/ifcfg-eth0修改新创建虚拟机的hostname为cranevmfromVHD

3.重启Waagent服务:

service waagent restart

4.如果需要修改虚拟机内部的显示名称,则需要使用如下命令并重启虚拟机:

sysctl kernel.hostname=cranevmfromVHD


完成如上四步,重启虚拟机后,我们可以看到虚拟机的hostname以及虚拟机内部显示的文件名均已经与虚拟机的名称cranevmfromVHD一致了:

[[email protected] ~]# host cranevmfromVHD
cranevmfromVHD.0w2jigzwqggenpfyzenup22n0b.ax.internal.chinacloudapp.cn has address 172.10.1.20



希望本文能对正在使用Azure的您有一点帮助。








相关文章:

  • 2021-12-26
  • 2021-09-16
  • 2022-12-23
  • 2021-05-09
  • 2021-08-31
  • 2022-02-17
  • 2021-04-16
猜你喜欢
  • 2021-08-10
  • 2021-08-05
  • 2022-01-04
  • 2021-12-11
  • 2021-11-19
  • 2021-12-02
  • 2022-12-23
相关资源
相似解决方案