6
2

More than 1 year has passed since last update.

Hyper-Vのゲスト OS で休止状態を有効にする方法

Last updated at Posted at 2023-03-06

概要

Hyper-V の一時停止、再開ではなく Hyper-V のゲスト OSを休止させたい場面があります。
正直ニーズは非常に低いと思いますが、 Hyper-V の ゲスト OS で休止を有効にする方法についてまとめます。

前提条件

Hyper-V ホストの OS が 構成バージョン 9.0以上をサポートしている必要性があります。

その為ホストがサーバーOSの場合

Windows Server 2016 以前は使用できず
Windows Server 2019 または Windows Server 2022 であるである必要性があります。

詳細は下記のMicrosoft 公開情報を確認してください。

Title: Hyper-V の仮想マシンのバージョンをアップグレードする (Windows または Windows Server) | Microsoft Learn
https://learn.microsoft.com/ja-jp/windows-server/virtualization/hyper-v/deploy/upgrade-virtual-machine-version-in-hyper-v-on-windows-or-windows-server
※ [サポートされている仮想マシンの構成バージョン]と[仮想マシンの構成バージョンをアップグレードしないとどうなりますか?]の表を比較いただけるとご理解いただけると思います。

ゲスト OS は特に制限ないと思いますが、ゲスト OS で休止を使用できるように変更する必要性があります。

手順

Microsoftの公式情報では構成バージョン 9.0 で使えるようになった以外の記述が見つけられませんでした。
しかしながら下記リンクの手順でスクリプトを実行することで有効にすることが可能なことを確認しています。

具体的な手順は下記です。

  1. ゲスト OS で動的メモリが無効になっていることを確認します。
    無効になっていませんとゲスト OS が起動できなくなります。
  2. 上述のページのスクリプトを Hyper-V ホストで実行します。
    なおスクリプト 2行目で仮想マシン名を指定する必要性があります。
    なので実際に実行するスクリプトは下記です。
    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)
    
    
  3. ゲスト OS を起動しコマンド プロンプトを管理者として起動します。
  4. 下記コマンドを実行し休止状態を有効にします。
     powercfg.exe /hibernate on
    
  5. 下記を確認し休止状態を表示する設定とします。
    Title: PC をシャットダウン、スリープ、休止状態にする - Microsoft サポート
    https://support.microsoft.com/ja-jp/windows/pc-%E3%82%92%E3%82%B7%E3%83%A3%E3%83%83%E3%83%88%E3%83%80%E3%82%A6%E3%83%B3-%E3%82%B9%E3%83%AA%E3%83%BC%E3%83%97-%E4%BC%91%E6%AD%A2%E7%8A%B6%E6%85%8B%E3%81%AB%E3%81%99%E3%82%8B-2941d165-7d0a-a5e8-c5ad-8c972e8e6eff

上記を実施したのち、ゲスト OS で休止が選択できることを確認してください。

最後に

公開情報やWebにおいて情報がないということはニーズが少ないのだとは思いますが、確認要望がありましたので今回記事にまとめてみました。

なおあくまでも休止(S4)が有効にできるのみで、スリープ(S3)は有効にできません。
スリープが有効にできれば、モダンスタンバイの検証などに使える可能性があるのですが今後の機能の追加に期待をしておきます。

6
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
2