导入和导出 Hyper-V 虚拟机:确保成功的方法

你需要导出 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. 找到要导出的虚拟机,右键单击它,然后单击导出

Exporting VM using Hyper-V Manager The VM can be offline or running prior to exporting.

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

Export Virtual Machine Dialog.

您选择保存的位置应该有足够的存储空间来存放导出的虚拟机。这会有所不同。请记住,您可以为磁盘分配60 GB,但这并不意味着虚拟机磁盘已经增长到60 GB。

一旦 Hyper-V 开始导出过程,您将在 Hyper-V 管理器窗口中看到导出的状态。

Export Status in Hyper-V Manager

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

Exported VM example
  • 快照文件夹包含虚拟机的快照信息。如果虚拟机没有快照,则该文件夹可能为空。在这个文件夹中,您会看到 VMCX、VMRS 和 VMGS 文件扩展名。 VMCX 二进制文件包含特定于您导出的虚拟机的配置信息。 VMRS 二进制文件包含虚拟机的运行时状态信息。如果没有这个文件,虚拟机将无法启动。最后还有 VMGS 文件。不确定这个文件是用来做什么的。如果您知道,请留下评论。

如果您之前有使用 Hyper-V 的经验,您可能已经注意到文件扩展名有些不同。从 Windows Server 2016 开始,Hyper-V 不再使用 XML 文件来存储配置信息,而是转向了二进制文件。 了解更多关于这些新扩展名的信息。

如果您的虚拟机有多个检查点,您将看到每个检查点的多个 VMCX、VMRS 和 VMGS 文件。

Snapshots folder example
  • 虚拟硬盘 文件夹包含所有虚拟机的硬盘映像文件或 *.vhdxAVHDX自动虚拟硬盘 文件是用于虚拟机检查点的差异磁盘。如果您的虚拟机有多个检查点,您将看到多个 AVHDX 文件。
Virtual Hard Disks example
  • 虚拟机 文件夹包含用于引导虚拟机的 VM 配置文件。与快照文件夹类似,您还将在这里看到 VMCX、VMRS 和 VMGS 二进制文件。
Virtual Machines configuration files example

如果这三个文件夹都存在并包含文件,则导出成功。

使用 PowerShell 导出虚拟机

如果您喜欢使用命令行或需要导出多个虚拟机,使用 PowerShell 导出虚拟机也是一个很好的选择。要使用 PowerShell 导出 Hyper-V,使用 Export-VM cmdlet。为此,假设您在 Hyper-V 主机上并且您的虚拟机是离线:

1. 打开 PowerShell 控制台。

2. 查询 Hyper-V 主机以获取您的虚拟机清单和要导出的虚拟机的名称。本教程将导出名为Alpine Linux 01的虚拟机。

Get-VM
Virtual machine name to be used in Export-VM command

3. 创建一个用于导出虚拟机的文件夹。本教程将虚拟机导出到C:\Export_VM。

New-Item -ItemType Directory -Name 'Exported_VM\' -Path 'C:\'

4. 现在使用Export-VM cmdlet导出虚拟机,提供虚拟机的名称作为Name参数,保存路径作为Path参数,以及PassThru参数。

PassThru参数是可选的,用于返回导出的虚拟机对象。否则,Export-VM不会返回任何输出。

Export-VM -Name 'Alpine Linux 01' -Path 'C:\Exported_VM\' -Passthru
Successful export of an offline virtual machine.

当虚拟机正在运行时,Export-VM不会自动保存内存。如果想要保存虚拟机中正在运行的内存内容,请使用-CaptureLiveState CaptureSavedState参数与Export-VM一起。 了解更多有关捕获内存的技术。

5. 现在从 Hyper-V 中移除虚拟机。别担心!你已经将其保存了!

Remove-VM -Name 'Alpine Linux 01'

使用 Hyper-V Manager 导入虚拟机

一旦你导出了虚拟机,灾难降临了,虚拟机不见了。别担心!你已经将其导出到磁盘上了。让我们把它找回来。要这样做,假设你再次位于你的 Hyper-V 主机上:

1. 打开 Hyper-V Manager。

