AWSやAzureと戯れる前に知っておいてほしいコンピュータの仮想化技術

#仮想化のメリットとは

2021年においては、コンピュータの仮想化は当たり前の技術となりました。

新人プログラマ応援キャンペーンを機に書いてみて思いましたが、２０２１年はそもそもこんな仮想化技術のレイヤは意識せずにすっ飛ばして、AWSやAzureのサービスレイヤで物事を考えて使う時代なんだと思いました。それだけ世の中クラウド化が進んだのでしょう。ですが、技術者において、

「自分で自由にいじれる環境を持っておく」こと

は、基本的なネットワークのスキルや、インフラのスキル、サーバーとは、クライアントとは、ミドルウェアとは、と実感を持って検証して技術を遊びながら試して学べる絶好の遊び場です。たとえ大きなシステムの一担当プログラマであったとしても、ソフトウェアさえ手に入れば（ライセンスをおかなさい範囲で評価版を活用するなどで可能）、ほぼ無償で自力で一つのシステムを構築し、壊して、また直す訓練ができます。遭遇したトラブルにも、自分でなんとかして解決できるようになれば、もう実戦でもなんとかなる問題解決力が身に付きます。

まさに新人プログラマに向けて伝えておきたいなと思いました。



#仮想化技術について
なぜこれほど、コンピュータを仮想化することが進んだのでしょうか。端的にそのメリットを言うと、「コンピュータのハードウェアにまつわるさまざまなコストが、仮想化することで効率的になりコストが下がるから」です。

「コストが下がる」と言うのは、時と場合によります。また、利用するプラットフォームの捉え方によっても、そのコスト構造は異なります。なので、実際にどう言う仕組みで動いているかを知り、正しく仮想化技術を使ってコストを下げましょう。

#コンピュータの仮想化方式

仮想化方式は、従来から大きくホスト型とハイパーバイザー型に分けられます。近年では、「コンテナ型」の仮想化技術も活用されています。

##ホスト型

ホスト型は、主に単体で動かす想定のPersonal ComputerやServerで利用されます。

通常パソコン本体のハードウェアとOSやアプリケーションはしっかりと紐づいていますから、本来そのOSやアプリを動かすためだけに作られています。ホスト型で仮想化ソフトを動かす際は、そのコンピュータを買うときにホストにもう一台のコンピュータを動かせるだけの余力を作ってサイジングすることが必須です。
つまり、ホスト型では１台あたりの端末コストは上げないと、まともに動かず使えません。

なぜ、仮想化するのでしょうか。ホスト型の仮想化の目的は、主にシステム開発・検証用途、教育・プレゼン用途で使われます。たとえば、展示会でデモをする端末であれば、サーバーとクライアントを分けて構築してネットワークで繋ぐより、AllinOneで組み上げた方がネットワークのトラブルが少なくなり、安定したデモを実現できます。検証用の端末であれば特定の状態の環境を作った後、物理マシンであれば戻すのは容易ではありませんが、仮想マシンであればその状態をコピーしたり、保管して、もう一度再現することが可能です。

このような「運用上のコスト」が、ホスト型の仮想化ソフトでは削減することができます。

Windowsのパソコンであれば、以下の３つのツールがそれぞれ無償で使えます。

### Hyper-V
:Microsoft製
Windows10　標準（無償・機能を有効化するだけ）で使える、仮想化ソフトです。Microsoft社製なので、Windows ServerのHyper-Vへの移行が容易です。

### [VMware Workstation Player](https://whiteboard-world.com/2021/04/07/how-to-use-vmware-workstation-player/)
:VMware製
個人的な利用であれば無償で使える仮想化ソフトです。VMware社製製品なので、仮想マシンを Workstation から ESX/ESXi ホストにエクスポート（変換）するのが容易です。

### VirtualBox
:Oracle製
無償ライセンスとして、Macでも使えるため、広く一般に仮想マシンにパッケージングした状態で配布したい場合にお勧めです。

なお、Mac OSであれば、無償のVirtual Boxを使うか、有償のVMware FusionかParallels Desktopです。

##ハイパーバイザー型

