如何在 Hyper-V 客户虚拟机上启用睡眠/休眠?

如何在 Hyper-V 客户虚拟机上启用睡眠/休眠?

如何在 Hyper-V 客户虚拟机上启用睡眠/休眠模式?

笔记:

  • 我知道我可以从 Hyper-V 暂停/保存虚拟机。但是,我想模拟睡眠/休眠在物理机上的运作方式 - 特殊通知等。
  • 我知道可以通过运行来启用休眠功能powercfg -h on,但是失败了The system firmware does not support hibernation.
  • 我的 Hyper-V 在 Windows 10 1903 上运行,我的客户虚拟机也是如此。

背景:我正在开发 Windows 软件,该软件在机器进入睡眠/休眠状态时有特殊处理。该软件适用于物理机器(笔记本电脑等),但为了方便起见,我想在 Hyper-V VM 上测试它。

答案1

  1. 禁用虚拟机上的动态内存 - 它与休眠不兼容
  2. 在主机上运行以下 PowerShell 脚本:
Param (
    [string]$VmName,
    [bool]$Enable = $true
)

# To modify, machine must be off
$Vm = Get-VM -Name $VmName
$Vm | Stop-VM -Force -WarningAction Ignore

$wmiComputerSystem = gwmi -namespace root\virtualization\v2 -query "select * from Msvm_ComputerSystem where ElementName= '$VmName'"
$wmi_vsSettingData = $wmiComputerSystem.GetRelated("Msvm_VirtualSystemSettingData","Msvm_SettingsDefineState",$null,$null, "SettingData", "ManagedElement", $false, $null)
 
Write-Output ("Before: EnableHibernation = " + $wmi_vsSettingData.EnableHibernation)

# $wmi_vsSettingData.EnableHibernation = $Enable  # Doesn't work - says The property 'EnableHibernation' cannot be found on this object
# So, need to munge XML ourselves
[xml]$vsSettingsDataXml = $wmi_vsSettingData.gettext(1)
$EnableHibernationNodes = $vsSettingsDataXml.SelectNodes("/INSTANCE/PROPERTY[@NAME='EnableHibernation']")
$EnableHibernationNodes[0].VALUE=$Enable.ToString()

$wmi_vsSettingDataMgmt = Get-WmiObject -Namespace "root\virtualization\v2" -Class Msvm_VirtualSystemManagementService
$job = $wmi_vsSettingDataMgmt.ModifySystemSettings($vsSettingsDataXml.OuterXml)

笔记:

  • 在 Windows 10 1903 上进行了测试,包括主机和客户机
  • 运行此程序后,您可以在虚拟机中执行以下操作:
    • powercfg -a表明系统上已提供 Hibernate
    • powercfg -h on作品
    • 电源设置 => 附加电源设置 => 选择电源按钮的功能 => 现在您可以选中“休眠 - 在电源菜单中显示”,您将在开始 => 电源菜单中进入休眠模式。
    • Shutdown /h将会冬眠
  • 休眠并重新启动计算机后,您将无法使用“增强会话”连接到它。完全重新启动虚拟机后,此问题可得到解决。

相关内容