コンテンツにスキップ

サーバ仮想化の基礎知識

サーバ仮想化とは

情報科学の分野では、「仮想化」という単語は非常に多くの意味を持ちます。 たとえば、ネットワークの仮想化やストレージの仮想化、メモリの仮想化などが挙げられます。
 本講義でのサーバ仮想化とは、以下を指します。

  • 1 台の物理的なマシンの上に、複数の仮想マシンやアプリケーション環境を走らせること

なぜサーバを仮想化したくなるのか?

みなさんは、C 言語や Python の開発ツールのインストールに困ったことはありませんか? また、作った開発ツールを手軽に友達に渡したり、別のマシンに移植したいと思ったことはありませんか? サーバ仮想化の技術を知ることで、これらの問題を簡単に解決できます。
もちろん、解決できるのはこれらの問題だけではありません。 サーバ仮想化の技術は、実際のアプリケーションの開発現場で問題となってきた多くの問題点を解決できます。 たとえば、ユーザーのニーズに合わせたサーバの自動起動や自動停止、大人数での大規模アプリケーションの開発などです。 サーバ仮想化の技術を知ることで、いろいろな問題を解決できるのです。

サーバ仮想化のメリット・デメリット

サーバを仮想化するとメリットも多いのですが、デメリットもあります。

メリット

いろいろなメリットが考えられますが、主なものを以下に列挙します。

  1. 物理マシンのリソースの有効活用
  2. アプリケーションの実行環境の簡素化
  3. セキュリティの向上
  4. 動的なシステム規模の拡大縮小
  5. システム運用の効率化

1 と 2 は、1 台の物理マシン単独でもメリットとなります。 1 は、定義で示したように、複数のアプリケーションを 1 台の物理マシン上で動作させることで、リソースを有効活用できます。 2 は、アプリケーションに必要な環境をまるごと仮想化することで、別のマシンでも手軽に環境を再現できます。

3,4,5 は、特に、数百台大規模なシステムを管理・利用する場面で効果を発揮します。1 3 は、アプリケーションをホスト OS から隔離することで、悪意ある第三者からの攻撃の被害を最小限に抑えることが挙げられます。 4 は、ユーザーの数や計算負荷が大きく変動する場合に有効です。負荷に追従して、アプリケーションやサーバの数を増減させることで、コストを最適なものにできます。 5 は、いろいろなアプリケーションが複雑に絡み合い、負荷が変動する場合に効果を発揮します。負荷に応じてアプリケーションを増減させることが容易になります。 たとえば、アプリケーションどうしの関連性を設定ファイルに記載しておくだけで、誰でも簡単にシステムを構築できます。

デメリット

デメリットは多くはありませんが、以下のようなものが挙げられます。

  1. アプリケーションどうしの関連が理解しにくい
  2. 利用のコストが見えにくい

1 は、複雑なサービスを運用する場合に問題となります。 たとえば、米 Netflix 社では、700 以上ものコンテナが複雑に絡み合ったシステムを稼働23させているそうです。 このような大規模かつ複雑なシステムでは、サーバ仮想化を行ったとしても全体像を把握することが簡単ではないと考えられます。

2 は、ユーザーの観点とシステムの観点から問題となります。 ユーザーの観点からは、サーバ仮想化技術は習得にそれなりに時間がかかり、学習コストがそれなりに高いものになります。 また、システムの観点からは、どのくらいの数の仮想マシンやアプリケーションが稼働するかを正確に予測することは簡単ではありません。 そのため、物理マシンの利用代金など、金銭的なコストを予想することが難しくなってしまいます。

2つのサーバ仮想化技術:ホストOS型とハイパーバイザー型

現在利用されているサーバ仮想化技術には、ホスト OS 型ハイパーバイザー型の 2 種類があります。 ハイパーバイザー型はType-1と2があり、けっこう違います。 ここでは、それぞれの特徴と違いを簡単に説明します。

