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
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は容量節減等の目的からスパースを用いてイメージ変換していたようで、変換してすぐに利用できる状態にはなっていなかったようです。