你需要导出 Hyper-V 虚拟机并将其从一个主机转移到另一个主机吗?从您的开发工作站导出虚拟机到生产中的 Hyper-V 主机又如何呢?如果是这样,您来对地方了!
在这篇文章中,您将学习如何使用Hyper-V管理器和 PowerShell 导出和导入虚拟机。准备好了吗?让我们开始吧!
先决条件
本文将是一个教程。如果您计划一步一步地跟随,您将需要以下内容:
- PowerShell 7 或 Windows PowerShell 5.1 – 本教程将重点介绍 PowerShell 7,但命令将与 Windows PowerShell 5.1 兼容。
- A Windows Server with Hyper-V enabled – This tutorial is based on the insider preview released March 2021, but any Windows Server from 2012R2 onward will suffice.
- A virtual machine guest – This tutorial is using an Alpine Linux guest because it’s light on resources. You can use any guest Operating System you like.
- A local Windows user account in the local administrators group on the Hyper-V host.
导出 Hyper-V 虚拟机的步骤
如果您不喜欢命令行,或者只是想保存单个虚拟机到磁盘,Hyper-V 管理器是一个不错的选择。假设您在 Hyper-V 主机上并且有一个正在运行的虚拟机:
1. 在 Windows 搜索菜单中,键入“hyper”。Hyper-V 管理器控制台应该会出现。如果是这样,点击打开。
2. 找到要导出的虚拟机,右键单击它,然后单击导出。

3. 接下来,选择一个文件夹保存虚拟机和配置,然后点击导出。

您选择保存的位置应该有足够的存储空间来存放导出的虚拟机。这会有所不同。请记住,您可以为磁盘分配60 GB,但这并不意味着虚拟机磁盘已经增长到60 GB。
一旦 Hyper-V 开始导出过程,您将在 Hyper-V 管理器窗口中看到导出的状态。

4. 现在,请确认所有所需的文件都已经存在。您应该会看到三个子文件夹。这些子文件夹包含启动导出的虚拟机所需的所有文件;快照、虚拟硬盘和虚拟机。

- 快照文件夹包含虚拟机的快照信息。如果虚拟机没有快照,则该文件夹可能为空。在这个文件夹中,您会看到 VMCX、VMRS 和 VMGS 文件扩展名。 VMCX 二进制文件包含特定于您导出的虚拟机的配置信息。 VMRS 二进制文件包含虚拟机的运行时状态信息。如果没有这个文件,虚拟机将无法启动。最后还有 VMGS 文件。不确定这个文件是用来做什么的。如果您知道,请留下评论。
如果您之前有使用 Hyper-V 的经验,您可能已经注意到文件扩展名有些不同。从 Windows Server 2016 开始,Hyper-V 不再使用 XML 文件来存储配置信息,而是转向了二进制文件。 了解更多关于这些新扩展名的信息。
如果您的虚拟机有多个检查点,您将看到每个检查点的多个 VMCX、VMRS 和 VMGS 文件。

- 虚拟硬盘 文件夹包含所有虚拟机的硬盘映像文件或 *.vhdx。 AVHDX 或 自动虚拟硬盘 文件是用于虚拟机检查点的差异磁盘。如果您的虚拟机有多个检查点,您将看到多个 AVHDX 文件。

- 虚拟机 文件夹包含用于引导虚拟机的 VM 配置文件。与快照文件夹类似,您还将在这里看到 VMCX、VMRS 和 VMGS 二进制文件。

如果这三个文件夹都存在并包含文件,则导出成功。
使用 PowerShell 导出虚拟机
如果您喜欢使用命令行或需要导出多个虚拟机,使用 PowerShell 导出虚拟机也是一个很好的选择。要使用 PowerShell 导出 Hyper-V,使用 Export-VM
cmdlet。为此,假设您在 Hyper-V 主机上并且您的虚拟机是离线:
1. 打开 PowerShell 控制台。
2. 查询 Hyper-V 主机以获取您的虚拟机清单和要导出的虚拟机的名称。本教程将导出名为Alpine Linux 01
的虚拟机。

Export-VM
command3. 创建一个用于导出虚拟机的文件夹。本教程将虚拟机导出到C:\Export_VM。
4. 现在使用Export-VM
cmdlet导出虚拟机,提供虚拟机的名称作为Name
参数,保存路径作为Path
参数,以及PassThru
参数。
PassThru
参数是可选的,用于返回导出的虚拟机对象。否则,Export-VM
不会返回任何输出。

当虚拟机正在运行时,
Export-VM
不会自动保存内存。如果想要保存虚拟机中正在运行的内存内容,请使用-CaptureLiveState CaptureSavedState
参数与Export-VM
一起。 了解更多有关捕获内存的技术。
5. 现在从 Hyper-V 中移除虚拟机。别担心!你已经将其保存了!
使用 Hyper-V Manager 导入虚拟机
一旦你导出了虚拟机,灾难降临了,虚拟机不见了。别担心!你已经将其导出到磁盘上了。让我们把它找回来。要这样做,假设你再次位于你的 Hyper-V 主机上:
1. 打开 Hyper-V Manager。
2. 单击位于 Hyper-V Manager 窗口右侧的导入虚拟机菜单项。您将看到导入虚拟机向导。点击下一步。

