インフラ●●○○○

仮想マシン

物理マシンの上にソフトウェアで作られた仮想のコンピュータ。クラウドの基礎技術。

概要

仮想マシン(VM: Virtual Machine)は、1台の物理コンピュータの上にソフトウェアで作り出した「もう1台のコンピュータ」です。CPU・メモリ・ディスク・ネットワークカードといったハードウェアをソフトウェアで模倣し、その上に本物と同じようにOSをインストールして動かします。中で動くOSから見れば、自分が物理マシンの上にいるのか仮想マシンの上にいるのか、原則として区別がつきません。

この技術のおかげで、1台の物理サーバの上に、互いに完全に独立した複数のマシンを同居させられます。AWSのEC2をはじめ、クラウドで「サーバを借りる」ときに手元に来るものの実体は、ほとんどの場合この仮想マシンです。手元のPCでWindowsの中にLinuxを動かす、といった開発用途でも日常的に登場します。

なぜ生まれたか

仮想化以前のサーバ運用は「1台の物理マシンに1つの役割」が基本でした。アプリケーション同士がライブラリのバージョンや設定を奪い合って壊れるのを避けるには、物理的に分けるのが確実だったからです。しかしその結果、CPU使用率が数%しかないサーバが何十台も並び、購入費・電気代・設置スペースが膨れ上がるという無駄が常態化していました。

仮想マシンはこの「隔離したい」と「集約したい」という相反する要求を同時に満たします。1台の高性能な物理マシンの上に隔離された仮想マシンを複数載せれば、ハードウェアの利用効率を大きく高めながら、環境同士の干渉は防げます。さらにマシン全体がただのファイル(ディスクイメージ)になるため、複製・バックアップ・別ハードウェアへの引っ越しが劇的に容易になりました。この性質こそが、後のクラウドコンピューティングを成立させた土台です。

詳細

ハイパーバイザという仕組み

仮想マシンを実現する中核ソフトウェアを「ハイパーバイザ」と呼びます。ハイパーバイザは物理マシンのCPUやメモリを分割し、各仮想マシンに割り当て、仮想マシンが発行するハードウェア命令を安全に仲介します。ハードウェア上で直接動くType 1(ベアメタル型: VMware ESXi、KVM、Hyper-Vなど)と、通常のOSの上のアプリケーションとして動くType 2(ホスト型: VirtualBox、VMware Workstationなど)に大別されます。データセンターやクラウドの基盤はType 1、開発者が手元で使うのはType 2が中心です。

かつてはハードウェアの模倣をすべてソフトウェアで行っていたため性能低下が大きな課題でしたが、CPU自体が仮想化を支援する機能(Intel VT-x、AMD-V)を備えるようになり、現在では物理マシンに近い性能で動作します。この「実用に耐える性能」の達成が、2000年代の仮想化の爆発的な普及を後押ししました。

仮想マシンがクラウドを支える

クラウドコンピューティングのIaaS(Infrastructure as a Service)は、巨大なデータセンターに並んだ物理サーバ群の上で、ハイパーバイザが顧客ごとの仮想マシンを切り出して貸し出す仕組みです。「数分でサーバが1台手に入る」「不要になったら即座に消せる」という体験は、マシンがソフトウェアで作られたただのデータだからこそ可能になっています。他の顧客と同じ物理マシンに同居していても互いに干渉できない、という強い隔離性も、マルチテナントのクラウドには不可欠な性質です。

スナップショットとイメージ

仮想マシンのディスクやメモリの状態は、ある瞬間のコピー(スナップショット)として保存できます。危険な変更の前にスナップショットを取り、失敗したら巻き戻す — 物理マシンでは考えられなかった運用が可能です。また、OSとミドルウェアをセットアップ済みのディスクイメージ(AWSのAMIなど)をテンプレートとして用意しておけば、同じ構成のサーバを何台でも複製できます。これはスケーリング、特にサーバの台数を増やすスケールアウトの基本手段になっています。

コンテナとの対比

仮想マシンの弱点は「重さ」です。1台ごとにOS丸ごとを抱えるため、イメージは数GB規模になり、起動にも数十秒から数分かかります。この重さを嫌い、OSカーネルを共有したままプロセスレベルで隔離する技術として広まったのがコンテナです。隔離の強さと引き換えの重さ(仮想マシン)か、軽さと引き換えの浅い隔離(コンテナ)か — 両者はトレードオフの関係にあり、実際のクラウドでは「仮想マシンの上でコンテナを動かす」という重ね着が標準的な構成になっています。セキュリティ境界として強い隔離が必要な場面、Windowsなど異なるOSを動かしたい場面では、今も仮想マシンが選ばれます。

両者の層構造を並べると、違いは「OSを丸ごと抱えるか、カーネルを共有するか」の一点に集約されます。

仮想マシン方式コンテナ方式アプリケーションゲストOSVMごとにOSを丸ごと持つハイパーバイザ物理マシンアプリケーションコンテナランタイムホストOSのカーネル全コンテナで共有物理マシン
層構造の比較 — 仮想マシンはOSを丸ごと抱え、コンテナはカーネルを共有する