Move-SCVirtualMachine

将存储在 VMM 库中或部署在主机上的虚拟机移动到主机上的新位置。

语法

Move-SCVirtualMachine
    [-VM] <VM>
    [-VMHost <Host>]
    [-ReplicationGroup <ReplicationGroup>]
    [-BlockLiveMigrationIfHostBusy]
    [-UseDiffDiskOptimization]
    [-StartVMOnTarget]
    [-DiscardSavedState]
    [-UseLAN]
    [-UseCluster]
    [-HighlyAvailable <Boolean>]
    [-Path <String>]
    [-JobGroup <Guid>]
    [-RunAsynchronously]
    [-PROTipID <Guid>]
    [-JobVariable <String>]
    [-OnBehalfOfUser <String>]
    [-OnBehalfOfUserRole <UserRole>]
    [<CommonParameters>]

说明

Move-SCVirtualMachine cmdlet 将存储在 Virtual Machine Manager (VMM) 库中或部署在主机上的虚拟机移动到主机上的新位置。

在 System Center 2019 及更高版本中,可以利用Windows Server 2016中包含的新迁移功能。 这些功能包括在两台独立计算机之间实时迁移虚拟机,以及独立计算机与群集节点之间的实时迁移。 此外,还支持多个并发实时迁移。 有关如何在 System Center 中迁移虚拟机的详细信息,请参阅 TechNet 库中 () 迁移 VMMhttps://technet.microsoft.com/en-us/library/mt710321(v=sc.16).aspxhttps://technet.microsoft.com/en-us/library/mt710321(v=sc.16).aspx 中的虚拟机和存储。

如果将部署在运行 Windows Server 2008 R2 的主机上的虚拟机移动到运行 Windows Server 2016 的主机,则无法将该虚拟机移回运行 Windows Server 2008 R2 的主机。

VMM 包括存储迁移功能,使你可以将正在运行的虚拟机的一个或多个虚拟硬盘移动到其他位置。 可以使用当前 cmdlet 和 Move-SCVirtualHardDisk cmdlet 将基于 Windows 的虚拟硬盘 (.vhd) 文件和基于 VMware 的虚拟硬盘 (.vmdk) 文件移动到其他主机上的位置。 还可以使用 Move-SCVirtualHardDisk cmdlet 将 .vhd 文件或 .vmdk 文件从同一主机上的一个位置移到另一个位置。

若要从主机移动虚拟机并将其存储在库中,必须使用 Save-SCVirtualMachine cmdlet。

VMM 可以使用以下任一传输方法,按照 VMM 尝试使用它们的顺序列出:

  • Hyper-V 实时迁移。 如果虚拟机正在运行且部署在 Windows Server 2008 R2 或Windows Server 2016主机群集节点的 Hyper-V 主机上,则默认情况下,VMM 使用 Hyper-V 实时迁移将虚拟机移动到群集中的另一个节点,而不会中断任何服务。 移动正在运行的虚拟机不会将其与网络断开连接。 虚拟机保留其高可用性属性。 无需指定路径。 可以同时启动多个虚拟机的实时迁移。
  • Windows Server 2008 群集迁移。 System Center 继续支持 Windows 2008 群集迁移,有时也称为快速迁移。 群集迁移在主机群集的 Hyper-V 节点上移动正在运行的虚拟机。 它还允许移动处于停止或保存状态且部署到群集中另一个节点的虚拟机。 如果虚拟机部署在以下任一节点上,则可以使用群集迁移来移动处于停止或保存状态的虚拟机:

---- Windows Server 2008 群集中的 A 节点---- Windows Server 2008 R2 群集中的一个节点