3. 接下来,输入要导入的导出虚拟机的路径,然后点击下一步。 对于本教程,虚拟机保存在C:\Export_VM\Alpine Linux 01。
与使用 PowerShell 导入时不同,向导会自动定位虚拟机的 VMCX 文件。

4. 一旦 Hyper-V 在文件夹中发现了虚拟机配置文件(在本例中为C:\Exported_VM\Alpine Linux 01\Virtual Machines\),Hyper-V 将要求您选择要导入的虚拟机。 选择您要导入的虚拟机,然后点击下一步。

5. 接下来,选择要执行的导入类型。 首先,让我们更详细地探讨选项。
当您选择“就地注册虚拟机(使用现有唯一标识)”选项时,您假定导出的虚拟机文件位于其最终位置,这意味着您没有将虚拟机移动到新文件夹。 导出的虚拟机文件将成为虚拟机的运行状态。 UID 不会改变。
UID 是 Hyper-V 用于识别虚拟机的标识。 如果 Hyper-V 检测到当前已注册相同的 UID,则会收到错误提示。
当您恢复虚拟机时,您可以选择位置或使用默认的 Hyper-V 位置将导出的虚拟机文件复制到。
当您复制虚拟机时,类似于恢复导出的虚拟机,但会生成一个新的唯一标识(UID)。 新的 UID 使得可以将同一个虚拟机多次部署到相同或不同的 Hyper-V 主机上。
对于演示,让我们选择导入类型 复制虚拟机。复制虚拟机将生成一个新的唯一标识符(UID)。每个 Hyper-V 虚拟机都由一个 UID 标识。现在选择此选项,然后单击下一步。

6. 由于您选择了复制选项,您可以更改存储虚拟机文件的位置。单击下一步接受此教程的默认设置。

7. 最后,选择一个称为存储文件夹的虚拟机位置。存储文件夹是 VHDX 和 AVHDX 文件所在的位置。对于此教程,请接受默认位置,然后单击下一步。

8. 查看摘要页面,准备好后,单击完成开始导入。

当 Hyper-V 完成导入后,将返回到 Hyper-V 管理器窗口,并且您现在将看到已导入的虚拟机,如下所示。

使用 PowerShell 导入虚拟机
如果通过 Hyper-V 管理器导入虚拟机不是您的菜,没问题。使用 PowerShell 吧!要使用 PowerShell 导入虚拟机,您将使用Import-VM cmdlet。考虑以下情景:
您已导出了一个虚拟机,它位于C:\Exported_VM\,假设它被意外删除了,或者可能需要在不同的 Hyper-V 主机上使用?由于已经导出,它本质上已经备份,并且可以很容易地被导入,因此可以恢复虚拟机。
如果Export-VM
将虚拟机保存到磁盘,Import-VM
cmdlet 则相反;它从磁盘读取虚拟机并将其导入到 Hyper-V。
1. 假设您已经打开了 PowerShell 控制台,并且位于导出虚拟机的目录中(C:\Exported_VM)。首先,使用以下代码运行Get-ChildItem
cmdlet,并使用Recurse
开关列出所有文件,并记下带有 *.vmcx 扩展名的文件名:
您可能会看到多个.vmcx 文件,这取决于导出的虚拟机是否有快照。您需要的唯一文件是位于虚拟机文件夹中的 VMCX 文件,以便启动虚拟机。
您可能会看到类似以下示例的输出:

2. 接下来,使用Import-VM
cmdlet,并使用Path
参数指定虚拟机的配置文件(在上一步中获取):
就是这样!您已经在原地注册了虚拟机,使用了导出时虚拟机的相同 UID。

3. 现在验证 UID 是否与.vmcx文件名相同,即虚拟机导出时的文件名。您可以使用以下代码通过查询 WMI 来执行此操作:
您应该看到类似下面的输出:

上面的示例是直接从 VM 配置文件中导入的,并且 VM 保留了原始 UID。在生产环境中,您可能希望生成一个新的 UID,以防止将旧 VM 错误地识别为新 VM。这就是 Copy
参数的作用。
使用
Copy
参数导入虚拟机将文件从原始位置(C:\Exported_VM\)复制到 Hyper-V 服务器配置的路径中。当与GenerateNewId
一起使用时,可以在同一 Hyper-V 服务器上多次导入 VM,并获得新的唯一标识符(UID)。
这次,导入的 VM 不包含与导出时相同的 UID。您可以在下面的截图中看到旧的和新的 UID:

现在,Hyper-V 将 VM 复制到您之前在 Hyper-V 管理器中导入 VM 时看到的默认路径,但会为 VM 分配新的 UID。
下一步
在本指南中,您已经学会了如何使用 PowerShell 和内置的 Hyper-V 管理器导出和导入 Hyper-V VM。
现在您已经知道如何导出和导入 Hyper-V 虚拟机,请尝试 设置自动虚拟机激活(AVMA) 以激活托管在 Hyper-V 上的 Windows Server 虚拟机。