如何执行Hyper-V存储迁移

如何执行Hyper-V存储迁移

新服务器?新SAN?尝试超融合?升级到Hyper-V 2016?任何数量的条件都可能提示您将Hyper-V虚拟机的存储移动到另一个位置。让我们看一下实现这种移动的技术。

Hyper-V迁移选项概述

Hyper-V提供了许多迁移选项。每个都有自己的特色。不幸的是,我们社区中的人们经常使用不正确且令人困惑的术语来弄乱事情。因此,让我们简要介绍一下Hyper-V提供的迁移类型:

  • 快速迁移:基于集群的虚拟机迁移,包括将虚拟机置于保存状态,将所有权转移到同一集群中的另一个节点,以及恢复虚拟机。快速迁移并不涉及移动我们大多数人认为存储的内容。
  • 实时迁移:基于群集的虚拟机迁移,涉及将正在运行的虚拟机的活动状态转移到同一群集中的另一个节点。实时迁移不涉及移动我们大多数人认为存储的任何内容。
  • 存储迁移:利用Hyper-V管理服务来重新定位属于虚拟机的任何基于文件的组件的任何技术。本文重点介绍这种迁移类型,因此在此列表中,我不会扩展任何这些想法。
  • 无共享实时迁移:两台主机之间的Hyper-V迁移技术,不涉及集群。它可能包括也可能不包括存储迁移。虚拟机可能正在运行,也可能未运行。但是,此迁移类型始终包括从一个主机到另一个主机的所有权转移。

这不是所谓的存储实时迁移

我一直将此操作称为存储实时迁移。我知道许多其他作者称其为存储实时迁移。但是,Microsoft并不称其为存储实时迁移。他们只是称其为存储迁移。在Microsoft的任何产品中,我能找到的最接近存储实时迁移的东西是Benjamin Armstrong2012年录制的TechEd。该演示文稿的标题包括“ Live Storage Migration”一词,但我无法确定“ Live”是否只是修改了“ Storage Migration”,还是Ben将其用作技术名称的一部分。我想我可以听整个半小时的演讲,但是我很懒。如果有人想听和汇报,我相信这是一个很棒的演讲。

无论如何,这有关系吗?我真的不这么认为。我当然不会纠正使用该短语的任何人。但是,虚拟机不一定需要处于活动状态。我们使用相同的工具和命令来移动虚拟机的存储,无论它是在线还是离线。因此,存储迁移将永远是一个正确的术语。存储实时迁移,不是那么多。但是,对于关闭的虚拟机,我们使用术语无共享实时迁移,因此我们不能要求任何一致性。

Hyper-V存储迁移可以带来什么?

当我们谈论虚拟机存储时,大多数人会想到来宾操作系统存储数据的位置。那当然包括虚拟机存储的物理量。但是,它只是构成虚拟机的多个组件列表上的一个要点。

您可以独立地移动以下任何虚拟机项目:

  • 虚拟机的核心文件(以xml.vmcx.bin.vsv等配置)
  • 虚拟机的检查点(与前面的项目符号点基本相同,但用于检查点而不是活动虚拟机)
  • 虚拟机的第二级页面文件位置。我尚未测试过是否会移动具有活动二级页面文件的VM,但是我没有理由相信它不会
  • 连接到虚拟机的虚拟硬盘
  • 附加到虚拟机的ISO映像

我们通常将所有这些东西放在一起。不过,Hyper-V并不需要。同样,我们可以在同一操作中移动所有这些东西,但是将它们分发到不同的目的地。

Hyper-V存储迁移不能改变什么?

在存储方面,我们可以移动与虚拟机相关的所有内容。但是,我们无法通过存储迁移来移动VM的活动状态。在我们称为无共享实时迁移的操作中,存储迁移通常与实时迁移合作。为避免沉迷于实践而不是实际的实施细节,只需了解一件事:选择移动虚拟机存储的选项时,您无需更改拥有和运行虚拟机的Hyper-V主机。