无需指定路径。 Windows Server 2008 群集迁移在迁移期间将虚拟机置于已保存状态。 此操作会导致该虚拟机的任何用户暂时失去服务。

  • VMware 实时迁移。 如果部署在 VMware ESX 主机上的虚拟机使用共享存储,VMM 可以使用 VMware 实时迁移功能将虚拟机移动到新主机。 此功能称为 VMware VMotion。 无需指定路径。 仅当两个 ESX 主机位于 vCenter Server 上的同一数据中心容器中时,当前 cmdlet 才能使用 VMware VMotion 将虚拟机从一台 ESX 主机移到另一台 ESX 主机。
  • Citrix XenServer XenMotion。 如果部署在 Citrix XenServer 主机上的虚拟机使用共享存储,并且是同一资源池的一部分,则 VMM 可以使用 XenServer 实时迁移功能将虚拟机移到其他 XenServer 主机。 实时迁移功能称为 Citrix XenMotion。
  • SAN 迁移 (光纤通道、iSCSI 或 NPIV) 。 如果虚拟机位于连接到 SAN 的主机上,而虚拟机位于 SAN LUN 上,则如果该主机有权访问同一 SAN,则 VMM 可以将该虚拟机移到另一台主机。 在 SAN 传输中,目标 LUN 从源主机重定向到目标主机。 此迁移不会移动文件。 SAN 传输比通过局域网 (LAN) 将虚拟机文件从一台主机移动到另一台主机快得多。 VMM 支持虚拟机的 SAN 迁移进出群集。 必须指定路径。 如果主机总线适配器 (HBA) 支持 NPIV,则 VMM 可以使用 NPIV SAN 传输。
  • 网络迁移。 如果没有更快的方法可用,VMM 使用网络传输通过连接两个主机的 LAN 将虚拟机文件从一台主机移动到另一台主机。 即使 SAN 传输类型可用,也可以决定使用此传输类型。 必须指定路径。

当有多个传输类型可用时,此 cmdlet 会自动使用最快的可用传输类型来移动虚拟机。 如果某个方法不适合或不适用于要移动的虚拟机,VMM 会尝试使用列表中的下一种方法。 如果要强制使用网络传输,请指定 UseLAN 参数。

示例

示例 1:将虚拟机从库移动到主机

PS C:\> $VM = Get-SCVirtualMachine | Where-Object { $_.Name -Eq "VM01" -And $_.LibraryServer -Eq "LibServer01.Contoso.com" }
PS C:\> $VMHost = Get-SCVMHost -ComputerName "VMHost01.Contoso.com"
PS C:\> Move-SCVirtualMachine -VMHost $VMHost -VM $VM -Path "D:\VirtualMachinePath"

第一个命令获取名为 VM01 的虚拟机对象,然后将该对象存储在 $VM 变量中。 在此示例中,虚拟机存储在名为 LibServer01 的库服务器上的 VMM 库中。 此示例假定当前只有一个名为 VM01 的虚拟机存储在 LibServer01 上。

第二个命令获取名为 VMHost01 的主机对象,然后将该对象存储在 $VMHost 变量中。

最后一个命令将虚拟机从库中的当前位置移动到存储在 $VMHost 中的主机上的位置 D:\VirtualMachinePath。 该命令自动使用最快的可用传输类型。 命令完成后,它将返回有关已移动虚拟机的信息。

示例 2:以异步方式将虚拟机从库移动到主机

PS C:\> $VM = Get-SCVirtualMachine | Where-Object { $_.Name -Eq "VM01" -And $_.LibraryServer -Eq "LibServer01.Contoso.com" }
PS C:\> $VMHost = Get-SCVMHost -ComputerName "VMHost02.Contoso.com"
PS C:\> Move-SCVirtualMachine -VMHost $VMHost -VM $VM -Path "D:\VirtualMachinePath" -RunAsynchronously -JobVariable "MoveVMJob"
PS C:\> $MoveVMJob

此示例中的前两个命令与第一个示例中的命令相同,虚拟机主机的名称除外。

第三个命令将虚拟机从当前位置移动到 VMHost02 上的 D:\VirtualMachinePath。 命令指定 RunAsynchronously 参数,以便立即将控制权返回到命令 shell。 命令指定用于跟踪作业进度的 JobVariable 参数。 命令将作业进度的记录存储在 $MoveVMJob 变量中。 对于 JobVariable 参数,不指定用于创建变量的美元符号 ($) 。

最后一个命令显示$MoveVMJob的内容,其中包括移动作业的说明、其状态、进度和其他信息。

示例 3:通过强制 LAN 传输将虚拟机从库移动到主机

