仮想化について

仮想化について勉強してたので、まとめる。今回はCPU仮想化がメインである。

## 仮想化とは
仮想化とは
- コンピュータリソースの抽象化すること

である。かなり曖昧だが、ハードウェアレベルの仮想化やソフトウェアの仮想化、言語レベルの仮想化があり、定義としてはかなり広い。
仮想化と言えば主に3つに分けられている、
- サーバ仮想化
    - ハードウェア仮想化
    - アプリケーション仮想化
    - デスクトップ仮想化
- リソースの仮想化
    - CPU仮想化
    - メモリ仮想化
    - ネットワーク仮想化
    - ストレージ仮想化
- その他
    - クラスタリング
    - クラウドコンピューティング
    - エミュレータ


などが挙げらる
### 仮想化のメリット
仮想化によって得られる技術的なメリットは主に以下の2つである。
- コンピュータリソースの有効活用
- 柔軟な拡張ができる
### 仮想化のデメリット
仮想化することで起きる技術的なデメリットは主に以下の2つである。
- 物理環境より性能が劣る
- 一つのサーバに障害が発生した場合の影響が大きい

#### サーバ仮想化
サーバ仮想化によってできたマシンを仮想マシンと呼ぶ。仮想マシンと物理マシンの違いをいかに述べる。
- 物理マシンはCPUやメモリなど物理的なハードウェアリソースを所有する専用コンピュータである。
- 仮想マシンは物理サーバのハードウェアを利用した仮想的なソフトウェアである。

仮想マシンはCPUなどのハードウェアを持っていないので物理マシンのハードウェアを利用してソフトウェアを稼働させる。例えば仮想マシンに仮想CPUを割り当てた場合、仮想マシンからは仮想CPUを占有して処理しているように見えるが、実際にはソフトウェアによって物理CPUの処理能力を均等に分割させている。仮想マシンは大きく分けて3種類に分けることができる。それはホスト型とハイパーバイザー型とコンテナ型である。今回はホスト型とハイパーバイザー型について語る。
##### ホスト型
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613684/e9a49682-6bcd-b7ca-a17d-9a380e97aa05.png)
ホストは上記の画像からわかる通り、物理マシンの中にOSがありその上に仮想化ソフトウェアをインストールし、仮想化ソフトウェアの上で仮想マシンを動作させる。仮想化ソフトウェアとして特に有名なものが[VirtualBox](https://www.virtualbox.org/)や[VMware](https://www.vmware.com/jp/products/workstation-player/workstation-player-evaluation.html)である。
##### ハイパーバイザー型
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613684/6a13eacf-1842-8855-a999-f17388d060e0.png)
ハイパーバイザー型は物理マシンの中にハイパーバイザがありその上で仮想マシンを動作させている。ハイパーバイザーとして特に有名なものがKVMやESXi、Hyper-Vなどがある。
##### ホスト型とハイパーバイザー型のメリット・デメリット
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613684/ec5cc71f-bc1e-fded-5a1f-57454f13b185.png)
ホスト型のメリットは仮想化ソフトウェアが扱いやすく、既存マシン上に仮想マシンを構築することができる。デメリットとしてはハイパーバイザー型に比べて仮想マシンの動作速度遅くなる。

ハイパーバイザー型のメリットはハードウェアを直接制御することができるため、動作速度の低下を最小限に抑えることができる。またリソースのほとんどを仮想環境で使うことができるので、ホスト型に比べてリソースの有効活用がよりできる。デメリットとしては既存マシンで動作できないため、新しいハードウェアが必要になる。

## x86アーキテクチャにおける仮想化の歴史
これからCPU仮想化についてまとめていく。
ハードウェア性能が向上したことによって仮想化を導入し、複数のサーバインスタンスを1つの物理サーバを実行することができるようになってきました。しかしながらx86アーキテクチャは仮想化が困難なアーキテクチャとして知られていました。1974年に発表された論文の中でハイパーバイザーを実装するのに必要な命令セットアーキテクチャ上の要件として「PopekとGoldbergの仮想化要件」が定義されている。そこでは仮想マシンの抽象仮想を提供するソフトウェア(VMM)の特性として3つ挙げられてる。
##### 等価性
実際のマシンと同じ動作でなくてはならない
##### 資源の管理
仮想化された資源を完全に管理しなくてはならない
##### 効率性
大部分の機会の命令を直接実行できなくてはならない

### 命令について
仮想化要件を満たすために命令セットの各命令について以下の3種類に分類した。
##### 特権命令
命令を実行しようとしたとき、プロセッサがユーザモードであれば割り込みされる命令であり、特権モードでないと実行できない
##### 制御センシティブ命令
システム資源の構成を変えようとする命令
##### 動作センシティブ命令
システム資源の構成に動作や結果が依存する命令

