В процессе динамической миграции без общих ресурсов выполняется перенос виртуальной машины, включая ее хранилище, память и состояние устройства, между хостами Hyper-V без прерывания обслуживания. Однако вы не можете использовать динамическую миграцию без общих ресурсов для осуществления миграции между кластерами напрямую. Вместо этого нужно сделать следующее:

  1. Удалите виртуальную машину как кластерный ресурс.
  2. Используйте динамическую миграцию без общих ресурсов для перемещения виртуальной машины на узел в новом кластере в кластерном хранилище.
  3. Добавьте виртуальную машину в качестве кластерного ресурса на целевой кластер.

При выполнении этих действий нет времени простоя, потому что виртуальная машина может быть добавлена в кластеры и удалена из них без задержек. Я написал сценарий, который использует базовый набор действий для выполнения операций, о которых шла речь, а именно:

  1. Запрашивает учетные данные, которые будут использоваться на удаленном кластере.
  2. Запрашивает имя узла удаленного кластера, на который вы хотите переместить виртуальную машину.
  3. Активирует делегирование CredSSP на выбранный узел (необходимо активировать протокол CredSSP на удаленном сервере, используя команду Enable-WSManCredSSP Server до начала работы).
  4. Запускает цикл, в котором запрашивает имя намеченной к перемещению виртуальной машины, а затем:
  • находит кластерную группу, которая владеет виртуальной машиной, и выводит ресурсы кластера этой виртуальной машины;
  • если виртуальная машина не запущена на текущем узле, она динамически перемещается в текущий узел (что упрощает процесс);
  • виртуальная машина удаляется из кластера;
  • происходит остановка виртуальной машины; это необходимо, если процессоры в исходном и целевом кластерах не соответствуют друг другу (например, Intel против AMD или разные версии процессоров Intel или AMD, а режим совместимости процессоров не активирован);
  • виртуальная машина перемещается на целевой узел при помощи динамической миграции без общих ресурсов;
  • виртуальная машина формирует кластерный ресурс на целевом кластере;
  • запрашивается имя следующей виртуальной машины, или производится нажатие клавиши Q для выхода, и все предыдущие шаги последовательно повторяются для следующей виртуальной машины.

Полный сценарий представлен ниже. Имейте в виду, что вам нужно запускать сценарий на узле в исходном кластере. Кроме того, вы, возможно, захотите изменить место хранения виртуальной машины в целевом кластере с C:\ClusterStorage\Volume1, который жестко закодирован в сценарий, на другое. Также убедитесь, что на хосте, запускающем сценарий, установлены модули Hyper-V Module for Windows PowerShell и Failover Cluster Module for Windows PowerShell. Данный сценарий не выполняет проверок на ошибки; это базовый набор, так что если вы захотите использовать его, вам, вероятно, следует добавить такую проверку.