2. 单击位于 Hyper-V Manager 窗口右侧的导入虚拟机菜单项。您将看到导入虚拟机向导。点击下一步

Import Virtual Machine Wizard

3. 接下来,输入要导入的导出虚拟机的路径,然后点击下一步。 对于本教程,虚拟机保存在C:\Export_VM\Alpine Linux 01

与使用 PowerShell 导入时不同,向导会自动定位虚拟机的 VMCX 文件。

Import Virtual Machine Wizard

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

Import Virtual Machine Wizard

5. 接下来,选择要执行的导入类型。 首先,让我们更详细地探讨选项。

当您选择“就地注册虚拟机(使用现有唯一标识)”选项时,您假定导出的虚拟机文件位于其最终位置,这意味着您没有将虚拟机移动到新文件夹。 导出的虚拟机文件将成为虚拟机的运行状态。 UID 不会改变。

UID 是 Hyper-V 用于识别虚拟机的标识。 如果 Hyper-V 检测到当前已注册相同的 UID,则会收到错误提示。

当您恢复虚拟机时,您可以选择位置或使用默认的 Hyper-V 位置将导出的虚拟机文件复制到。

当您复制虚拟机时,类似于恢复导出的虚拟机,但会生成一个新的唯一标识(UID)。 新的 UID 使得可以将同一个虚拟机多次部署到相同或不同的 Hyper-V 主机上。

对于演示,让我们选择导入类型 复制虚拟机。复制虚拟机将生成一个新的唯一标识符(UID)。每个 Hyper-V 虚拟机都由一个 UID 标识。现在选择此选项,然后单击下一步

Import Virtual Machine Wizard

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

Import Virtual Machine Wizard

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

Import Virtual Machine Wizard

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

Completing Import Virtual Machine Wizard

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

Imported VM

使用 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 扩展名的文件名:

Get-ChildItem -Recurse | Where-Object -Property Name -CLike *.vmcx

您可能会看到多个.vmcx 文件,这取决于导出的虚拟机是否有快照。您需要的唯一文件是位于虚拟机文件夹中的 VMCX 文件,以便启动虚拟机。

您可能会看到类似以下示例的输出:

Exported VM UID example – VM configuration file (vmcx)

2. 接下来,使用Import-VM cmdlet,并使用Path参数指定虚拟机的配置文件(在上一步中获取):

Import-VM -Path '.\Alpine Linux 01\Virtual Machines\.vmcx'

就是这样!您已经在原地注册了虚拟机,使用了导出时虚拟机的相同 UID。

Importing a VM in place

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

(Get-CimInstance -Namespace Root\Virtualization\V2 -ClassName Msvm_VirtualSystemSettingData -Filter "ElementName = 'Alpine Linux 01'").InstanceID

您应该看到类似下面的输出:

UID Retained

上面的示例是直接从 VM 配置文件中导入的,并且 VM 保留了原始 UID。在生产环境中,您可能希望生成一个新的 UID,以防止将旧 VM 错误地识别为新 VM。这就是 Copy 参数的作用。

使用 Copy 参数导入虚拟机将文件从原始位置(C:\Exported_VM\)复制到 Hyper-V 服务器配置的路径中。当与 GenerateNewId 一起使用时,可以在同一 Hyper-V 服务器上多次导入 VM,并获得新的唯一标识符(UID)。

Import-VM -Path '.\Alpine Linux 01\Virtual Machines\.vmcx' -Copy -GenerateNewId

这次,导入的 VM 不包含与导出时相同的 UID。您可以在下面的截图中看到旧的和新的 UID:

Showing previous UID prior to import vs. new UID created with Copy and GenerateNewID parameters.

现在,Hyper-V 将 VM 复制到您之前在 Hyper-V 管理器中导入 VM 时看到的默认路径,但会为 VM 分配新的 UID。

下一步

在本指南中,您已经学会了如何使用 PowerShell 和内置的 Hyper-V 管理器导出和导入 Hyper-V VM。

现在您已经知道如何导出和导入 Hyper-V 虚拟机,请尝试 设置自动虚拟机激活(AVMA) 以激活托管在 Hyper-V 上的 Windows Server 虚拟机。

Source:
https://adamtheautomator.com/export-hyper-v-vm/