Memorandum

普段の生活の覚え書き。主に技術録

仮想化技術

ちょっと個人的に試してみたいことができたので、その基礎知識として仮想環境の技術について少し調べてみました。というのもそのやってみたいことが、仮想化技術を使って別のOSで動かす必要があるみたいなので、前々から気になっていた、仮想化技術をもっと知りたいと思いました。

仮想化とは?

本来OSはCPU、メモリ、HDDといったハードウェアへ全面的に依存して動作しています。そのため普通は複数のOSで一つのハードウェアを制御することはできません。それを可能とするのが仮想化技術です。 仮想化技術はハードウェアに起きるアクセス競合を制御し、複数のOSの動作を可能としています。その仮想化技術を応用したソフトが仮想化ソフトと呼ばれ、仮想化ソフトはCPU・メモリ・HDDなどのハードウェア群をソフトウェア的に模倣・再現し、OSが依存しているハードウェアリソースを見せかけ上に用意しています。(エミュレート)

そうして、エミュレートで再現されたハードウェアを「仮想マシン」・「仮想環境」と呼び、仮想マシン上にインストールされたそれぞれのOSを「ゲストOS」と呼びます。 つまり一つのコンピュータ上で複数のコンピュータやOSを起動・動作させられる技術が仮想化技術です。

引用:http://www.atmarkit.co.jp/fwin2k/tutor/virtualization/virtualization_01.html

仮想化技術のメリット

新たな職場や、新規参入するプロジェクトだと、まず初めに環境構築をすると思います。私も今まで何度かプロジェクトを経験してきましたが、その度にそのプロジェクトで使用しているソフトウェアのインストールや、環境設定などを行ってきました。またその環境構築を行うために必要な手順書を作成したり、人が入れ替わるごとに環境構築を行う必要があるので、労力と時間がかかります。仮想化技術ではそのような労力を解消してくれます。一人がOSの設定やソフトのインストールなどを行ってしまえば、その設定を保存したゲストOSを保存し、要因が入れ替わるごとにそのOSを仮想環境で使用してもらえば、一人ひとりが環境構築する手間も省けますし、手順酒などの用意も必要なくなります。また、仮想環境では全て同じ環境・設定なので、環境構築の段階で設定や手順をミスった場合に、原因を探したり、設定し直さないといけないというトラブルも回避できます。

その他にも下記のようなメリットが挙げられます。

  • リソースの有効利用
  • 従来では持て余していたCPUの処理能力やメモリなどのリソースを、複数のOSで分配することによって有効活用が期待できます。また、一台のマシン上で動くので物理的なスペースを確保する必要もありません。
  • 低コスト・省電力
  • 複数のOSを一台で起動していると、単一OSを起動しているときよりは電力を消費しますが、使っていないOSは休止できますし、複数のOSを複数のマシンで起動させるよりは遥かに省電力となります。
  • 高い柔軟性
  • OSが物理的な制約から開放されるので、OSの多台数を一元管理でき、またOSやサーバの立ち上げの高速化、障害などのダウンタイムを最小化しメンテナンスをいつでも実行可能にすることが容易に実現できます。
  • レガシーシステムの再現
  • 旧世代のOSやメンテンスを終了したOSなどで稼働する、既存のサービスを仮想マシンで再現することで、高パフォーマンスを最新のサーバ上で稼働・延命させることが可能です。
  • 耐障害性
  • 仮想マシンはそれぞれが完全に隔離されているため、いずれかがクラッシュしても他の仮想マシンには影響せずそのまま可動するため、仮想マシン同士のサービスで可用性の向上・耐障害性の向上が期待できます。

ちなみにMacに搭載されているBoot Campは仮想化環境ではなく、単純に起動時にOSを選択できるOSローダー機能です。

仮想化の種類と特徴

仮想化の種類には大きく分けてホストOS型ハイパーバイザー型コンテナ型の3種類があります。 概念図として下記の図のようになっています。

参照元https://thinkit.co.jp/story/2014/12/02/5456

それぞれの仮想化の種類について説明していきます。

ホストOS型

一台の物理サーバに対して、一つのOSがインストールされたマシンがあるとします。そこに仮想化ソフトをインストールして、仮想化ソフトを立ち上げて、別のOSを動作させる方式をホストOS型と呼びます。ホストOS型は必ず元々入っていたOS、ホストOSが存在します。

ホストOS型のメリット・デメリット