論文の中で定義された仮想化要件はシステム資源の構成を変えようとする命令やシステム構成に動作や結果が依存している命令(センシティブ命令)がユーザモードで実行されるときは常にトラップ(割り込み)されなければならないと言っている。
ハイパーバイザーの構成方法としてゲストマシン上のカーネルプログラムなどをユーザモードで実行させることでセンシティブ命令が特権命令であればトラップが発生して検出することができる。そのとき、ハイパーバイザーで命令をエミュレーションすることでゲストマシンへ仮想的なコンピュータの状態を提供することができる。

しかし
x86アーキテクチャではユーザ権限で実行可能である(トラップされない)にも関わらず、センシティブ命令というものが複数存在している(非特権センシティブ命令)。そのためハイパーバイザーを実装するには困難と言われた。
#### 補足
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613684/3bdc54cb-9bb7-1f0e-0d8c-5e711be45ad6.png)
英語版ウィキペディアのHertzsprungさん, CC 表示-継承 3.0, https://commons.wikimedia.org/w/index.php?curid=8950144による

この上の図はx86のリングプロテクションを示しています。リングプロテクションとは特権レベルを表したもので、OSはRing0(特権モード)、一般プロセスはRing3といった風になっている。OSは直接CPUやメモリとやり取りを行うのでRing0である。一方一般プロセスは最も信頼性がなくRing3という大きな番号が与えられている。外側のリングから内側のリングのリソースにアクセスするにはリング間のゲートを通る必要があり、決められた方法のみでしかアクセスできない。

## x86の仮想化の実現の歴史
|年|出来事|
|:--:|:--:|
|1999年|VMwareが初のx86仮想化製品をリリース|
|2001年|VMwareがサーバ向けハイパーバイザーであるVMware GSX/ESXをリリース|
|2003年|Xen1.0をリリース|
|2003年|Vanderpool Technology(VT)のちのVT-xをリリース|
|2005年|VT-x対応Pentium4が出荷|
|2006年|KVMが開発された|

## x86仮想化実現方法
先ほど述べた通りx86で仮想化を実現することは困難と言われたことがわかったと思う。ではどう実現したかを4通り示す。
### 完全仮想化
完全仮想化は1命令ずつソフトでエミュレートする。他のプラットフォームの模倣もできるが、ソフトですべての命令を処理するので処理速度が遅いという欠点がある。完全仮想化の例としてQEMUがある。
### バイナリ変換
バイナリ変換はゲストOSがRing0のつもりで発行した非特権センシティブ命令のみを特権レベルを動的に変換して処理を行う。通常命令は直接CPUが処理を行う。バイナリ変換の例としてVMwareがある。
### 準仮想化
準仮想化はゲストOSの方で非特権センシティブ命令を仮想マシン向けに書き換える。非特権センシティブ命令の代わりにハイパーバイザコールと呼ばれる命令を呼び出している。ハイパーバイザーをRing0、OSをRing1で実行している。そのため仮想環境でより実機に近い性能が得られるようになった。準仮想化の例としてXenがある。
### x86仮想化拡張
x86仮想化拡張は従来のx86アーキテクチャには仮想マシンの構築を補助する機能が欠けていた。そこでx86自体を仮想化可能なものにしようとした。これを仮想化支援機能といい、IntelはVT-x、AMDはAMD-Vとして実装された。
#### VT-x
VT-xはリングプロテクションの仕組みとは別に「ハイパーバイザーのモード」と「ゲストマシンのモード」が追加された。この「ハイパーバイザーのモード」をVMX Root Mode、「ゲストマシンのモード」をVMX non Root Modeと呼ぶ。VT-xでは通常ゲストOSの命令をVMX non Root Mode上で実行する。ただし仮想マシンが非特権センシティブ命令を実行するとVMX non Root ModeからVMX Root Modeへモード遷移をして、ハイパーバイザーがゲストマシンで実行された命令に対して適切な処理を行う。このときVMX Root ModeからVMX non Root Modeへ切り替わることをVMEntry、VMX non Root Modeが中断されVMX Root Modeへ戻ってくることをVMExitと呼ぶ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613684/ff0f2e53-ab75-fd9c-c1a6-b91ef13456cb.png)



## 参考文献
https://syuu1228.github.io/howto_implement_hypervisor/
https://altus.gmocloud.com/suggest/vm/
https://www.fsi.co.jp/solution/vmware/knowledge/virtualization.html
https://ja.wikipedia.org/wiki/Popek%E3%81%A8Goldberg%E3%81%AE%E4%BB%AE%E6%83%B3%E5%8C%96%E8%A6%81%E4%BB%B6
https://ipsj.ixsq.nii.ac.jp/ej/?action=repository_action_common_download&item_id=60929&item_no=1&attribute_id=1&file_no=1