更重要的是,您不能使用任何基于Microsoft工具的技术来将差异磁盘与其父磁盘分开。因此,如果您具有AVHDX(由检查点机制创建的差异磁盘),并且想要将其从源VHDX移开,则Storage Migration将不会执行此操作。如果您指示存储迁移来移动AVHDX,则整个磁盘链将顺其自然。

用于Hyper-V存储迁移

在所有迁移类型中,存储迁移具有最多的应用程序和特殊条件。例如,存储迁移是唯一总是要求域成员身份的Hyper-V迁移类型  。的确,对于那些坚持将Hyper-V主机置于不安全的工作组模式的人们来说,域成员资格规则的一个例外不会很令人满意,但是我并不是想取悦那些人。我在这里谈论存储迁移的细微差别。

本地搬迁

让我们从最简单的用法开始:本地VM存储的重定位。此类别中的一些情况:

  • 您将虚拟机留在默认的“ C\ ProgramData \ Microsoft \ Windows \ Hyper-V”/“ C\ Users \ Public \ Documents \ Hyper-V \ Virtual Hard Disks”位置,但您不喜欢它
  • 您将新的内部存储添加为单独的卷,并希望重新分配VM
  • 您具有存储速度层,但没有活动的管理层
  • 您不喜欢虚拟机文件的布局方式
  • 您要整理VM存储空间的碎片。这是浪费时间,但是可以。

网络重定位

拥有如此众多的网络存储方法,几乎​​可以肯定,我们都需要在某个时候在整个VHDX之间移动VHDX。一些情况:

  • 您正在从本地存储迁移到网络存储
  • 您要更换SANNAS,并且需要重新定位虚拟机
  • 您已经扩展了网络存储,并希望重新分发VM

本地重定位下列出的大多数原因也适用于网络重定位。

集群重定位

我们不能始终从一开始就完美地构建集群。在大多数情况下,群集的重定位需求列表看起来像上面的本地和网络列表。其他一些:

  • 您的群集具有要扩展到的新的群集共享卷
  • 现有群集共享卷的数据分布不平衡。请记住,从CSV所有者节点访问数据比从非所有者节点访问数据要快一些

在讨论集群时,原因比工具重要。您不能像在非群集VM中那样使用相同的工具和技术在Hyper-V下移动受故障转移群集保护的虚拟机。

关闭虚拟机将对存储迁移产生影响

您可以执行一个非常简单的实验:在虚拟机开启时对其执行存储迁移,然后将其关闭然后再迁移回去。虚拟机关闭时,其移动速度将更快。可以用一个词来解释此行为:同步。

关闭虚拟机后,存储迁移实质上就是受监视的文件副本。组成部分将位从源移动到目标的能力决定了移动的步伐。打开虚拟机后,所有规则都会更改。迁移受到以下限制:

  • 虚拟机的操作系统必须保持响应状态
  • 必须正确捕获写入
  • 读取必须从最合适的来源进行

即使来宾操作在移动过程中没有太多活动,也不能将该条件视为常量。换句话说,Hyper-V需要准备好随时开始要求大量I / O

因此,正在运行的虚拟机的存储迁移将始终比处于关闭或保存状态的虚拟机的存储迁移花费更长的时间。您可以选择方便的在线迁移或离线的迁移速度。

注意:通常,您可以在存储迁移过程中更改虚拟机的电源状态。如果跨主机移动,则工作的可能性较小。

如何使用PowerShell执行Hyper-V存储迁移

使用PowerShell进行存储迁移的好处是:它适用于所有存储迁移类型。使用PowerShell进行存储迁移的坏事是:很难正确完成所有工作。

要使用的主要cmdletMove-VMStorage。如果要执行无共享共享实时迁移,则也可以使用Move-VM。与存储有关的Move-VM部分与Move-VMStorage匹配。Move-VM具有与本文主题无关的用途,要求和限制,因此在此不介绍Move-VM

PowerShell中的基本存储迁移

让我们从一个简单的开始。当您只希望将所有VM文件放在一个位置时,请使用此选项:

 

1

Move-VMStorage -Name testvm -DestinationStoragePath C:\LocalVMs\

