29歳、離婚しました。

家事は元妻にまかせっきり。そんな生活力ゼロ男の離婚後の生活を綴ったブログです。著者がその後の生活の中で見つけた生活術やお役立ち情報をお届けします。

Hyper-VとVMwareを共存させる際にPSで簡単に切り替える方法

      2017/09/09

現在はPCやサーバーの仮想化が広く浸透し、テストや実稼働環境に仮想化技術を使っている方も多いと思います。
そして特に開発やテストを行っているときには、このように思うことがあるはず。

Hyper-VとVMwareを共存させたい!

VMwareにかぎった話ではないんですが、Hyper-Vと他の仮想化ソリューションを同じ環境に有効化・インストールした場合、どちらかの仮想化ソリューションが起動できなくなります

たとえばHyper-VとVMwareを共存させている環境下でHyper-Vの機能を有効にしている場合、VMwareの仮想マシンを起動しようとした場合、以下のようなメッセージが表示され、VMwareの仮想マシンを起動することはできません。

vmware-error

これとは反対に、Hyper-VとVMwareを共存させている環境下でHyper-Vの機能を無効にしている場合、Hyper-Vの仮想マシンを起動しようとした場合、以下のようなメッセージが表示され、Hyper-Vの仮想マシンを起動することはできません。(Hyper-Vの無効化 = VMwareの有効化状態と考えてください)

hyper-v-error

これは仮想化に使用する技術・アーキテクチャーが違うために仕方のないことで、どうしようもありません。

スポンサーリンク

そうは言っても、開発やテストによっては両者を使い分けたいこともあるでしょう。
幸いなことに両者を切り替えながらの運用であれば可能なので、使い分けの際は片方の機能を無効化することで動作させることが可能です。

具体的には、Hyper-Vの仮想マシンを使いたいときは、『コントロールパネル』 → 『プログラムと機能』 → 『Windowsの機能の有効化または無効化』と展開し、『Hyper-V』にチェックを入れてHyper-Vの機能を有効化します。

hyper-v-setting

VMwareなど、Hyper-V以外の仮想化ソリューションを使用したい時には、『Hyper-V』のチェックをはずしてHyper-Vの機能を無効化すればOK!

ただこの作業、ちょっと面倒ですよね。

そこでよく行われているのがBCDEditコマンドを使用しての、Hyper-Vの機能の有効化・無効化切り替え処理です。

BCDEditコマンドを使用してHyper-Vの機能の有効・無効を切り替える方法

これについての詳細は、マイナビニュースさんのWin 7/8/8.1編: Hyper-VとVMwareを共存させるに書いてありますが、簡単に言うと、BCDEditコマンドを使用して『hypervisorlaunchtype』属性の値を書き換え、OSを再起動させて変更した設定値を読みこませる、といった内容です。

これであれば、いちいちコントロールパネルを開いて…といった手間がなくなるので、少し楽になります。

ただこの処理では現在の設定値(Hyper-Vの機能の有効・無効状態)を問わず、コンピューターの再起動が実行されてしまいます。
だからたとえば既にHyper-Vの機能が有効状態であったとしても、Hyper-Vの機能有効化処理を実行すると再起動が行われてしまうんです。
これは時間がもったいないなぁ、なんて思ったわけ。

Hyper-Vの仮想マシンを起動していると、PCの終了時には仮想マシンの保存処理が、起動時には保存状態の仮想マシンの復帰処理が動作するため、それなりに時間がかかります。
これが多数の仮想マシンを起動している状態で、低速のディスクに仮想HDD(VHDXなど)を配置している状態の場合、かなりの時間となってしまうことも。

そこでこのあたりについて対話的に処理をすすめ、不要な再起動を避けられるような、Hyper-Vと他の仮想化ソリューションを切り替えるPowerShellスクリプトを作りました。

はじめに

これからご紹介するスクリプトには、PowerShellを使用しています。

