仮想化の定義と仮想化技術の基礎知識

日本語 品詞 英語 意味
仮想 名詞 imagine
suppose
実際にはない物事を、仮にあるものとして考えてみること
仮想の 形容詞 imaginary 想像上の、空想の

このように、Virtualという言葉と仮想という言葉は、ニュアンスが異なります。Virtualという形容詞は「実際と同じ」というニュアンスを持っており、Realつまり「実在の延長上」にあります。

コンピュータにおける仮想化

コンピュータにおける仮想化には、いくつか種類があります。コンピュータ自体を仮想化する技術には、ハードウェアによる分離、完全仮想化、準仮想化があります。また、OSの機能として、デバイスの一部を仮想化する機能があります。

HPE(ヒューレット・パッカード)、IBM、Sun Microsystems(現Oracle)が提供していた高可用サーバには、ハードウェアパーティショニングという技術がありました。これは、1つのマシンのハードウェア(CPU/メモリ/ストレージ/ネットワークカードなど)を分離し、そこに本体とは別のOSをインストールし使用可能とするものです。またOracleが提供するLDOM(Logical Domains)は、いくつかのCPU/メモリ/ストレージを論理的に分割して割り当て、1つのマシンとして使用できます。

「完全仮想化」はホストマシンでCPUや物理マシンをエミュレートする仮想マシンを使用します。仮想マシン上でOSを動作させるため、ホストOSとは異なるアーキテクチャ/OSをインストールして使用可能です。現在、多くのVPSやクラウド(IaaS)で使用されている仮想化は、この完全仮想化を使用しています。

「準仮想化」はホストマシンの一部を論理的に切り出して使用します。ホストマシンのリソースを論理的に分離し、OSもしくはアプリケーションだけを動作させます。Docker、Kubernetesなどで使用されているアプリケーションのみを動作させるアプリケーションコンテナや、OpenVZ/lxd/lxcなどのOSを動作させるOSコンテナがこれにあたります。

仮想化の歴史

メインフレームにおける仮想化

仮想化技術の歴史は古く、50年以上前のメインフレームでも開発されてきました。50年前のコンピュータは、現在でもメインフレームと呼ばれ使用されていますが、筐体が大きく非常に高価なものでした。そのため、そのハードウェアリソースを効率的に使用するために、様々な技術が開発されました。

「タイムシェアリング」はCPUを短い時間で区切り、処理を切り分ける方法です。CPUリソースは貴重であったため、データの入出力などのCPUが処理を行わない時間に、別のプロセスを実行するために作られました。当時は入出力に時間がかかり、余裕が生まれたCPUリソースを有効に使用できました。CPU数が増え、CPUリソースが潤沢になった今日でも、同じようにタイムシェアリングでCPUを有効に使用しています。

下図は、タイムシェアリングのイメージです。基本は処理中のプロセスを順番に処理しますが、プロセスAのI/O待ち時間の際はプロセスBを実行します。すべての処理が待ち時間のときは、CPUが処理待ちの状態になります。

「スワップ」は、メモリが足りなくなったときに、空きメモリを確保される際に使用されます。使用していないプロセスのメモリ情報をストレージ上のスワップ領域に書き出すことで、空きメモリを確保します。スワップ領域を増やすと、使用可能なメモリ量が増えるため、仮想メモリとも呼ばれます。

下図はプロセスCのメモリ領域を確保するために、処理待ち中のプロセスBをストレージ上のスワップ領域に書き出すイメージです。プロセスBの処理が開始する際は、別のプロセスのメモリ領域をスワップ領域に書き出し、プロセスBのメモリ領域をメモリ空間に書き出します。ストレージ上のスワップ領域は書き込み速度がメモリ空間より遅いため、スワップを繰り返すと処理速度が落ちることになります。

スワップを利用するにあたり、ハードウェア上にある物理メモリ空間と、OS内で管理する仮想メモリ空間に分け、両者のメモリアドレスを効率よく変換可能になりました。

UNIXライクOSにおける仮想化

1969年に開発されたUNIXは、現在でも多く利用されているOSです。現在、多くのクラウドで使用されているLinuxは、1991年に開発が開始されたUNIXライクOSです。

UNIXでも、メインフレームで開発されたタイムシェアリングやスワップが使用されています。UNIXは、タイムシェアリングを使用して、複数ユーザで複数プロセスを同時に使用できるマルチタスクOSです。その後、C言語でOSが書かれるようになり、このソースコードを非商用目的で配布した時期があります。そのおかげで、BSDなどの派生OSが作成され、多くの新しい試みがUNIXへフィードバックされるようになりました。その中でも、TCP/IPでのネットワーク接続やその派生技術は、UNIXのその後に大きな変革をもたらしました。

