BitVisor on HyperV 再挑戦 

  - [はじめに](#org0d842ff)
  - [動作環境](#org259166d)
  - [Nested Virtualization の有効化](#org38bcbf3)
  - [とりあえず試す](#org0b8b175)
  - [結果](#org7189d81)
  - [32bit ビルドも試す](#org9d6b158)
  - [どうしましょう?](#org39e9b18)
  - [おわりに](#orgabb4a83)
  - [おまけ](#org81df2c1)


<a id="org58459aa"></a>



<a id="org0d842ff"></a>

## はじめに

一昨年の BitVisor Advent Calendar で HyperV 上で BitVisor を動かそうとして挫折した記事を書きました． 記事の最後には， `時間があればリベンジするかも．` などと書いていましたが完全に放置していたので，今回再挑戦してみようと思った次第です．

残念ながら，今も時間があるわけではないので，ほとんど一昨年の手順をもう一度試すだけになりました&#x2026; 一昨年挑戦したときの記事&#x2013;> <https://qiita.com/deep_tkkn/items/7f55e507cbe2009c854c>


<a id="org259166d"></a>

## 結論
今年も結局動きませんでした...

## 動作環境

動作環境は一昨年と同じです．(そろそろ新しいマシンが欲しい)

-   **マシン:** Thinkpad X220
-   **CPU:** Intel Core i5-2520M CPU @ 2.50GHz
-   **RAM:** 16 GB
-   **Host OS:** Windows 10 Version 1903
-   **Guest OS:** Ubuntu 18.04.2 with
-   **Guest kernel:** Linux ubuntu1804 4.15.0-70-generic #79-Ubuntu SMP Tue Nov 12 10:36:11 UTC 2019 x86<sub>64</sub> x86<sub>64</sub> x86<sub>64</sub> GNU/Linux


<a id="org38bcbf3"></a>

## Nested Virtualization の有効化

一昨年の記事で Nested Virtualization を有効にする方法が説明されていたページをリンクしていたんですが，リンク切れしていたのでもう一度ここに書きます．

UI では Nested Virtualization に関する設定項目が全然見えないものの，CLI コマンドから設定できます． まずは今の設定を PowerShell (管理者権限で実行) で確認してみます．

    PS C:\WINDOWS\system32> Get-VMProcessor ubuntu1804
    
    VMName     Count CompatibilityForMigrationEnabled CompatibilityForOlderOperatingSystemsEnabled
    ------     ----- -------------------------------- --------------------------------------------
    ubuntu1804 1     False                            False
    
    
    PS C:\WINDOWS\system32> Get-VMProcessor ubuntu1804 | Select *
    
    
    VMCheckpointId                               : 00000000-0000-0000-0000-000000000000
    VMCheckpointName                             :
    ResourcePoolName                             : Primordial
    Count                                        : 1
    CompatibilityForMigrationEnabled             : False
    CompatibilityForOlderOperatingSystemsEnabled : False
    HwThreadCountPerCore                         : 0
    ExposeVirtualizationExtensions               : False
    EnablePerfmonPmu                             : False
    EnablePerfmonLbr                             : False
    EnablePerfmonPebs                            : False
    EnablePerfmonIpt                             : False
    Maximum                                      : 100
    Reserve                                      : 0
    RelativeWeight                               : 100
    MaximumCountPerNumaNode                      : 4
    MaximumCountPerNumaSocket                    : 1
    EnableHostResourceProtection                 : False
    OperationalStatus                            : {}
    StatusDescription                            : {}
    Name                                         : プロセッサ
    Id                                           : Microsoft:3E72556C-C387-40DF-A048-AB1E53C1DB27\b637f346-6a0e-4dec-af52-b
                                                   d70cb80a21d\0
    VMId                                         : 3e72556c-c387-40df-a048-ab1e53c1db27
    VMName                                       : ubuntu1804
    VMSnapshotId                                 : 00000000-0000-0000-0000-000000000000
    VMSnapshotName                               :
    CimSession                                   : CimSession: .
    ComputerName                                 : WIN-45QGET4E7K9
    IsDeleted                                    : False

VMProcessor の `ExposeVirtualizationExtensions` というのを `True` じゃないといけないが， `False` ですね，はい&#x2026; というわけでこれを設定するために PowerShell で以下のようにする．

```powershell
PS C:\WINDOWS\system32> Set-VMProcessor -VMName ubuntu1804 -ExposeVirtualizationExtensions $true
```

もう一度確認

```powershell
PS C:\WINDOWS\system32> Get-VMProcessor ubuntu1804 | Select *


VMCheckpointId                               : 00000000-0000-0000-0000-000000000000
VMCheckpointName                             :
ResourcePoolName                             : Primordial
Count                                        : 1
CompatibilityForMigrationEnabled             : False
CompatibilityForOlderOperatingSystemsEnabled : False
HwThreadCountPerCore                         : 0
ExposeVirtualizationExtensions               : True
EnablePerfmonPmu                             : False
EnablePerfmonLbr                             : False
EnablePerfmonPebs                            : False
EnablePerfmonIpt                             : False
Maximum                                      : 100
Reserve                                      : 0
RelativeWeight                               : 100
MaximumCountPerNumaNode                      : 4
MaximumCountPerNumaSocket                    : 1
EnableHostResourceProtection                 : False
OperationalStatus                            : {}
StatusDescription                            : {}
Name                                         : プロセッサ
Id                                           : Microsoft:3E72556C-C387-40DF-A048-AB1E53C1DB27\b637f346-6a0e-4dec-af52-b
					       d70cb80a21d\0
VMId                                         : 3e72556c-c387-40df-a048-ab1e53c1db27
VMName                                       : ubuntu1804
VMSnapshotId                                 : 00000000-0000-0000-0000-000000000000
VMSnapshotName                               :
CimSession                                   : CimSession: .
ComputerName                                 : WIN-45QGET4E7K9
IsDeleted                                    : False          
```

OK そうですね．

参考 URL

-   <https://docs.microsoft.com/en-us/virtualization/hyper-v-on-windows/user-guide/nested-virtualization>
-   <https://www.gmo.jp/report/single/?art_id=202>


<a id="org0b8b175"></a>

## とりあえず試す

1.  Hyper-V 上で VM, Guest OS を用意
    -   今回は別用で用意したものを流用
    -   第一世代の VM (BIOS boot)
2.  BitVisor のバイナリをダウンロード, *boot 以下に置く <https://bitvisor.org>* の `Nigtyly Build` からダウンロード
3.  grub の設定
    -   `/etc/grub.d/40_custom` に以下を追記
        
            menuentry "BitVisor" {
                    multiboot /boot/bitvisor.elf
            }
    -   `/etc/default/grub`
        
        -   `GRUB_TIMEOUT_STYLE` を `hidden` から `menu` に
        -   `GRUB_TIMEOUT` を `0` から `10` に
        
        ```diff
        $ diff -u default_grub.backup /etc/default/grub
        --- default_grub.backup 2019-12-02 22:56:16.648771785 +0900
        +++ /etc/default/grub   2019-12-02 22:56:29.527069551 +0900
        @@ -4,8 +4,8 @@
         #   info -f grub -n 'Simple configuration'
        
         GRUB_DEFAULT=0
        -GRUB_TIMEOUT_STYLE=hidden
        -GRUB_TIMEOUT=0
        +GRUB_TIMEOUT_STYLE=menu
        +GRUB_TIMEOUT=10
         GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian`
         GRUB_CMDLINE_LINUX_DEFAULT="splash quiet"
         GRUB_CMDLINE_LINUX=""
        ```
    -   `sudo grub-mkconfig -o /boot/grub/grub.cfg`


<a id="org7189d81"></a>

## 結果

起動しませんでした&#x2026; エラーも一昨年の記事と同じ&#x2026;

どうでもいいんですが，この状態で VM に接続するとキーボードの Caps Lock のライトが点滅するんですよね&#x2026; しかも光っている時に VM からフォーカスを外すと Caps Lock が入った状態になる&#x2026; 地味に困ります．


<a id="org9d6b158"></a>

## 32bit ビルドも試す

Nigtyly build はたぶん 64 bit 向けバイナリだと思いますが，一昨年の結果では 64 bit は厳しそうということだったので 32 bit 向けバイナリも試します．

1.  <https://bitvisor.org/> からlatest のコードをダウンロード (bitbucket から clone してもいいと思います)
2.  make config して `64` を disable
3.  make
4.  bitvisor.elf を差し替え


<a id="org39e9b18"></a>

## 結果は...

こちらも去年と同じ結果でした orz &#x2026;


<a id="orgabb4a83"></a>

## おわりに

HyperV のバージョンなどは上がっていると思いますが，残念ながら一昨年と同じ結果になってしまいました．
 (というか VMEntry Failure は調べるの辛すぎるから Intel さんもっと細かい情報をエラーコードで返してお願い&#x2026;)
VMEntry Failure から調べるのは難しそうだったので，Windows のイベントビューアとか弄ってみてたのですが，時間切れになってしまいました...

<a id="org81df2c1"></a>

## おまけ
↓こういうことがなければもう少し調べられていた気がする(いいわけ)
-   <https://twitter.com/deep_tkkn/status/1201490870467358720>
-   <https://twitter.com/deep_tkkn/status/1201491922075828225>