ハイパーバイザー型とは、サーバーへ直接インストールし仮想マシンを稼働させる方式です。１台の物理サーバーで複数台のサーバーを動かせるため、CPUやメモリなど、１台のコンピュータでは使いきれないリソースを共有して、結果的にコストが下がります。しかし、１台のサーバー上に複数の仮想マシンが動くため、物理サーバーの故障やメンテナンスに難を抱えてしまいます。そこで、物理サーバーは通常２台以上を組み合わせ、共有ディスクにデータを保管します。ハイパーバイザーだけであれば、無償のものを使っても良いのですが、このような弱点を持つサーバーに高可用性を持たせる機能などに価値があり、有償で高価なハイパーバイザーの管理ソフトが業務用途では必須の構成要素になります。

ハイパーバイザー型では、高性能なコンピュータにCPUやメモリをたくさん詰め込んでおき、それ上で複数台のコンピュータをリソースを共有しながら動かすことで、コストを削減します。個々に物理サーバーを用意してクラスタを組むよりは安くなりますが、もし１台のサーバーを動かすためだけに仮想化するのは逆に高くつきますので注意しましょう。

主に以下の４つのハイパーバイザーが有名です。

### VMware vSphere ESX
:VMware製
一番メジャーなハイパーバイザーです。VMwareの利用者登録をすれば、無償でハイパーバイザー部分だけ利用できます。（複数のハイパーバイザーとなるサーバーを管理するためには、有償のライセンスが必要ですが、検証用途かつ可用性を求めなければこれでまず十分です。）

### Hyper-V
:Microsoft製
OS標準（無償・機能を有効化するだけ）で使える、仮想化ソフトです。普通にホスト型で機能をOnにして使っても良いのですが、ハイパーバイザー型で必要な部分のみで動かすことでより効率良くなります。＊インストール時にOSのCore部分のみとしなければ、ハイパーバイザ型になりません。

###Ctrix Xen
:Citrix社製
Xen Desktopという仮想デスクトップソリューションを使う時によく利用します。あまりメジャーでないため、全体的な管理の都合上XenDesktop自体VMware vSphere ESX で動かすこともあります。

### KVM （Kernel-based Virtual Machine）
:Linuxコミュニティ
Windows を動かすためにわざわざKVMを使う必要はありませんが、AWSやGoogleのクラウド基盤や、OpenStackなどの仮想基盤で利用するハイパーバイザーとしてはKVMが採用されることが多いです。

## コンテナ型
### Docker docker
コンテナを管理、実行するためのソフトウェアです。dockerさえ入っていれば、どのような環境下でもコンテナで同じアプリケーションを作って実行することができる点で、とても便利でしょう。有名なオープンソースのWebアプリケーションも、最近はOSに直接インストールできるInstaller形式でなく、Docker形式でパッケージを配布していたりします。利用者にとっては、そちらの方が簡単ですし確実なので、より便利になってきている印象です。

###kubernetes
コンテナ化したアプリケーションのデプロイ、管理、スケーリングが可能なソフトウェアです。コンテナ型がでシステムを作る際、力が発揮される例としてマイクロサービスアーキテクチャのシステムが考えられます。
逆に、１つの簡単なアプリケーションを動作させるためにコンテナの環境を作るのは、やることが増えるだけで作業工数が高く付きます。

#まとめ

この記事では、仮想化の主な方式と、実現するソフトウェアについて解説しました。

仮想化と合わせて、クラウドという用語がよく出てきますが、仮想化＝クラウド　ではありません。仮想化は、あくまで上記のような技術であり、クラウドは「ネットワークを通じたコンピューティングのサービス」です。その基盤として近年仮想化技術が活用されているだけなので、仮想化技術が活用されていても、”所有”を前提としたコンピューティングの提供はクラウドではありません。

最後まで読んでいただきありがとうございました。

各ソフトウェアに関して、より知りたい方は次のアクションをお勧めします。

各インストール手順を探してみる：
Google で以下の文字で検索すれば、Qiitaの記事がたくさんヒットします。
例えば、「VMware Workstation Player」であれば・・・

#Googleで以下の文字検索
site:qiita.com VMware Workstation Player　

#参考資料
[私のブログ](https://whiteboard-world.com/2021/04/02/computer_virtualization/)
[VMware Workstation Playerのサイジング方法](https://whiteboard-world.com/2021/04/07/how-to-use-vmware-workstation-player/)