PS C:\> $VM = Get-SCVirtualMachine | Where-Object { $_.Name -Eq "VM03" -And $_.LibraryServer -Eq "LibServer01.Contoso.com" }
PS C:\> $VMHost = Get-SCVMHost -ComputerName "VMHost03.Contoso.com"
PS C:\> Move-SCVirtualMachine -VMHost $VMHost -VM $VM -Path "D:\VirtualMachinePath" -UseLAN

第一个命令获取库服务器 LibServer01 上名为 VM03 的虚拟机对象,然后将该对象存储在 $VM 变量中。

第二个命令获取名为 VMHost03 的主机对象,然后将该对象存储在 $VMHost 变量中。

最后一个命令将虚拟机 VM03 从库中的当前位置移动到 VMHost03 上的 D:\VirtualMachinePath。 命令指定 UseLAN 参数,以指定传输使用网络传输,即使有更快的传输机制可用也是如此。

示例 4:使用 VMware VMotion 在主机之间移动虚拟机

PS C:\> $VM = Get-SCVirtualMachine -Name "VM04" | Where-Object {$_.VMHost.Name -Eq "ESXHost01"}
PS C:\> $VMHost = Get-SCVMHost | Where-Object {$_.Name -Eq "ESXHost02"}
PS C:\> Move-SCVirtualMachine -VM $VM -VMHost $VMHost -Path "[Storage2]"

第一个命令获取 ESXHost01 上名为 VM04 的虚拟机对象,然后将该对象存储在 $VM 变量中。

第二个命令获取名为 ESXHost02 的 ESX 主机对象,然后将该对象存储在 $VMHost 变量中。

最后一个命令使用 VMware VMotion 将虚拟机从其当前 ESX 主机移动到其他 ESX 主机。

注意:仅当两个 ESX 服务器位于 vCenter 服务器上的同一数据中心容器中时, Move-SCVirtualMachine cmdlet 才能使用 VMware VMotion 功能将虚拟机从一台 ESX 主机移到另一台 ESX 主机。

示例 5:使用 Hyper-V 实时迁移在主机群集中的节点之间移动高度可用的虚拟机

PS C:\> $VM = Get-SCVirtualMachine -Name "HAVM05" | Where-Object {$_.VMHost.Name -Eq "VMHVHostNode05A.Contoso.com"}
PS C:\> $VMHost = Get-SCVMHost | Where-Object {$_.Name -Eq "VMHVHostNode05B.Contoso.com"}
PS C:\> Move-SCVirtualMachine -VM $VM -VMHost $VMHost -Path "D:\VMs\"

第一个命令获取 VMHVHostNode05A 上名为 HAVM05 的虚拟机对象,然后将该对象存储在 $VM 变量中。 在此示例中,HAVM05 是一个高度可用的虚拟机。 VMHVHostNode05A 和 VMHVHostNode05B 是 Hyper-V 主机群集中的节点。

第二个命令获取名为 VMHVHostNode05B 的主机对象,然后将该对象存储在 $VMHost 变量中。

最后一个命令使用实时迁移将虚拟机从 VMHVHostNode05A 移动到 VMHVHostNode05B。

示例 6:将 Hyper-V 主机上正在运行的虚拟机移动到同一主机上的新位置

PS C:\> $MoveVhdPath = "E:\VHDs"
PS C:\> $VM = Get-SCVirtualMachine "VM06"
PS C:\> $VMHost = Get-SCVMHost "VMHost06"
PS C:\> $HostPath = "E:\VirtualMachinePath"
PS C:\> $JobGroupID = [System.Guid]::NewGuid().ToString()
PS C:\> Move-SCVirtualHardDisk -IDE -Bus 1 -Lun 1 -Path $MoveVhdPath -JobGroup $JobGroupID
PS C:\> Move-SCVirtualMachine -VM $VM -VMHost $VMHost -Path $HostPath -JobGroup $JobGroupID

第一个命令将字符串 E:\VHD 存储在 $MoveVhdPath 中。 这是要移动虚拟机虚拟硬盘的路径。

第二个命令获取名为 VM06 的虚拟机对象,然后将该对象存储为$VM变量。

