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

来源:互联网 发布:阿里云免费半年邀请码 编辑:程序博客网 时间:2024/05/19 16:33


一、使用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管理portal上已经可以看到上述创建的虚拟机:


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

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与原虚拟机是一致的,原虚拟机的配置文件如下:

[crane@CraneCentos ~]$ 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)截图如下:


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

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

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

[crane@CraneCentos ~]$ 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一致了:

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



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







阅读全文
0 0
原创粉丝点击