最近、Windows で Docker を使ってみようと思い、Windows で Hyper-V を有効にしたわけですが、その結果、VirtualBox 上の仮想マシンが起動できなくなってしまいました。
Hyper-V と VirtualBox は共存できない
このヘッダータイトルは正確ではないですね。前提として、AMD Ryzen な環境では、という但し書きが付きます。
これが、Intel Core な環境であったら、VirtualBox と Hyper-V は共存できるらしい・・
もちろん、マザーボードの BIOS では CPU の仮想環境サポートは有効にしていますし、タスクマネージャーでの CPU の仮想化は有効になっています。
ところが、HWiNFO では AMD-V がグレーアウトされています。
VDI から VHD に変換
ここで取りうる方法は以下の3通りあります。
- Hyper-V を無効にして再起動し、VirtualBox を使う
→ もちろん、Docker は使用できなくなります。 - VirtualBox の仮想ディスク (
*.vdi
) を Hyper-V の仮想マシンに接続できる形式 (*.vhd/*.vhdx
) に変換する - 仮想環境の事は忘れて他のことを考える
最後の選択肢はないとして、今回は VirtualBox の仮想ディスクを変換することにします。
仮想ディスクを VDI から VHD に変換するためには、VBoxManage.exe
コマンドを実行します。
仮に VDI ファイル名が Windows10 REF.vdi
だとして、これを windows10ref.vhd
に変換することを考えてみます。この場合、以下のようなコマンドになります。
"C:\Program FIles\oracle\VirtualBox\VBoxManage.exe" clonemedium disk "Windows10 REF.vdi" windows10ref.vhd -format VHD
変換した VHD ファイルを Hyper-V で使用する
無事に VHD ファイルに変換できたら、Hyper-V で仮想マシンに組み込んであげます。
「Hyper-V マネージャー」を開いて、[操作]メニューから、[新規] » [仮想マシン] で「仮想マシンの新規作成ウィザード」を開きます。
「名前と場所」を指定してから、「世代の指定」という部分で [第2世代] を指定します。
これは、元の VDI ファイルは Windows10 をインストールしている仮想イメージで、GPT で区画を割っているからで、自ずと UEFI ベースのシステムにしないといけないからです。
このまま、「メモリの割当」、「ネットワークの構成」ときて、最後に「仮想ハードディスクの接続」画面で、[既存の仮想ハードディスクを使用する] で、先程変換したファイルを指定したところ、「次へ」や、「完了」ボタンがグレーアウトしたままでこのまま進めなくなります。
これは、第2世代の場合は VHDX 形式の仮想ディスクでないといけないからです。
VHD から VHDX への変換
・・おいおい、
というわけで、VBoxManager で VHDX 形式で出してみようと思ったのだけれども、オプションを見てみると、
VBoxManage clonemedium [disk|dvd|floppy] <uuid|inputfile> <uuid|outputfile>
[--format VDI|VMDK|VHD|RAW|<other>]
[--variant Standard,Fixed,Split2G,Stream,ESX]
[--existing]
--format
オプションの <other>
って何?
と思いつつも、
"C:\Program FIles\oracle\VirtualBox\VBoxManage.exe" clonemedium disk "Windows10 REF.vdi" windows10ref.vhdx -format VHDX
とやってみたところ、
VBoxManage.exe: error: Medium 'D:\home\someuser\VirtualBox VMs\Windows10 REF\windows10ref.vhdx' is not accessible
VBoxManage.exe: error: Details: code VBOX_E_INVALID_OBJECT_STATE (0x80bb0007), component MediumWrap, interface IMedium, callee IUnknown
VBoxManage.exe: error: Context: "CloneTo(pDstMedium, ComSafeArrayAsInParam(l_variants), NULL, pProgress.asOutParam())" at line 1068 of file VBoxManageDisk.cpp
っていう具合に怒られてしまいます。
どうやら、VirtualBox からでは VHDX ファイルには変換できない??
Hyper-V マネージャーで VHDX に変換
というわけで、VHD から VHDX に変換するには、再び「Hyper-V マネージャー」の力を借りないといけないみたいです。
マネージャーの「操作」メニューから [ディスクの編集] をクリックし、「仮想ハードディスクの編集ウィザード」を開きます。
「ディスクの場所」で、先ほど変換した VHD ファイルを指定し、「ディスクフォーマットの選択」で [VHDX] を選択しそのまま先へ進んで [完了] で VHD から VHDX に無事返還されるはずです。
Hyper-V マネージャーで VDI から VHD/VHDX には変換できない
ここで一つ疑問がわきます。
「だったら、最初から Hyper-V マネージャーで VDI から VHDX に変換したほうが良くない?」
と。
でも、Hyper-V マネージャの仮想ハードディスク編集ウィザードでは、そもそもの変換元に、他の仮想環境、例えば VirtualBox の *.vdi
だとか、VMWare の *.vmdk
のようなファイル形式は選択できないようになっています。
そのために、VDI から VHDX に変換するにはこのようにして2段階の変換プロセスが必要になるみたいです。
まとめ
というわけで、VDI から VHDX に変換できて無事仮想マシンとしても起動させることができたんですが、ひとまず
- VDI から VHDX に変換するには、変換作業を2回行う
必要がある、ということを学習することができました。
ところで最初の方で提示した選択肢、実はもう一つあることに気が付きました。
- 何か適当なPCに Linux を放り込んで、その上で Docker を動かす
実は、こちらのほうが比較的スッキリと解決しそうな気がします。
0件のコメント