第三个命令获取名为 VMHost06 的主机对象,然后将该对象存储在 $VMHost 变量中。 在此示例中,VMHost06 是 Hyper-V 主机。

第四个命令将字符串 E:\VirtualMachinePath 存储在 $HostPath 变量中。 这是要移动 VM06 的路径。

第五个命令创建新的 GUID 字符串,并将其存储在 $JobGroupID 变量中。 此 GUID 是一个用作标识符的作业组 ID,用于将包含该标识符的后续命令分到单一作业组中。

第六个命令设置存储在 $MoveVhdPath 中的值的虚拟硬盘路径,并将虚拟硬盘连接到虚拟机上的虚拟 IDE 控制器上的总线 1 和 LUN 1。 此命令指定 JobGroup 参数,使其在 Move-SCVirtualMachine 触发作业组列表中任何命令的运行之前不会实际运行。

最后一个命令将 VM06 移动到同一主机上的 E:\VirtualMachinePath。 cmdlet 作为$JobGroupID的一部分运行 Move-SCVirtualHardDisk。 该命令将虚拟机的虚拟硬盘移动到 E:\VHD。

参数

-BlockLiveMigrationIfHostBusy

指示如果由于源主机或目标主机已参与另一个实时迁移而迁移失败,则 cmdlet 会阻止重试 Hyper-V 实时迁移。

Type:SwitchParameter
Aliases:BlockLMIfHostBusy
Position:Named
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-DiscardSavedState

指示此 cmdlet 删除与虚拟机或服务关联的已保存状态。

Type:SwitchParameter
Position:Named
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-HighlyAvailable

指定是否将虚拟机放置在属于主机群集的 Hyper-V 主机上。

Type:Boolean
Position:Named
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-JobGroup

指定一系列命令的标识符,这些命令在包含相同作业组标识符的最终命令运行之前作为集运行。

Type:Guid
Position:Named
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-JobVariable

指定作业进度变量的名称。

Type:String
Position:Named
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-OnBehalfOfUser

指定用户名。 此 cmdlet 代表此参数指定的用户运行。

Type:String
Position:Named
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-OnBehalfOfUserRole

指定用户角色。 若要获取用户角色,请使用 Get-SCUserRole cmdlet。 此 cmdlet 代表此参数指定的用户角色运行。

Type:UserRole
Position:Named
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-Path

指定移动的虚拟机的路径。

Type:String
Position:Named
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-PROTipID

指定触发此操作的“性能和资源优化”提示 (PRO 提示) 的 ID。 此参数允许你审核 PRO 提示。

Type:Guid
Position:Named
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-ReplicationGroup

指定复制组。

Type:ReplicationGroup
Position:Named
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-RunAsynchronously

指示作业以异步方式运行,以便控件立即返回到命令行界面。

Type:SwitchParameter
Position:Named
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-StartVMOnTarget

指定此 cmdlet 将虚拟机移动到其目标主机后立即启动。

Type:SwitchParameter
Position:Named
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-UseCluster

指示此 cmdlet 使用群集迁移将处于已保存状态的虚拟机传输到主机,即使群集支持 Hyper-V 实时迁移也是如此。

Type:SwitchParameter
Position:Named
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-UseDiffDiskOptimization

指示 cmdlet 使用差异磁盘优化。

Type:SwitchParameter
Position:Named
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-UseLAN

指示此 cmdlet 使用 LAN 传输,即使有更快的传输机制可用也是如此。

Type:SwitchParameter
Position:Named
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-VM

指定一个虚拟机对象。

Type:VM
Position:0
Default value:None
Required:True
Accept pipeline input:True
Accept wildcard characters:False

-VMHost

指定一个虚拟主机对象。 VMM 支持 Hyper-V 主机、VMware ESX 主机和 Citrix XenServer 主机。

有关每种主机类型的详细信息,请参阅 Add-SCVMHost cmdlet。

Type:Host
Position:Named
Default value:None
Required:False
Accept pipeline input:True
Accept wildcard characters:False

输出

VirtualMachine

此 cmdlet 返回 VirtualMachine 对象。