プロジェクト

全般

プロフィール

Windows Hyper-V

はじめに

Hyper-Vは、Windows OSに標準搭載される仮想化機能です。
Windows Server OSだけでなく、Windows 8以降のクライアントOSでも利用可能です(ただし、エディションに制限あり)。

簡単設定

Windows 10でHyper-Vを有効化

Windows 10 Pro以上のエディションでHyper-Vが利用可能です。

  • [コントロールパネル] > [プログラム] > [Windowsの機能の有効化または無効化]] から、[Hyper-V]にチェックを付けます。
  • 再起動後、Hyper-Vマネージャを起動します(スタートメニュー > Windows管理ツール > Hyper-V マネージャー)。

仮想スイッチの設定

Hyper-Vを使うには、最初に仮想スイッチを作成する必要があります。

  • Hyper-Vマネージャーの左側ペインで実行するホストを選択する
  • Hyper-Vマネージャーの右側ペインで[仮想スイッチマネージャー]をクリックする
  • 仮想スイッチマネージャーで、[外部]を選択し、[仮想スイッチの作成]ボタンをクリックする
    外部/内部/プライベートが選択でき、外部はホスト外のネットワークアクセスが可能、内部はホスト内の物理または仮想マシンとのネットワークアクセスのみ可能、プライベートは他の物理または仮想マシンとのネットワークアクセスが不可です。
  • 名前を付け(例:有線LAN-1系)、外部ネットワークのNICを選択(複数NIC搭載PCでは実際に使用するNICを選択する)、[OK]ボタンをクリックする

仮想マシンの世代

Hyper-Vでは、仮想マシンの種類として第1世代、第2世代が選択可能(選択させられる)となっています。

第1世代仮想マシン

第2世代仮想マシン

  • UEFIファームウェアに対応
  • レガシーデバイスの削除(IDE、フロッピーコントローラ、i8042キーボードコントローラ、PS/2キーボード・マウス、PCIバス、PIC、PIT、スーパーI/Oデバイス)
  • 標準ネットワークアダプタを使用したPXEブートに対応
  • SCSIコントローラから起動
  • セキュアブート
  • VHDX形式の仮想ハードドライブ(VHD形式はVHDX形式に変換する必要あり)
  • Linux を起動するにはセキュアブートを無効にする必要がある

参考

仮想マシンの作成

  • Hyper-Vマネージャーの左側ペインで実行するホストを選択する
  • Hyper-Vマネージャーの右側ペインで[新規] > [仮想マシン]をクリックする
  • 「仮想マシンの新規作成ウィザード」で、名前と格納場所を設定する
  • 「仮想マシンの新規作成ウィザード」で、世代の選択をする
  • 「仮想マシンの新規作成ウィザード」で、起動メモリを設定する
  • 「仮想マシンの新規作成ウィザード」で、ネットワークの構成を選択する(先に作成した仮想スイッチを選択)

パフォーマンス

パフォーマンス改善方法

以下はWeb上で見かけたテクニックで未検証。

仮想ホストの設定

  • 仮想ホストの物理マシンのハードウェアを高速化する
    • ストレージのコントローラーを並列化(複数)
  • 仮想ホストの物理マシンのBIOS設定でC Statesを無効にする
  • 仮想ホストの物理マシンのBIOS設定で仮想化支援機能を有効にする(VMX、AMD-V、VT-x)
  • 仮想ホストの物理マシンのBIOS設定でDEP(Data Execution Prevention)を無効にする(NX, XD)
  • 仮想ホストの物理マシンのBIOS設定でSLAT(Second Level Address Translation)を有効にする(NPT/RVI、EPT)
  • 仮想ホストの物理マシンのBIOS設定でHyperthreadingを無効にする
  • 仮想ホストの物理マシンでは回転ディスク(HDD)を使わずSSDを使う
  • VHDの動的拡張は使わずに、VHDXの動的拡張を使う
  • パススルーのディスクは使わない
  • 仮想ホストのOS上でウィルス対策ソフトの検査対象から仮想イメージ(VHD)を除外する
  • MPIO(Multipath I/O)を使う

仮想ゲストOS(Windows)

  • Windows Searchサービスを停止する
  • 仮想メモリ(ページング)を停止する(但し十分なメモリを割り当てる) *

参考文献

https://www.altaro.com/hyper-v/hardware-tweaks-hyper-v-performance/
https://www.monitis.com/blog/30-ways-to-improve-hyper-v-virtualization/

問題解決

ホストOS-ゲストOS連携

ホストOSのサスペンドまたはスリープに対処

デスクトップPC(Windows 10)の上にHyper-VでLinuxを稼働させています。ここで、デスクトップPCがスリープまたは休止状態に入った後復帰すると、Hyper-V上のLinuxの時刻が大きくずれています。ホストOSが1日スリープしてから復帰した場合、Linuxはスリープ直前の状態(時刻)から再開します。
LinuxにはNTPクライアントを入れていますが、NTPは大きく時間がずれているときは時刻同期をあきらめてしまいます(slewモード)。

  • メモ1)NTPサーバーとの時刻差が一定時間より大きい場合stepモードで時刻を合わせるが、これはLinux起動時(NTPデーモン起動時)に限られる模様

そこで、苦肉の策ですが、ホストOS(Windows 10)がスリープから復帰したイベントでゲストOS(Hyper-V)をサスペンドーレジュームさせることにします。

以下のバッチファイルを作成します。

powershell -Command "suspend-vm MyLinux; resume-vm MyLinux" 

タスクスケジューラーに登録します。[コンピュータの管理]から、タスクスケジューラーの[基本タスクの作成]で作成します。
トリガーは、[特定イベントのログへの記録時]とし、ログ欄は[システム]を選択、ソース欄は[Power-Troubleshooter]を選択、イベントID欄に1を入力、とします。
操作は[プログラムの開始]を選択し、上述で作成したバッチファイルを指定します。