これらの仮想化術は、「物理的なマシンの上で仮想的な環境を動作させる」という点では、類似した目的を達成できます。 そのため、ひとまとまりで扱われることがよくありますが、技術的にはかなりの部分で別ものであり、特徴も異なります。 また、利用場面も異なるため、注意が必要です。

どちらも、物理的には 1 つのマシンの CPU やメモリを利用しているため、むやみやたらにたくさんのアプリケーションを動かすと全体として動作が緩慢になったり、動作しなくなってしまいます。 しかし、一時停止やスリープのようなことができるので、必要なときだけ動作させてリソースを有効活用できます。

  

コンテナ型

この方式は、非常にざっくり言うと、アプリケーション 1 つ 1 つを仮想化する技術です。ホスト OS の上でコンテナ型 仮想化技術ソフトウェアが動き、そのうえで直接アプリケーションが動作します。ゲスト OS がないため、軽量かつ柔軟な運用が可能です。コンテナ型の仮想化でも、Ubuntu をホスト OS とし CentOS をゲスト OS として動かすことができます。また、OS を共有するため、セキュリティの面ではホスト OS 型よりも見劣りします。単純に「コンテナ」と呼ばれることもあります。
本講義では、Dockerというコンテナ型仮想化技術ソフトウェアを利用します。

ハイパーバイザー型(Type-1)

この方式は、非常にざっくり言うと、OS をまるごと仮想化する技術です。 Type-1 ハイパーバイザー型は CPU の仮想化支援機能(Intel VT-x / AMD‑V)を直接利用し、物理ハードウェアを直接的に管理します。 マイクロソフトが開発するHyper-Vは、Windows の下にある追加機能ではなく、物理マシンの直上に常駐する ベアメタルハイパーバイザとして動作しています。 これをType-1と呼び、 つまり、OS がハードウェアを直接制御しているように見えても、実際には Hyper‑V がすべての CPU・メモリ・デバイスアクセスを仲介し、その上で Windows を含む複数の OS を並列に動かしています。

ハイパーバイザー型(Type-2)

この方式は、ハイパーバイザー型(Type-1)と同様にOS をまるごと仮想化する技術です。 物理マシンの直上ではなく、ホスト OS の上で仮想化技術ソフトウェアが動き、そのうえでゲスト OS が動作します。 この方式はType-2 ハイパーバイザー型と呼ばれます。 ゲスト OS は、ホスト OS とほぼすべてのことができますが、ほぼすべてのことができるため動作が重たいです。たとえば、Windows をホスト OS とし、そのうえで Ubuntu をゲスト OS として動かすことができます。また、ホスト OS とは完全に隔離されているので、もっともセキュアな仮想化技術です。単純に「仮想マシン」と呼ばれることもあります。 本講義では、Oracle VM VirtualBoxというホスト OS 型仮想化ソフトウェアを利用します。

ホストOS型とコンテナ型の組み合わせ

以下の図のように、上記の 2 つの方式を組み合わせて利用することもできます。
ホスト OS の上でホスト OS 型仮想化技術ソフトウェアが動き、そのうえでゲスト OS が動作します。さらに、ゲスト OS でコンテナ型仮想化技術ソフトウェアが動き、そのうえでアプリケーションが動作します。 複雑なように見えますが、AWS (Amazon Web Service)GCP (Google Cloud Platform)さくらインターネットのVPSなど、多くのクラウドサービスはこの形式でユーザーにサーバを提供しています。

本講義で扱う仮想化ソフトウェア

本講義では、WSL2を使ってUbuntuをインストールし、その上でコンテナ型仮想化ソフトウェアとしてDockerを利用します。

Docker

Dockerは、コンテナ型仮想化技術ソフトウェアの事実上の業界標準です。完全に無償の OSS (Open Source Software) で、Windows, Linux, macOS 向けのものが提供されています。

