日記テスト運用中

不定期に更新中。高専・学生ロボコンといったNHKロボコンネタを主に。ほかにもいろいろ。

VMware VMDKからHyper-V VHDX形式への変換で詰まったとき

VMwareの仮想ハードディスクイメージ形式であるVMDKからHyper-VのVHDX形式へハードディスクイメージを変換した時、変換後のVHDXが正しくマウントできない事象が起きたのでその解決のメモ。

変換に用いたのはQEMUに含まれるqemu-img。こんな感じで引数を与えて変換をしました。

$ qemu-img.exe convert -p -S 0 -f vmdk -O vhdx -o subformat=dynamic R:\block.vmdk Q:\block1.vhdx

変換が完了し、PowerShellのMount-VHDなどでマウントしてみますが・・・

> Mount-VHD -Path Q:\block1.vhdx
Mount-VHD: 仮想ディスクをマウントできませんでした。
システムで 'Q:\block1.vhdx' をマウントできませんでした。
仮想ディスクをマウントできませんでした。
システムで 'Q:\block1.vhdx' をマウントできませんでした: 仮想ディスク システムの制限により、要求された操作を完了できませ
んでした。仮想ハード ディスク ファイルの圧縮と暗号化が解除されている必要があります。また、仮想ハード ディスク ファイルを
スパースに設定することはできません。 (0xC03A001A)。

マウントできません。理由を調べていったところ、Windowsにて仮想ハードディスクをマウントするには、エラーメッセージにもあるように圧縮や暗号化の属性を解除すること、そしてスパースを設定してはならないということでした。

So disable the sparsiness of the .VHD file. Is that a word? It is now.

fsutil sparse setflag my_disk.vhd 0
fsutil sparse queryflag my_disk.vhd
This file is NOT set as sparse

xenotrope.blogspot.com

fsutilコマンドで変換したVHDファイルに対しスパースを無効にしてみましょう。

> fsutil sparse queryflag Q:\block1.vhdx
このファイルはスパースに設定されています
PS C:\> fsutil sparse setflag Q:\block1.vhdx 0
PS C:\> fsutil sparse queryflag Q:\block1.vhdx
このファイルはスパースに設定されていません
PS C:\> Mount-VHD -Path Q:\block1.vhdx
PS C:\>

Mount-VHDコマンドレットが通りマウントできました。VHD/VHDXファイルにはNTFSの特殊属性やスパースファイル設定を有効にしてはならないようです。そしてqemu-imgは容量節減等の目的からスパースを用いてイメージ変換していたようで、変換してすぐに利用できる状態にはなっていなかったようです。