「NFS(ネットワークファイルシステム)」は、他マシンのストレージリソースをネットワーク経由でマウントする技術です。ファイルシステムの上のUID/GIDをそのまま使用できるため、UID/GIDやホスト名を共有するNIS(Network Information Service) とともに多く使用されました。

UNIX上でGUIを実現した「X Window System」は、ネットワーク経由での使用が考慮されています。ネットワーク上の他マシンで起動したX Windowアプリケーションを自マシンで使用可能です。また、XDMCP(X Display Manager Control Protocol)を使用して、他マシンのデスクトップをそのまま使用できます。つまり X Window Systemは、デスクトップおよびデスクトップアプリケーションの仮想化とも言えます。

これらの技術は、UNIXライクOSであるLinuxで、現在でも使用可能です。

Linuxにおける仮想化

Linuxが実用できるようになった1990年代後半から、完全仮想化の実装が始まりました。いくつかの、エポック的な仮想化技術を挙げてみましょう。

・VMware
「VMware Workstation」は、VMwareが開発した仮想化技術で、世界初のx86アーキテクチャを仮想化するソフトウェアです。VMware はその後も、サーバ・クライアント上でOS・アプリケーションを動作するソフトウェア製品をリリースし続け、現在のx86仮想化の最先端と言えます。

VMwareが提供する「vSphere」は、オンプレミス型のサーバ上で仮想マシンを作成するソフトウェアです。これを使用して、仮想マシン自体を提供するVPS(Virtual Private Server)として提供したサービスも生まれました。その後も、仮想マシン自体を動作させながら別マシンに移動するライブマイグレーション、ネットワーク仮想化機能などを開発し、商用の仮想化ソフトウェアを代表する製品となりました。

近年では、パプリッククラウド上で仮想マシン管理や、オンプレミスのVMwareとの連携など、クラウドが当たり前になった現在でも注目を集める仮想化技術です。

・qemu
「qemu」は複数アーキテクチャのCPUをエミュレートするソフトウェアで、オープンソース(GPLv2)で開発・公開されています。

qemuには2つの使用方法があります。1つは、プロセス上の処理をホスト上のシステムコールに変換して実行する「ユーザエミュレーション」、もう1つは、複数アーキテクチャの仮想マシンをエミュレートする「システムエミュレーション」です。ユーザエミュレーションは、異なるアーキテクチャのクロスコンパイルなどで使用されます。システムエミュレーションは、いわゆる完全仮想化で、LinuxではXen、KVMなど複数のハイパーバイザーとともに使用されます。

qemuの大きな特徴として、x86、PowerPC、SPARC、ARM、RISC/Vなど、多くのCPUを高速にエミュレーション可能なことです。また、仮想マシンとして使用するための仮想デバイスも多く用意され、様々なOSをエミュレートできます。

・CPUの仮想化支援
完全仮想化技術は、どうしてもエミュレータを使用するため、実メモリからOS側のメモリ空間へ、さらに仮想OSへのメモリ領域変換のオーバーヘッドが発生します。また、ストレージ、ネットワークなども、仮想マシン専用に機器を割り当てない限り、オーバーヘッドが発生します。

そこで、x86系CPUを提供するIntelは「VT-x」という仮想化を支援する機能を追加しました。VT-xは、CPUに命令を追加することで、仮想マシンの実行、仮想マシン内のメモリと実メモリの変換など、複数の仮想マシンの実行を支援する機能です。同じような機能を、AMD社が提供するx86系CPUでも「AMD-V」という機能で実現しています。

・コンテナ
マシンの一部を分離し、別アプリケーションを閉じた環境で動作される技術があります。一番古い実装はchrootコマンドを使用し、プロセスやディスクのみを分離した実装です。その後、いくつかの実装がありましたが、現在主流になってきたのが「コンテナ型の仮想化」です。その中でも、アプリケーションコンテナの実装であるコンテナは、クラウドネイティブの中核技術となっています。

おわりに

今回は連載の第1回として、仮想化の一般的な定義づけと、コンピュータ、特にUNIXライクOSで使用されている仮想化技術について解説しました。仮想化という技術は歴史が深く、今使われている技術の多くは、ハードウェアを仮想化し、リソースを抽象化する技術であるとも言えます。

本連載では、今回で解説した各技術の深い部分について、掘り下げて解説していきます。次回は、完全仮想化について説明します。お楽しみに!

Original Post>