这将移动名为testvm的虚拟机,以便其所有组件都位于C\ LocalVMs文件夹下。这意味着:

  • 配置文件将放置在C\ LocalVMs \ Virtual Machines
  • 检查点文件将放置在C\ LocalVMs \ Snapshots
  • VHDX将放置在C\ LocalVMs \ Virtual Hard Disks
  • 根据您的版本,  如果尚不存在UndoLog配置 文件夹,则会创建该文件夹。该文件夹旨在包含Hyper-V副本文件。甚至可以为未被复制的虚拟机创建它。

PowerShell中的复杂存储迁移

对于更复杂的移动方案,将不使用  DestinationStoragePath参数。您将使用一个或多个单个组件参数。从以下选项中选择:

  • VirtualMachinePath:放置VM的配置文件的位置。
  • SnapshotFilePath:将VM的检查点文件放在何处(再次,不是AVHDX!)
  • SmartPagingFilePath:将VM的智能分页文件放在何处
  • Vhds:散列表的数组,指示单个VHD / X文件的放置位置。

这些项目的一些注意事项:

  • 你是  不是需要使用所有这些参数。如果未指定参数,则其相关组件将保留。意思是,它根本不会动弹。
  • 如果您尝试使用它来摆脱那些自动创建的“  虚拟机  快照文件夹,则无法使用。它们将始终创建为您键入的任何子文件夹。
  • 它不会自动创建“  虚拟硬盘文件夹。
  • 如果您好奇是否需要指定那些自动创建的子文件夹,答案是:否。Move-VMStorage将始终为您创建它们(除非它们已经存在)。
  • VHD哈希表是整个过程中最难的部分。我通常是PowerShell优先人员,但是即使我也倾向于使用GUI进行存储迁移。

以下内容将移动 VHD 以外的所有组件,我将在下一部分中介绍:

 

1

Move-VMStorage -Name testvm -VirtualMachinePath C:\LocalVMs\testvm\ -SnapshotFilePath C:\LocalVMs\testvm\ -SmartPagingFilePath C:\LocalVMs\testvm\

Move-VMStorageVHD哈希表数组

三个  …FilePath参数很简单:只需指定路径即可。该  虚拟硬盘参数是强硬。它是一个数组中的一个或多个哈希表。

首先,哈希表。哈希表是一个看起来像数组的自定义对象,但是每个条目都有一个唯一的名称。Vhds期望的哈希表  具有  SourceFilePath条目和  DestinationFilePath条目。每个文件都必须具有完整的文件资格。哈希表包含如下内容:  @ {}。条目的名称及其值以  =开头。条目之间用分隔  因此,如果要将名为  svtest.vhdxVHDX\\ svstore \ VMs移至C\ LocalVMs \ testvm,则可以使用以下哈希表:

 

1

@{'SourceFilePath' = '\\svstore\VMs\vhdx'; 'DestinationFilePath' = 'C:\LocalVMs\svtest.vhdx'}

读到它,您可能会(逻辑上很清楚地)问:我在移动VHDX文件时可以更改它的名称吗?答案:不,您不能。那么,为什么需要输入目标文件的全名呢?我不知道!

接下来,数组。数组以@()为界  。其条目以逗号分隔。因此,要移动两个VHDX,您需要执行以下操作:

 

1

2

3

4

@(

   @{'SourceFilePath' = '\\svstore\VMs\testvm.vhdx'; 'DestinationFilePath' = 'C:\LocalVMs\testvm.vhdx'},

   @{'SourceFilePath' = '\\svstore\VMs\testvm2.vhdx'; 'DestinationFilePath' = 'C:\LocalVMs\testvm2.vhdx'}

)

为了清晰起见,我将其分为多行。您可以全部输入一行。注意在哪里使用括号,在哪里使用花括号。

提示:要移动单个VHDX文件,则无需执行整个数组标记。您可以将第一个示例与 Vhds一起 使用

带有Vhds的实用Move-VMStorage示例

如果您正在查看所有内容,并且想知道为什么要使用PowerShell进行此类操作,那么我有一个完美的答案:脚本。不要用手做。使用它一次移动许多虚拟机。如果要查看实际的Vhds参数示例  Get-Help示例将显示一个示例。我想到了一个更实用的脚本。