最近のWindowsの初期設定では、PowerShell自体はインストールされていますが、実行ができない設定となっています。
そのためPowerShellを起動して以下のコマンドを実行し、Restrictedと表示されるようであれば、PowerShellスクリプトの実行ポリシーを変更してください。

PowerShellスクリプトの実行ポリシーの変更は以下のコマンドで行います。
RemoteSignedなど、動作可能なポリシーに変更してください。(セキュリティーの低下が懸念される場合には、-Scopeパラメーターも併用すると良いかもしれません。)

また当該スクリプトはWindows 10 Professional、PowerShell v5(詳細バージョンは以下のとおり)の環境下で、UACデフォルト状態とOFFのパターンにて正常に動作することを確認しています。

ただOSのバージョンやPowerShell、.NET Frameworkのバージョンによっては、正常に動作しない可能性もあります。
その場合にはお手数ですが、ご自身の環境に合わせて修正してお使いください。

Hyper-Vと他の仮想化ソリューションの切り替えを対話的に行うPowerShellスクリプト

まずは今回ご紹介するHyper-Vと他の仮想化ソリューションの切り替えを対話的に行うPowerShellスクリプトの動作について。

PowerShellスクリプトの動作

今回ご紹介するスクリプトは以下のような動作をします。

Hyper-Vの機能が『Windowsの機能の有効化または無効化』で一度も有効化されていない状態

Hyper-Vの機能が『Windowsの機能の有効化または無効化』で一度も有効化されていない状態では、BCDEditコマンドを使用しても『hypervisorlaunchtype』属性が見つからないようです。

この状態では、その旨をメッセージで通知するのみで、それ以外の処理は一切行いません。

set-vm-launch-type-msg-6

Hyper-Vの機能が有効状態

Hyper-Vの機能が有効状態であればその旨を通知し、無効化するかどうかを確認します。

set-vm-launch-type-msg-3

『はい』を選択した場合には、コンピューターをただちに再起動するかどうかを確認。

set-vm-launch-type-msg-5

再起動を要求した場合には、ただちにコンピューターの再起動が行われます。

Hyper-Vの機能が無効状態

Hyper-Vの機能が無効状態であればその旨を通知し、有効化するかどうかを確認します。

set-vm-launch-type-msg-4

『はい』を選択した場合には、コンピューターをただちに再起動するかどうかを確認。

set-vm-launch-type-msg-5

再起動を要求した場合には、ただちにコンピューターの再起動が行われます。

PowerShellスクリプト本体

テキストエディターを開いて以下の内容を記述し、ファイル名を『set-vm-launch-type.ps1』として保存してください。
あとは『set-vm-launch-type.ps1』スクリプトを管理者権限で実行すれば、先にご紹介した仕様のとおりに動作します。
(このスクリプトは内部で管理者権限が必要なコマンドを実行しているため、管理者権限での実行が必要です。)

ちなみに管理者権限で実行しなかった場合には、以下のメッセージを表示して処理を中止します。

set-vm-launch-type-msg-1

管理者権限で実行するのが面倒なんだけど?

たしかにPowerShellを管理者権限で実行するのは少し面倒かもしれませんね。
そこで先のスクリプトを管理者権限で実行するスクリプトも用意しました。

以下の内容を記述したファイルを、先のスクリプトと同じディレクトリーに配置してください。

このsudo.ps1スクリプトを通常権限で実行すると、set-vm-launch-type.ps1スクリプトを管理者権限で実行します。

ダブルクリックで実行したいんだけど?

この場合には、sudo.ps1のショートカットを作成し、プロパティのリンク先(例 C:\xxxx\sudo.ps1)の内容を以下のように書き換えればOK!

今回ご紹介した対話的なスクリプトであれば、誤って不要なコンピューターの再起動をすることがなくなるはず。
そのため多少ですが、時間のムダが減ると思います。

Hyper-Vと他の仮想化ソリューションを共存させている方はぜひご活用くださーい!

スポンサーリンク

 - Windows, デジタル・家電

ピックアップ コンテンツ&スポンサーリンク

関連コンテンツ