仮想化

仮想化（かそうか、英語: virtualization）とは、コンピュータのリソースを抽象化することであり、ソフトウェアと物理的なハードウェアの間に抽象化されたレイヤーを提供することで、コンピュータリソースを管理するための様々な技術である。仮想化ソフトウェアを実行しているマシンは、さまざまなオペレーティングシステム(OS)で実行されているアプリケーションを管理できる。サーバー、ストレージデバイス、ネットワークリソースなどのハードウェアプラットフォームをソフトウェアで効果的にエミュレートまたはシミュレートする。一言で言えば、WindowsなどのOS内で別のOSを使用すること。 主にユーザーに提供するコンピュータそのものをハードウェアの詳細から切り離した状態でソフトウェア化する事を指す。ユーザーは画面切り替えの要領で複数のコンピュータを使い分けられる。管理者にとっては、ユーザーに提供するコンピュータに関わる全ての作業をソフトウェアの設定変更のみで行えるようになり、構成変更に掛かる時間が劇的に短縮されるため、物理的な作業では対応できないような管理を行う事が出来るようになる。ソフトウェア化したコンピュータを仮想マシン、仮想マシンを実際に稼動させるハードウェアを物理マシンと呼ぶ。仮想マシンは別の物理マシン上にデータ移動のみで移す事が出来るため、USBメモリなどにも収められる。 「リソースの物理的特性を、そのリソースと相互作用するシステム/アプリケーション/エンドユーザーから隠蔽する技法。単一の物理リソース（サーバ、OS、アプリケーション、補助記憶装置など）を複数の論理リソースに見せかけたり、複数の物理リソース（複数の補助記憶装置群やサーバ群）を単一の論理リソースに見せかけたりできる」という実用的定義がある。また、単一の物理リソースを何らかの特性の異なる単一の論理リソースに見せかけることもできる。そして、仮想回線により、幅が拡がる。 仮想化という用語の起源は古く、1960年代には既に広く使われていた。ネットワーク全体や個々の機能やコンポーネントなど、コンピューティングの様々な面に適用されてきた。仮想化技術に共通する目的は、カプセル化によって「技術的詳細を隠蔽する」ことである。仮想化は、例えばアクセスを多重化したり、異なる物理的位置にあるリソースを統合したり、制御システムを単純化したりすることで、根底にある実装を隠蔽した外部インタフェースを生成する。近年、新たな仮想化基盤や仮想化技術が登場し、この円熟した概念が再び注目されるようになってきた。 抽象化やオブジェクト指向などの用語と同様、「仮想化」という用語は様々な文脈で用いられる。本項では、これを主に以下の2つに分類して解説する。 プラットフォーム仮想化 コンピュータ全体のシミュレーション リソース仮想化 リソースの集合体や部分や単純化されたもののシミュレーション もちろん、仮想化はコンピュータ以外でも重要な概念である。制御システムは複雑な機器の仮想化されたインタフェースを実装したものとも言える。例えば、最近の自動車のアクセルは単にエンジンへの燃料流入量を増やすだけではない。フライ・バイ・ワイヤを使った航空機は、物理的実装よりも単純化されたインタフェースを提供する。 ビジネス構造の観点では、仮想化とは、従来型の事務所や店舗を構えたビジネスから、インターネット上などでビジネスを行う方向に転換していくことを指す。 仮想化と対極に位置する概念が透過性である。仮想化されたオブジェクトは物理的には存在しなくともアクセス可能である。逆に透過性のあるオブジェクトは物理的には存在しているが、利用者にとっては不可視である。 多くの仮想化の形態は、利用者と提供者に関わるデザインパターンでパターン化可能である。利用者と提供者は何らかのインタフェースを使って相互作用する。仮想化は、この両者の間に介在し、利用者に仮想化されたインタフェースを提供すると同時に、提供者にも別の形で仮想化されたインタフェースを提供する。一般に、利用者と提供者の関係は一対多、あるいは多対一、または多対多であり、中間層（仮想化層）だけがその多重性を意識している。 理想的には、仮想化されていない環境で直接やり取りしている利用者と提供者は、仮想化された環境でも修正することなくそのまま機能するのが望ましい。例えば、仮想記憶では物理アドレス空間と利用者の間に中間層（仮想記憶管理層）が存在する。その中間層は複数の利用者をサポートするため、複数の仮想アドレス空間を提供する。利用者と提供者（物理メモリ）は一般にその多重性に気づく必要はない。 1960年代に生まれた「仮想化」という用語は、ハードウェアとソフトウェアの組合せによって実現された仮想機械の登場とともに使われるようになった。同時期にリソース仮想化である仮想記憶も登場している。仮想機械という用語は IBM M44/44X という実験機で初めて使われている。それ以前に IBM CP-40 が仮想機械を実装しており、このときは pseudo machines（擬似機械）と呼ばれていた。「仮想化」にしても「仮想機械」にしても、その意味は時代と共に変化していった。 プラットフォーム仮想化とは、ハードウェアプラットフォーム上でホストプログラム（制御プログラム）が擬似的なコンピュータ環境を生成し、ゲストソフトウェアに対して「仮想機械」を提供するものである。ゲストソフトウェアは、それ自体もオペレーティングシステムであるのが一般的で、あたかも独立したハードウェアプラットフォームにインストールされたかのように動作する。単一の物理マシン上で複数の仮想機械をシミュレート可能なことが多く、仮想機械の個数はホストであるハードウェアリソースによって制限される。ゲストOSとホストOSは一般に同一である必要はない。ゲストシステムは特定の周辺機器（ハードディスクドライブやネットワークカード）へのアクセスを必要とすることが多く、その場合その機器とゲストのインタフェースを提供する必要がある。 プラットフォーム仮想化の手法はいくつか存在する。以下にそれらを列挙する。 エミュレータまたはシミュレータ 仮想機械によってハードウェア全体を擬似的に再現する。全く異なるアーキテクチャのハードウェア向けのゲストOSを修正することなしに動作させることができる。これは、新たなCPUなどのハードウェア開発が完了する前にソフトウェアを並行して開発する手法として使われてきた。具体例としては、Bochs、PearPC、Virtual PCの PowerPC 版、QEMU、Hercules emulator（IBMのメインフレームのエミュレータ）などがある。エミュレーションのための技法は様々で、有限オートマトンを使った技法から、仮想化プラットフォーム上での動的再コンパイル技法まである。 ネイティブ仮想化 同じアーキテクチャのプラットフォーム上で、ゲストOSを隔離された状態で、かつ無修正で動作させる仮想機械。この手法は IBM CP-40 などが起源とされる。メインフレーム以外の領域では、Parallels Workstation、Parallels Desktop、VirtualBox、Virtual PC、VMware Workstation、VMware Server、QEMU、Adeos、Mac-on-Linux、VirtualLogix VLX Virtualizer for VT などがある。 ハードウェアによる仮想化 ゲストOSにハードウェアリソースを割り当て、隔離された状態で動作できるようにする仮想機械。2005年と2006年、インテルとAMDは仮想化をサポートする追加ハードウェアを提供した。例えば、VMware Fusion、VMware Workstation、Parallels Desktop、Parallels Workstationなどがある。 部分仮想化 特にアドレス空間などのハードウェア環境に限って、複数の実体があるようにシミュレートする仮想機械。いわゆる仮想記憶である。プロセスが同時並行して動作できるようにするが、ゲストOSが動作することはできない。一般に仮想機械とは見なされないが、仮想化の歴史上は重要であり、CTSS や IBM M44/44X などで使われ、MVS へと受け継がれた。その後の Microsoft Windows も Linux も、基本的にこの手法を採用している。 準仮想化 ハードウェアを擬似するというよりも、ゲストOSに修正を加えることで利用可能となる特殊なAPIを提供する仮想機械。このようなハイパーバイザのシステムコールを TRANGO や Xen では「ハイパーコール; hypercall」と呼ぶ。Citrix XenServer、VMware ESX Server、Win4Lin 9x、サン・マイクロシステムズの論理ドメイン、VirtualLogix の VLX Virtualizer、TRANGO などがある。 OSレベルの仮想化 物理サーバをOSレベルで仮想化し、複数の仮想サーバを単一の物理サーバ上で動作させる。ゲストOSとホストOSは同一である。あるゲスト環境で動作するアプリケーションから見れば、独立したシステムで動作しているように見える。Linux-VServer、Virtuozzo、OpenVZ、LXC (Linux Containers) 、AIX ワークロードパーティション (WPAR)、Solaris Containers、FreeBSD jail などがある。 コンテナ仮想化 コンテナ仮想化とは、アプリケーションの基盤となる動作環境を仮想化する技術である。 アプリケーション仮想化 セキュリティや信頼性、移植性を強化する目的で、アプリケーションを仮想機械でカプセル化された環境で隔離して実行すること。仮想機械はアプリケーションの実行に最低限必要な要素を備えており、OSとアプリケーションの間の層として動作する。例えば、Java仮想マシン、Microsoft Application Virtualization、Altiris、Citrix XenApp などがある。前述の各種仮想化とは異なる手法であり、Smalltalk、Forth、Tcl、Pコードマシンなどのインタプリタ指向言語の流れを汲むものである。 仮想化技術の進展によって、アプリケーション仮想化とアプリケーションストリーミングといった新たな技法が登場した。 上述のプラットフォーム仮想化の概念から、補助記憶装置のボリューム、名前空間、ネットワークリソースといった特定のシステムリソースの仮想化が生まれた。 リソースの集約/連結/結合などにより、大きなリソースプールを形成する。 仮想記憶 は個々のアプリケーションに別々の仮想空間を提供し、メモリや補助記憶装置の不連続なリソースから連続的な仮想アドレス空間を利用可能にする。 RAIDと論理ボリュームマネージャは、複数のディスク装置を統合して1つの大きな論理ディスクにする。 ストレージエリアネットワークでよく使われる技法として、物理ストレージから論理ストレージに抽象化することをストレージ仮想化と言う。物理ストレージのリソースを1つのプールに集約し、そこから論理ストレージを生成する。物理ストレージ装置はネットワーク上に分散配置可能だが、ユーザーから見れば単一のストレージに見え、集中管理可能である。 チャネルボンディングとは、複数の通信路（インタフェース）を1つの高スループットリンクとして使用する技術。 Virtual Private Network (VPN) とネットワークアドレス変換 (NAT) は、ネットワークの名前空間を仮想化する技術である。 コンピュータ・クラスターやグリッド・コンピューティングは、上述の各種技術を使い、複数のコンピュータから仮想化された大きなコンピュータを形成する。 パーティショニングは、ディスクやネットワークなどの単一のリソースを分割し、利用しやすい大きさや速度の多数のリソースとして利用可能にする。 以下に、仮想化の応用例を列挙する。 サーバ・コンソリデーション 多数の物理サーバを仮想機械によって1つ（あるいは少数）のサーバに統合する。 ディザスタリカバリ 仮想機械によって、一種の「ホットスタンバイ」環境を構築する。バックアップ・イメージを仮想機械上で起動し、現用系のワークロードをそちらに移行させる。 テストと教育 カーネル開発やOS開発における評価や教育用途に仮想機械を用いる。開発中のシステムがハングアップしても、該当する仮想機械を再起動するだけで済む。 ポータブルアプリケーション USBメモリなどの可搬記憶媒体上にアプリケーションをインストールし実行可能とする技術。例えばMicrosoft Windows ではレジストリなどの問題があり、USBメモリ上のアプリケーションを直接実行できないという問題があった。これを仮想化によって解決する手法もある。 ポータブルワークスペース iPodやUSBメモリなどのマスストレージ機器上にポータブルなワークスペースを生成する仮想化技術。次のような製品がある。 アプリケーションレベル – Thinstal – 可搬記憶媒体にインストールされたアプリケーションをドライバを使わずに実行可能にする。 OSレベル – MojoPac、Ceedo、Aargo、U3 – 可搬記憶媒体にアプリケーションをインストールし、別のPC上で利用可能にする。 マシンレベル– moka5、LivePC – 可搬記憶媒体上に仮想機械からOSやアプリケーションを含めた完全なソフトウェア環境をインストールし、任意のマシン上で実行可能にする。 ハードウェア仮想化技術 x86仮想化 - インテルの Vanderpool と AMD の Pacifica Sun UltraSPARC T1 hypervisor IBM PowerVM (旧称 Advanced POWER virtualization)