見出し画像

Hyper-V/WSL2 の VHD/VHDX ディスクファイルは Windows NTFS の圧縮や暗号化が有効だと VM として起動できない

「うげーめんどくせー仕様」と思わず声に出した一件です。内容はタイトルの通りです。

D:\home_config\hyper-v\ubuntu01\ubuntu01> Get-ChildItem -Recurse -Path *.vhdx | Select-Object FullName, Attributes

FullName                                                                           Attributes
--------                                                                           ----------
D:\home_config\hyper-v\ubuntu01\ubuntu01\Virtual Hard Disks\ubuntu01.vhdx Archive, Compressed


D:\home_config\hyper-v\ubuntu01\ubuntu01> Start-Vm -Name ubuntu01
Start-Vm : 'ubuntu01' は起動できませんでした。
Synthetic SCSI Controller (インスタンス ID XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXX): 電源をオンにできませんでした。エラー '仮想デ
ィスク システムの制限により、要求された操作を完了できませんでした。仮想ハード ディスク ファイルの圧縮と暗号化が解除されている必
要があります。また、仮想ハード ディスク ファイルをスパースに設定することはできません。'。
次のエラーが原因でアタッチメント 'D:\home_config\hyper-v\ubuntu01\ubuntu01\Virtual Hard Disks\ubuntu01.vhdx' を開けませんでした
: '仮想ディスク システムの制限により、要求された操作を完了できませんでした。仮想ハード ディスク ファイルの圧縮と暗号化が解除さ
れている必要があります。また、仮想ハード ディスク ファイルをスパースに設定することはできません。''ubuntu01' は起動できませんでした。(仮想マシン ID XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXX)
'ubuntu01' Synthetic SCSI Controller (インスタンス ID XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXX): 電源をオンにできませんでした。エラ
ー: '仮想ディスク システムの制限により、要求された操作を完了できませんでした。仮想ハード ディスク ファイルの圧縮と暗号化が解除
されている必要があります。また、仮想ハード ディスク ファイルをスパースに設定することはできません。' (0xC03A001A)。(仮想マシン I
D XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXX)
'ubuntu01': 次のエラーが原因でアタッチメント 'D:\home_config\hyper-v\ubuntu01\ubuntu01\Virtual Hard Disks\ubuntu01.vhdx' を開け
ませんでした: '仮想ディスク システムの制限により、要求された操作を完了できませんでした。仮想ハード ディスク ファイルの圧縮と暗
号化が解除されている必要があります。また、仮想ハード ディスク ファイルをスパースに設定することはできません。' (0xC03A001A)。(仮
想マシン ID XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXX)
発生場所 行:1 文字:1
+ Start-Vm -Name ubuntu01
+ ~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [Start-VM], VirtualizationException
    + FullyQualifiedErrorId : OperationFailed,Microsoft.HyperV.PowerShell.Commands.StartVM

D:\home_config\hyper-v\ubuntu01\ubuntu01>
D:\home_config\hyper-v\ubuntu01\ubuntu01> . compact /U "D:\home_config\hyper-v\ubuntu01\ubuntu01\Virtual Hard Disks\ubuntu01.vhdx"

 D:\home_config\hyper-v\ubuntu01\ubuntu01\Virtual Hard Disks\ のファイルを圧縮解除しています

ubuntu01.vhdx [OK]

1 ディレクトリ内の 1 ファイルが圧縮解除されました。

D:\home_config\hyper-v\ubuntu01\ubuntu01> Get-ChildItem -Recurse -Path *.vhdx | Select-Object FullName, Attributes

FullName                                                                  Attributes
--------                                                                  ----------
D:\home_config\hyper-v\ubuntu01\ubuntu01\Virtual Hard Disks\ubuntu01.vhdx    Archive

D:\home_config\hyper-v\ubuntu01\ubuntu01> Start-Vm -Name ubuntu01
D:\home_config\hyper-v\ubuntu01\ubuntu01>
# 無事起動。

Hyper-V(WSL)のディスクである VHDX はの容量を小さくしようと NTFS 圧縮をかけたのですが、上記のようなエラーが出ました。これは前世代 VHD ファイルを使用した Hyper-V の時代(2008)からもそうであるらしく、現在も続く仕様です。

NTFS 暗号化をかけたファイルも同様のようです。 BitLocker 環境では問題なく Hyper-V は動くので NTFS に限るようです。 SMB 上では? とか疑問は尽きないですが、ややこしいので割愛いたします。
なお、上記現象を回避するには、 VHDX ファイルの NTFS 圧縮・暗号化解除以外ありません。

VHDX/VHD ファイルも結局は単なるファイルシステム上の 1 つのファイルであり、圧縮をかけようも特に VHDX の動作にはパフォーマンス以外影響はないはずなのですが、不思議です。想像でしかありませんが、パフォーマンスの問題の観点から VHD ファイルの NTFS 圧縮を無効強制にしたか、NTFS の機能から VHDX/VHD ファイルを操作しているのかな、と思いましたが調べても「何故そうなのか」は分からず。
仮にパフォーマンスが問題だったとしても、今の CPU 性能であれば何ら問題ないとは思いますが……。 Optimize-VHD などのコマンドレットなどディスクバキュームの方法はありますので、そちらを積極的に使えということでしょうか。と言っても、透過圧縮の方が楽なので残念。

Hyper-V をベースとする WSL2 も同様ですので、 NTFS 圧縮を多様する環境ですと注意が必要です。

参考

https://github.com/microsoft/WSL/issues/4103

老後、奥さんと世界一周のための費用にします。