以下操作将移动主机上的所有VM。它们的所有配置,检查点和第二级页面文件都将放置在名为“ \\ vmstore \ slowstorage”的共享上。他们所有的VHDX都将放置在名为“ \\ vmstore \ faststorage”的共享上。我们将让PowerShell处理源路径和文件名。

 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

Get-VM | foreach {

         $VHDs = @()

         Get-VMHardDiskDrive -VM $_ | foreach {

                   $ThisVhd = @{}

                   $ThisVhd.Add('SourceFilePath', $_.Path)

                   $ThisVhd.Add('DestinationFilePath', ('\\vmstore\faststorage\{0}' -f [System.IO.Path]::GetFileName($_.Path)))

                   $VHDs += $ThisVhd

         }

         $MoveVMStorageParams = @{

                   'VM' = $_;

                   'VirtualMachinePath' = '\\vmstore\slowstorage';

                   'SnapshotFilePath' = '\\vmstore\slowstorage';

                   'SmartPagingFilePath' = '\\vmstore\slowstorage'

         }

         if($VHDs.Count)

         {

                   $MoveVMStorageParams.Add('Vhds', $VHDs)

         }

         Move-VMStorage @MoveVMStorageParams

}

我出于参数使用splatting有两个原因:1,易读性。2,处理没有任何虚拟硬盘的虚拟机。

如何使用Hyper-V Manager执行Hyper-V存储迁移

Hyper-V管理器只能用于非群集虚拟机。它使用向导格式。要使用它移动虚拟机的存储,请执行以下操作:

  1. 右键单击虚拟机,然后单击  移动
  2. 在介绍性页面上单击  下一步
  3. 将选择更改为“  移动虚拟机的存储(如果您移动了VM的所有权,则相同的存储选项将可用,但这不是本文的一部分)如何执行Hyper-V存储迁移_第1张图片
  4. 选择如何执行移动。您可以将所有内容移动到同一位置,也可以将所有内容移动到不同的位置,也可以仅移动虚拟硬盘。如何执行Hyper-V存储迁移_第2张图片
  5. 您接下来看到的屏幕取决于您选择的内容。我们将覆盖每个分支。

如果您选择将所有内容移动到一个位置,向导将显示以下简单页面:

如何执行Hyper-V存储迁移_第3张图片

如果选择  将虚拟机的数据移动到其他位置的选项,则首先将看到以下屏幕:

如何执行Hyper-V存储迁移_第4张图片

对于您检查的每个项目,将为您提供一个单独的屏幕,您可以在其中指示该项目的所需位置。该向导使用与仅硬盘选项相同的屏幕来显示这些项目。接下来,我将显示其屏幕截图。

如果选择“  仅移动虚拟机的虚拟硬盘,则会显示一系列屏幕,指示您将文件移动到何处。这些是用于先前选择中各个组件的相同屏幕:

如何执行Hyper-V存储迁移_第5张图片

做出选择之后,将显示一个摘要屏幕,您可以在其中单击  完成以执行移动:

如何执行Hyper-V存储迁移_第6张图片

如何使用故障转移群集管理器执行Hyper-V存储迁移

故障转移群集管理器使用光滑的单屏幕界面移动群集虚拟机的存储。要访问它,只需右键单击虚拟机,将鼠标悬停在  Move,然后单击  Virtual Machine Storage。您会看到以下屏幕:

如何执行Hyper-V存储迁移_第7张图片

如果您只想将整个内容移动到显示的群集共享卷之一,只需将其拖放到左下角“ 群集存储标题中的CSV上即可  。您可以拖放单个项目或整个VM。该  目标文件夹的路径将进行相应的填充。

正如你可以看到我的,我把所有的组件,除了在SMB共享上的VHD。我想移动的VHD是与休息。要显示共享,请单击  添加共享按钮。你会得到这个对话框:

如何执行Hyper-V存储迁移_第8张图片

共享将填充在左下方CSV下方。现在,我可以拖动和文件拖放到共享。查看差异:

如何执行Hyper-V存储迁移_第9张图片

按照您喜欢的方式打开对话框后,点击  开始

 

你可能感兴趣的:(如何执行Hyper-V存储迁移)