#Migrates virtual machines between clusters
#Copyright 2014 John Savill
#
#Assumes virtual switch with same name exists on target
#
#Need to enable CredSSP to solve the double-hop problem associated with cluster commands
#http://blogs.msdn.com/b/clustering/archive/2009/06/25/9803001.aspx documents the double-hop problem related to clustering remote commands
#On the target server must have run Enable-WSManCredSSP Server
#Lets get started
Write-Host 'Please enter credential to be used for remote cluster execution'
$CustomCred = Get-Credential #Get credentials to use with CredSSP on the remote cluster
Write-Host 'Ensure the target Server has been configured to accept CredSSP by running command Enable-ESManCredSSP Server on the server'
$DestinationHost = Read-Host 'Enter the target host that will be used for all migrations >'
Enable-WSManCredSSP Client -DelegateComputer $DestinationHost –Force
$VMName = Read-Host 'Enter VM name to move >'
while ($VMName -ne 'Q')
{
#Show the cluster resources. Cannot use the $VMName as the cluster group as may not match, for example SCVMM names the cluster group differently
#Get-ClusterGroup -Name $VMName | Get-ClusterResource
$ClusterGroups = Get-ClusterGroup |? {($_.GroupType -eq 'VirtualMachine') -and ($_.State -eq 'Online')}
foreach ($ClusterGroup in $ClusterGroups)
{
$TempVM = $ClusterGroup | Get-VM
if ($TempVM.Name.ToUpper() -eq $VMName.ToUpper())
{
$FinalClusterGroup = $ClusterGroup
}
}
$FinalClusterGroup | Get-ClusterResource
$ClusterGroupName = $FinalClusterGroup.Name
#Store the host the VM is currently active on if wanted to take the approach of NOT moving it to local node but means requires Constrained Delegation configured
$NodeName = Get-ClusterGroup -Name $ClusterGroupName | Get-ClusterResource | Where-Object {$_.ResourceType -eq «Virtual Machine»} | Select-Object OwnerNode
$CurrentNodeName = $NodeName.OwnerNode.Name
#View the VM
Get-VM -Name $VMName -ComputerName $CurrentNodeName
#Move the VM to the current host
$LocalNodeName = $env:COMPUTERNAME
if ($CurrentNodeName.ToUpper() -ne $LocalNodeName.ToUpper())
{
Write-Host 'Moving VM from '$CurrentNodeName' to current node'
Move-ClusterVirtualMachineRole -Name $ClusterGroupName -Node $LocalNodeName -MigrationType Live
}
#Remove the cluster resources and group which does not stop or remove the actual VM on the host
Write-Host 'Removing cluster group for VM'
Remove-ClusterGroup -Name $ClusterGroupName -RemoveResources –Force
#Sleep to avoid lock from removing cluster resources (not typically required)
Start-Sleep -Seconds 10
#Have to shutdown as different processor type (Intel to AMD in my case but normally would not need to stop the VM) or if different versions
#and processor compatibility not enabled
Stop-Vm -Name $VMName #This will wait until the VM has stopped
Start-Sleep -Seconds 10
#Now migrate it from this node so don't need -ComputerName $LocalNodeName
Write-Host 'Moving VM to target node'
Move-VM -Name $VMName -DestinationHost $DestinationHost -DestinationStoragePath C:\ClusterStorage\Volume1\$VMName
$ScriptBlockContent = {
param ($VMName)
Add-ClusterVirtualMachineRole -VirtualMachine $VMName -Name $VMName }
#Now add as resource on the target cluster
Write-Host 'Making VM a cluster object on target'
Invoke-Command -ComputerName $DestinationHost -ScriptBlock $ScriptBlockContent -ArgumentList $VMName -Authentication Credssp -Credential $CustomCred
#Could automatically start the VM here if you wanted but I don't in this example
#Get next name
$VMName = Read-Host 'Enter VM name to move (Q to quit)>'
$VMName = $VMName.ToString()
}

А вот пример выполнения перемещения одной VM:

PS C:\>. \MigrateBetweenClusters.ps1
cfg : http://schemas.microsoft.com/wbem/wsman/1/config/client/auth
lang : en-US
Basic : true
Digest : true
Kerberos : true
Negotiate : true
Certificate: true
CredSSP : true
Please enter credential to be used for remote cluster execution
Ensure the target Server has been configured to accept CredSSP by running command Enable-ESManCredSSP Server on the server
Enter the target host that will be used for all migrations >: savaushv10
Enter VM name to move >: Test — DC01
Name : SCVMM DC01 (1)
State : Online
OwnerGroup : SCVMM DC01 Resources (1)
ResourceType: Virtual Machine
Name : SCVMM DC01 Configuration (1)
State : Online
OwnerGroup : SCVMM DC01 Resources (1)
ResourceType: Virtual Machine Configuration
Name : Test — DC01
State : Running
CpuUsage : 0
MemoryAssigned : 883949568
MemoryDemand : 724566016
MemoryStatus : OK
Uptime : 81.20:38:09
Status : Operating normally
ReplicationState: Disabled
Moving VM from savdalhv11 to current node
Name : SCVMM DC01 Resources (1)
OwnerNode: savdalhv10
State : Online
Removing cluster group for VM
Moving VM to target node
Making VM a cluster object on target
Name : Test — DC01
OwnerNode : savaushv10
State : Offline
PSComputerName: savaushv10
Enter VM name to move (Q to quit)>: Q