如何执行Hyper-V存储迁移
新服务器?新SAN?尝试超融合?升级到Hyper-V 2016?任何数量的条件都可能提示您将Hyper-V虚拟机的存储移动到另一个位置。让我们看一下实现这种移动的技术。
Hyper-V迁移选项概述
Hyper-V提供了许多迁移选项。每个都有自己的特色。不幸的是,我们社区中的人们经常使用不正确且令人困惑的术语来弄乱事情。因此,让我们简要介绍一下Hyper-V提供的迁移类型:
这不是所谓的存储实时迁移
我一直将此操作称为“存储实时迁移”。我知道许多其他作者称其为“存储实时迁移”。但是,Microsoft并不称其为“存储实时迁移”。他们只是称其为“存储迁移”。在Microsoft的任何产品中,我能找到的最接近“存储实时迁移”的东西是Benjamin Armstrong于2012年录制的TechEd。该演示文稿的标题包括“ Live Storage Migration”一词,但我无法确定“ Live”是否只是修改了“ Storage Migration”,还是Ben将其用作技术名称的一部分。我想我可以听整个半小时的演讲,但是我很懒。如果有人想听和汇报,我相信这是一个很棒的演讲。
无论如何,这有关系吗?我真的不这么认为。我当然不会纠正使用该短语的任何人。但是,虚拟机不一定需要处于活动状态。我们使用相同的工具和命令来移动虚拟机的存储,无论它是在线还是离线。因此,“存储迁移”将永远是一个正确的术语。“存储实时迁移”,不是那么多。但是,对于关闭的虚拟机,我们使用术语“无共享实时迁移”,因此我们不能要求任何一致性。
Hyper-V存储迁移可以带来什么?
当我们谈论虚拟机存储时,大多数人会想到来宾操作系统存储数据的位置。那当然包括虚拟机存储的物理量。但是,它只是构成虚拟机的多个组件列表上的一个要点。
您可以独立地移动以下任何虚拟机项目:
我们通常将所有这些东西放在一起。不过,Hyper-V并不需要。同样,我们可以在同一操作中移动所有这些东西,但是将它们分发到不同的目的地。
Hyper-V存储迁移不能改变什么?
在存储方面,我们可以移动与虚拟机相关的所有内容。但是,我们无法通过存储迁移来移动VM的活动状态。在我们称为“无共享实时迁移”的操作中,存储迁移通常与实时迁移合作。为避免沉迷于实践而不是实际的实施细节,只需了解一件事:选择移动虚拟机存储的选项时,您无需更改拥有和运行虚拟机的Hyper-V主机。
更重要的是,您不能使用任何基于Microsoft工具的技术来将差异磁盘与其父磁盘分开。因此,如果您具有AVHDX(由检查点机制创建的差异磁盘),并且想要将其从源VHDX移开,则Storage Migration将不会执行此操作。如果您指示存储迁移来移动AVHDX,则整个磁盘链将顺其自然。
用于Hyper-V存储迁移
在所有迁移类型中,存储迁移具有最多的应用程序和特殊条件。例如,存储迁移是唯一不总是要求域成员身份的Hyper-V迁移类型 。的确,对于那些坚持将Hyper-V主机置于不安全的工作组模式的人们来说,域成员资格规则的一个例外不会很令人满意,但是我并不是想取悦那些人。我在这里谈论存储迁移的细微差别。
本地搬迁
让我们从最简单的用法开始:本地VM存储的重定位。此类别中的一些情况:
网络重定位
拥有如此众多的网络存储方法,几乎可以肯定,我们都需要在某个时候在整个VHDX之间移动VHDX。一些情况:
“本地重定位”下列出的大多数原因也适用于网络重定位。
集群重定位
我们不能始终从一开始就完美地构建集群。在大多数情况下,群集的重定位需求列表看起来像上面的本地和网络列表。其他一些:
在讨论集群时,原因比工具重要。您不能像在非群集VM中那样使用相同的工具和技术在Hyper-V下移动受故障转移群集保护的虚拟机。
关闭虚拟机将对存储迁移产生影响
您可以执行一个非常简单的实验:在虚拟机开启时对其执行存储迁移,然后将其关闭然后再迁移回去。虚拟机关闭时,其移动速度将更快。可以用一个词来解释此行为:同步。
关闭虚拟机后,存储迁移实质上就是受监视的文件副本。组成部分将位从源移动到目标的能力决定了移动的步伐。打开虚拟机后,所有规则都会更改。迁移受到以下限制:
即使来宾操作在移动过程中没有太多活动,也不能将该条件视为常量。换句话说,Hyper-V需要准备好随时开始要求大量I / O。
因此,正在运行的虚拟机的存储迁移将始终比处于关闭或保存状态的虚拟机的存储迁移花费更长的时间。您可以选择方便的在线迁移或离线的迁移速度。
注意:通常,您可以在存储迁移过程中更改虚拟机的电源状态。如果跨主机移动,则工作的可能性较小。
如何使用PowerShell执行Hyper-V存储迁移
使用PowerShell进行存储迁移的好处是:它适用于所有存储迁移类型。使用PowerShell进行存储迁移的坏事是:很难正确完成所有工作。
要使用的主要cmdlet是Move-VMStorage。如果要执行“无共享共享”实时迁移,则也可以使用Move-VM。与存储有关的Move-VM部分与Move-VMStorage匹配。Move-VM具有与本文主题无关的用途,要求和限制,因此在此不介绍Move-VM。
PowerShell中的基本存储迁移
让我们从一个简单的开始。当您只希望将所有VM文件放在一个位置时,请使用此选项:
1 |
Move-VMStorage -Name testvm -DestinationStoragePath C:\LocalVMs\ |
这将移动名为testvm的虚拟机,以便其所有组件都位于C:\ LocalVMs文件夹下。这意味着:
PowerShell中的复杂存储迁移
对于更复杂的移动方案,将不使用 DestinationStoragePath参数。您将使用一个或多个单个组件参数。从以下选项中选择:
这些项目的一些注意事项:
以下内容将移动除 VHD 以外的所有组件,我将在下一部分中介绍:
1 |
Move-VMStorage -Name testvm -VirtualMachinePath C:\LocalVMs\testvm\ -SnapshotFilePath C:\LocalVMs\testvm\ -SmartPagingFilePath C:\LocalVMs\testvm\ |
Move-VMStorage的VHD哈希表数组
三个 …FilePath参数很简单:只需指定路径即可。该 虚拟硬盘参数是强硬。它是一个数组中的一个或多个哈希表。
首先,哈希表。哈希表是一个看起来像数组的自定义对象,但是每个条目都有一个唯一的名称。Vhds期望的哈希表 具有 SourceFilePath条目和 DestinationFilePath条目。每个文件都必须具有完整的文件资格。哈希表包含如下内容: @ {}。条目的名称及其值以 =开头。条目之间用;分隔 ;因此,如果要将名为 svtest.vhdx的VHDX从\\ 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管理器只能用于非群集虚拟机。它使用向导格式。要使用它移动虚拟机的存储,请执行以下操作:
如果您选择将所有内容移动到一个位置,向导将显示以下简单页面:
如果选择 将虚拟机的数据移动到其他位置的选项,则首先将看到以下屏幕:
对于您检查的每个项目,将为您提供一个单独的屏幕,您可以在其中指示该项目的所需位置。该向导使用与“仅硬盘”选项相同的屏幕来显示这些项目。接下来,我将显示其屏幕截图。
如果选择“ 仅移动虚拟机的虚拟硬盘”,则会显示一系列屏幕,指示您将文件移动到何处。这些是用于先前选择中各个组件的相同屏幕:
做出选择之后,将显示一个摘要屏幕,您可以在其中单击 完成以执行移动:
如何使用故障转移群集管理器执行Hyper-V存储迁移
故障转移群集管理器使用光滑的单屏幕界面移动群集虚拟机的存储。要访问它,只需右键单击虚拟机,将鼠标悬停在 Move上,然后单击 Virtual Machine Storage。您会看到以下屏幕:
如果您只想将整个内容移动到显示的“群集共享卷”之一,只需将其拖放到左下角“ 群集存储”标题中的CSV上即可 。您可以拖放单个项目或整个VM。该 目标文件夹的路径将进行相应的填充。
正如你可以看到我的,我把所有的组件,除了在SMB共享上的VHD。我想移动的VHD是与休息。要显示共享,请单击 添加共享按钮。你会得到这个对话框:
共享将填充在左下方CSV下方。现在,我可以拖动和文件拖放到共享。查看差异:
按照您喜欢的方式打开对话框后,点击 开始。