アプリケーションとその実行環境をDocker コンテナと呼び、コンテナを実行するために必要なファイルや情報をひとまとめにしたものをDocker イメージと呼びます。また、Docker イメージをテキストファイルとして書き出したものをDockerfileと呼びます。Docker イメージ自体は、一般的には数百 MB 程度です。Docker イメージはDocker Hubからダウンロードして使うことが想定されています。このダウンロードのことを pull と呼びます。Docker Hub には、多種多様なアプリケーションが登録されており、pull すれば即座に使える状態になっています。
 たとえば、プログラミング言語 (Python, Java)、Linux のディストリビューション (Ubuntu, Fedora)、Web サーバ (nginx, Apache)、ホームページ作成環境(Wordpress, drupal)、データベース (PostgreSQL, mongoDB)などが登録されています。ユーザーは、目的のアプリケーションの Dockerfile を見つけて、docker pull hello-world とコマンドをたたくだけで、Docker イメージのダウンロードや構築が自動的に行われます。

Docker コンテナは単独で利用することもできますが、多くの場合、複数のコンテナを連携させて大きなアプリケーションを構築する場面で利用されます。それぞれのコンテナはホスト OS のファイルやコンテナ間の仮想ネットワークを介してデータのやりとりを行います。たとえば、WordPress の場合、Web サーバと WordPress を実行するコンテナと、コンテンツを管理するデータベースを実行するコンテナが分離されており、2 つを実行して両者を仮想ネットワークで接続することで初めて WordPress を利用できます。
複数のコンテナの連携や接続関係を記述する方法に、docker-composeがあります。docker-compose を利用することで、複数の Docker イメージのビルドや各コンテナの起動・停止の順番などを自動的に行うことができます。

WSL2 (Windows Subsystem for Linux 2)

WSL2 は Hyper‑Vと呼ばれるハイパーバイザー型(Type-1)の仮想化技術を利用して、WindowsとLinuxカーネルの両者を並列にネイティブで動かす仕組みです。 Hyper‑V は CPU の仮想化支援機能(Intel VT-x / AMD‑V)を直接利用し、物理ハードウェアを完全に管理しています。 また、Hyper-VはWindows の下にある追加機能ではなく、物理マシンの最上位に常駐する Type‑1(ベアメタル)ハイパーバイザとして動作しています。 つまり、OS がハードウェアを直接制御しているように見えても、実際には Hyper‑V がすべての CPU・メモリ・デバイスアクセスを仲介し、その上で Windows を含む複数の OS を並列に動かしています。

Oracle VM VirtualBox

WSL2やDocker以外に重要な仮想化ソフトウェアとして、Oracle VM VirtualBoxが存在します。 VirtualBoxは、2007 年に初版が提供された老舗のハイパーバイザー型(Type-2)仮想化ソフトウェアです。個人利用の場合には無償で、Windows, Linux, macOS で動作します。

複数のゲスト OS を動作させることができ、それぞれ完全に独立したものとして扱われます。各ゲスト OS は、起動、終了だけでなく、一時停止やスナップショット、複製を行うことができます。また、各ゲスト OS の起動時には、それぞれが物理マシンの CPU やメモリを専有してしまうため、複数のゲスト OS を動作させる場合には調整が必要です。また、ゲスト OS が使用するメモリの総和は、物理マシンが搭載する物理メモリを超えても動作はしますが、動作は緩慢になります。ストレージについては、複数のゲスト OS が利用するストレージの総和は、物理マシンが搭載するストレージ容量を超えてはいけません。VirtualBox では、ストレージは「仮想ディスクイメージ (Virtual ディスク Images)」と呼ばれる専用の形式が利用されています。

たとえば、8 論理コア CPU の Windows マシン上で、4 コア CPU を専有する Ubuntu を 1 つ動作させることは可能です。しかし、ここに追加で 8 コア CPU を専有する CentOS を動作させることはできません。CentOS を動作させたい場合は、Ubuntu を停止する必要があります。