BitVisor入門 -- イントロダクション

たまにBitVisorについて聞かれることがあるものの，現状あまり良い入門資料が無いのでぼちぼちBitVisorの入門記事を書いていこうかと思います．ここに書いた文章は後で加筆修正してどこかにまとめる可能性があります．https://github.com/fukai-t/bitvisor-unofficial-doc とか．

## BitVisorとは
BitVisorはハイパーバイザ（仮想マシンモニタ）の一つです．一般にハイパーバイザと言えば複数の仮想マシンを動作させるものと認識される事が多いですが，ハイパーバイザの真の価値はOSとハードウェアの間に新しい抽象化レイヤーを提供する点にあります．仮想記憶は仮想アドレス空間の提供によりデマンドページングや共有メモリといった機能を可能にします．同様に，ハイパーバイザは仮想マシン（ゲストマシン）に仮想的な資源を提供することで，物理ハードウェアに依存しない新しい機能を提供することができます．

抽象化レイヤーを導入するということは，その分処理のオーバヘッドが増加するということでもあります．BitVisorはこのオーバヘッドをなるべく少なくするために，VMWareやVirtualBox, KVM, Xenといった汎用的なハイパーバイザとは異なり，一つのゲストOSのみをサポートするという選択をしています．この選択により，複数の仮想マシン動作に必要な機能のサポートを省くことが可能となり，ハイパーバイザ自身が非常に軽量になります．コード規模が小さくなることによりバグの可能性も小さくなるため，セキュリティ的なメリットもあります．

BitVisorでできることに，以下のようなことがあります．

- 透過的なVPNの適用
- ストレージデバイスの透過的な暗号化
- パケットフィルタリング
- デバイスの偽装・隠蔽
- メモリアクセスの捕捉・ロギング

このように，BitVisorを利用することでOSのメモリやデバイスのアクセスを必要に応じて捕捉し，新たな処理を加えることが可能になります．

## BitVisorの特徴

BitVisorには以下のような特徴があります．

- Intel, AMD CPUのサポート
- BIOSおよびUEFIブートのサポート
- 原則任意のOSに対応可能
- 各種デバイスドライバ（準パススルードライバ）
    - ネットワークデバイス
        - intel (e1000)
        - realtek
        - broadcom
    - ストレージデバイス
        - ATA
        - NVMe
    - USB
        - UHCI
        - XHCI
- TCP/IP機能 (lwIP)
- ネステッド仮想化機能（一部）

BitVisorは特に，ゲスト（BitVisor上で動くOS）がおこなうデバイス処理の必要な部分のみを捕捉し改変するという処理が得意です．これでできることには通信の透過的な暗号化や処理のピギーバックなどが含まれます．このとき，BitVisorはゲストに実デバイスをほぼそのまま見せ，基本動作はゲストのデバイスドライバにまかせるために，このような構成を準パススルー（para pass-through）と呼び，それを処理するドライバを準パススルードライバといいます．BitVisorにはネットワークやストレージデバイスの準パススルードライバが含まれます．また，BitVisorにはlwIPを利用したTCP/IP機能が内包されており，これを利用してBitVisorが外部と通信をおこなうといったことも可能です．

## 他のハイパーバイザとの比較

BitVisorはそれ単体で利用されるというよりかは，何か新しい機能を実装したい場合のベースとして利用されることが多いです．ここでは代表的な他のハイパーバイザとBitVisorの簡単な比較をおこないます．

### KVMとの比較
KVMはおそらく現在オープンソースで最も利用されている汎用ハイパーバイザです．KVMはLinuxをベースにした汎用ハイパーバイザで，AWSやGCP, Tencentといったクラウドサービスの基盤としても利用されています．KVMの特徴はなんといってもLinuxと結びついている点であり，ハイパーバイザとしてLinuxの機能を利用することができます．これはアプリケーションを開発する際に非常に大きな利点となります．機能としてはBitVisorでできることのほとんどがKVMでも実現可能でしょう．

一方でBitVisorと比較すると，オーバヘッドが大きく，またコードベースが巨大でLinuxに詳しくないと拡張は困難です．すでにあるOSを仮想化して処理するといったことも原則できません．ハイパーバイザをちょっと拡張して何か処理をしたいという場合には，BitVisorやあるいは次で説明するthin hypervisorを利用する方が一般に楽でしょう．


### Thin hypervisorとの比較

BitVisorのようなハイパーバイザはその軽量な構成からthin hypervisorと呼ばれることがあります．ここではthin hypervisorについて，代表的なものとその特徴をまとめます．

| 名称                                                          | 対応CPU      | ブート方法         |対応OS                   | 言語   |  ライセンス |
|---------------------------------------------------------------|--------------|--------------------|-------------------------|--------|-------------|
|[BitVisor     ](https://bitbucket.org/bitvisor/bitvisor)       |  Intel, AMD  | BIOS, UEFI         | Linux, Mac, Windows     |C       |    BSD      |
|[ksm          ](https://github.com/asamy/ksm)                  |  Intel       | On demand          | Linux                   |C       |    GPL      |
|[hvpp         ](https://github.com/wbenny/hvpp)                |  Intel       | On demand          | Windows                 |C, C++  |    MIT      |
|[HyperPlatform](https://github.com/tandasat/HyperPlatform)     |  Intel       | On demand          | Windows                 |C, C++  |    MIT      |
|[SimpleVisor  ](https://github.com/ionescu007/SimpleVisor)     |  Intel       | On demand, UEFI    | Windows                 |C       |    BSD-like |
|[ShadowBox    ](https://github.com/kkamagui/shadow-box-for-x86)|  Intel       | On demand          | Linux                  |C       |    GPL      |
|[Bareflank    ](https://github.com/Bareflank/hypervisor)       |  Intel       | On demand, UEFI    | Linux                   |C++     |    MIT      |


BitVisor以外のthin hypervisorの多くは，on-demand virtualizationといって，カーネルモジュール（あるいはデバイスドライバ）を利用してOS起動後にハイパーバイザを起動し，実行中のOSを仮想化させるという手法を取ります．これには開発・実験が容易であるという利点がある一方で，OSの起動前からハイパーバイザで処理するといったことはできません．BitVisorはBIOSやUEFIからブートすることで，OS起動前から処理が開始できます．

（準パススルー）デバイスドライバを保持しているというのもBitVisorの特徴です．BitVisor以外のthin hypervisorは主にカーネルレベルのrootkitの解析や，（Windows）カーネルのリバースエンジニアリングなどのメモリを対象とした処理を主目的としています．これらの処理に興味がある場合はそれらのハイパーバイザの方が適している可能性があります．一方でデバイスを扱いたい場合はBitVisorに利があります．またAMD CPUをサポートしているのもBitVisorのみです．もしVT-xの利用方法そのものに興味があるのなら，筆者的にはksmやSimpleVisorが特に分かりやすいと思います．

## まとめ

BitVisorについて簡単に紹介しました．次回は実際にBitVisorを動作させてみましょう．

-------

続く(?)