ホストOS型のメリットとして、手軽に起動できることが挙げられます。既存のマシン環境で、アプリケーション感覚でインストール・起動が可能なため、汎用マシンでの仮想化や検証用途、個人利用で使いやすいです。 反対にデメリットとしては、仮想環境で動作しているOS(ゲストOS)の処理は、ホストOSを経由して行われるため、大きなオーバーヘッドが発生する場合があります。そのため複数のゲストOSを同時に稼働させたい場合などには向いていません。

ソフトウェア

ホストOS型のソフトウェアとして有名なものは、VMware Player、Oracle VirtualBoxなどがあります。 また仮想環境を設定するのに、自動的に設定を行ってくれる「Vagrant」というツールがあります。「box」というVirtualMachine(VM)のベースとなるイメージを指定して、コマンドを実行するだけでOSインストール済みのVMを作成し、ネットワーク設定などの環境の整備までやってくれます。また、VMの構成を「Vagrantfile」というテキストファイルに記述しておけるので、設定の共有や管理を行うことができます。

別の記事で紹介した「N予備校」でもVagrantを使って授業を行っていました。

https://memoran.net/nnn-ed-admission/

ハイパーバイザー型

ホストOS型の短所を補う形で、近年企業に於ける仮想化の主流になっているのが、ハイパーバイザー型と呼ばれる方式です。ホストOS型の場合だと、物理ハードウェアと仮想ハードウェアの間には、ホストOSと仮想化ソフトウェアの二つが介されていました。一方ハイパーバイザー型は、物理ハードウェアの上に「ハイパーバイザー」と呼ばれる仮想化を実現するためのレイヤーが作られ、その上で仮想マシンが実行されます。ハイパーバイザー型はサーバへ直接導入されるので、サーバ全体を仮想化に利用されます。 こちらはホストOSが存在せず、ハイパーバイザーがダイレクトにハードウェアを制御できるので、ホストOS型と比べて、高パフォーマンスが期待できます。

ハイパーバイザー型のメリット・デメリット

ハイパーバイザー型のメリットは、ホストOSの処理が不要となる分、処理速度やレスポンスの向上が期待できる点が大きな魅力です。仮想環境を構築して高パフォーマンスを求めるなら、こちらの方式を選ぶといいでしょう。 デメリットとしては、ホスト型と比べてコストが高くなるという点です。既存マシンに適用できず、新規マシンを用意する必要がありますし、複数の仮想マシンで十分な実効速度を求めるなら、物理マシンのスペックや、ネットワーク環境などもそれなりの投資をしなければなりません。

ソフトウェア

ハイパーバイザー型のソフトウェアの代表例としては、VMware vSphereやHyper-VKVM(Karnel-based Virtual Machine)などがあります。私はハイパーバイザー型の仮想環境を使用したことがないので、知らなかったのですが、無料で使えるソフトもあるみたいですね。

コンテナ型

ホストOS型やハイパーバイザー型に比べ、比較的新しい仮想環境の構築形式がコンテナ型です。コンテナ型仮想化は、ホストOS上でコンテナと呼ばれるアプリケーションの実行環境を複数、簡単かつ高速に実行することができます。他の方式との相違点として、コンテナはホストOSから見ると一つのプロセスとして認識されています。またコンテナは、ホストOSのカーネル(OSの中核)部分を共有するため、各コンテナにはOSが導入されていません。つまり既存のOS(ホストOS)のみ存在し、各種OSをインストールする必要がありません。

コンテナ型のメリット・デメリット

OS部分を一部ホストOSと共有するため、VMごとにOSをインストールする作業がなく、利用開始までの時間が短いです。またコンテナはホストOSから見ると単一のプロセスであるため、オーバーヘッドがほぼなく、処理速度やレスポンスも早いです。 デメリットとしては、土台となるOSと異なるシステムをコンテナとして稼働させることができません。元々Linuxカーネルを想定して開発されているため、土台となるOSもLinuxなのでWindowsMacでは要件次第で対応できない場合もあります。

ソフトウェア

コンテナ型のソフトウェアとしてDockerがあります。サポートは基本的にLinuxOSのみでしたが、要件の内容次第でMacWindowsでも対応できるそうです。

まとめ

私が利用したことがある仮想化技術はホストOS型のVirtualBoxvagrantだけですが、調べてみると様々仮想化技術があり、それぞれ特徴が違うことが分かりました。私が利用しているVPSもこの仮想化技術を使用していて、主にハイパーバイザー型やコンテナ型を利用しているそうです。

冒頭で出てきた試してみたことというのがDockerを使ったことだったので、調べているうちにどの環境でもできるという訳ではないことが分かりました。そのため実際にできるか分からないのですが、できるようでしたらやってみて内容をこのブログで書いていこうと思います。