将虚拟机从一台微软Hyper-V主机移动到另一台并不是惊天动地的消息,但是你做到了吗?微软Server 2012和2012 R2通过图形Hyper-V管理器就能轻易实现这个迁移过程。如果你像我一样想加速迁移过程--甚至自动化该过程--PowerShell可以帮助你。你还可以通过使用SMB 3.0文件共享来加速迁移过程。
将虚拟机从一台主机迁移到另一台主机的动机很多,从负载平衡到老主机退役。过去的一个挑战就是在漫长的迁移过程中遭遇停机,但以后再也不会出现了。动态迁移保障了整个虚拟机及其存储的迁移过程顺利进行。
微软动态迁移有三种方式:
无共享实时迁移--在这种迁移过程中,你将虚拟机及其存储从一台服务器迁移到另一台服务器。
动态存储迁移--虚拟机设置留在当前主机上,但是虚拟机的存储(虚拟硬盘)迁移到其他位置。
动态迁移--允许将虚拟机从一个集群节点在线迁移到另一个集群结点。
本文中,我将重点介绍无共享实时迁移,也是三种类型中最耗费时间的一种。虽然你可以使用System Center虚拟机管理器执行此类迁移,但我将通过Server 2012中的Hyper-V cmdlet实现。
Hyper-V cmdlet实现动态迁移 实验室准备
我喜欢在实验室环境中尝试新的想法和技术,在生产之前你也应该尝试一下。我的实验室环境由一个域控制器和两个Hyper-V主机(名为S1和S2)构成。S1上已经运行了一台虚拟机(名为Server1)。我的目标是在不影响客户正常活动下迁移虚拟机。
简单地说,无共享实时迁移是指将虚拟机及其存储顺利从一个Hyper-V主机迁移到另一个Hyper-V主机,不会产生停机时间。这是一个复杂的后台过程,但微软已经改进了方法使之变得相当简单。
我在客户端计算机使用PowerShell remoting或RSAT完成所有的管理。如果你的实验室环境中没有执行这些任务的客户端,可以使用运行虚拟机的Hyper-V主机。
检查VM状态
快速检查虚拟机状态以确保一切正常。检查当前Hyper-V主机的状态和存储位置:
Get-VM -Name server1 | Format-Table -Property Name, Path, State
PS C:> Get-VMHardDiskDrive -VMName Server1 | Format-Table -Property VMName, Path
启用和执行动态迁移
设置迁移的基本设置很简单。你需要启用迁移功能并选择一个移动网络。在生产环境中,最好有多个网络接口卡并且在独立网络中推动迁移进程。对于实验室测试来说,是可以使用现有的网络的,因为没有最终用户会受到影响。
为了启动虚拟机迁移,在两个Hyper-V服务器中输入下面的命令或在客户端使用PowerShell remoting.
PS C:> Enable-VMMigration
在两个Hyper-V主机上添加虚拟机迁移网络:
PS C:> Add-VMMigrationNetwork 192.168.3.0/24
将虚拟机及其存储迁移到另一个Hyper-V主机现在只是一个命令。我现在要将虚拟机移动到S2主机上并将存储放到"C:HyperV"这里。为了测试,我在迁移过程中ping到虚拟机看看通信情况。命令如下:
PS C:> Move-VM –Name Server1 -DestinationHost s2 -DestinationStoragePath c:HyperV
使用SMB 3.0共享执行迁移
如果你真的想加速移动过程,不管虚拟机是在单独的还是在集群中,你都可以使用新的SMB 3.0文件共享。我们之前有介绍过SMB 3.0包括很多功能,但最重要的是,它提升了性能。
[Ok3w_NextPage]首先在虚拟机存储的目标位置设置SMB 3.0共享和权限。你需要为管理员和两台主机创建共享权限,并将这些权限分配给NTFS.我在两台Hyper-V主机上都创建了,因此我可以来回移动虚拟机。
PS C:> New-SmbShare -Name Share1 -Path C:hyperv -FullAccess Companyadministrator, CompanyS1, CompanyS2
PS C:> Set-SmbPathAcl -ShareName Share1
使用SMB共享执行迁移的过程和之前相似:
PS C:> Move-VM –Name Server1 -DestinationHost s2 -DestinationStoragePath S2Share1
可能会遇到一些权限问题,尤其是从客户端执行时。你可以通过启用主机和客户端之间的委托约束解决。
使用动态迁移来移动虚拟机设置非常简单,而且如果了解PowerShell cmdlet的话会很容易自动化。另外可以考虑使用新的SMB 3.0共享提升你的迁移速度。