仮想化やコンテナとプログラムの関係

そもそもプログラムって何? に対して、"仮想化したときに結局ハイパーバイザー が何をしているか分からない”というコメントを頂いたので、仮想化やコンテナについて追加で執筆したい。なるべく仮想化の全体概要や分かりやすさを重視して説明してみたい。 1. 仮想化されるとプログラム的に何が変わるか? 仮想化とは、エミュレート機能を使って物理ハードウェアを”仮想的に”実現する(Virtual Machine)仕組みである。そのため、OSやプログラムから見ると、普通の物理ハードウェア上に動作しているように見える。 Hypervisorの導入によってできるようになること Hypervisorによってエミュレートすることで、仮想化された環境では3つの機能が追加される。 ハードウェア機能の 抽象化 /互換性 ハードウェアの各種機能をHypervisorがエミュレートすることで、OSやプログラムはハードウェアの変更や機能差分の影響を受けなくなる。 その結果として、ハードウェアが進化したとしても、古いOSやプログラムを継続的に利用できるようになる。 プログラム間の 分離 HypervisorがVM間のアクセスを抑止することで、1つの物理ハードウェア上に複数の環境を用意することができる。 その結果、全く利用用途の異なるプログラムや、セキュリティの観点で同居させづらかったシステムを同一サーバで運用できるようになる。 プログラム及び必要なリソース一式の カプセル化 Hypervisorはエミュレート対象のOS、プログラム、仮想CPU/メモリ/NIC/ファイルシステムの一式を ファイル として扱うことができる。 その結果、仮想化された環境の ファイル の管理だけで保守や運用が可能となる。 Hypervisorのお仕事 Hypervisorの種類や設定によって、Hypervisorが具体的に行う仕事の範囲は異なるが、基本的には ハードウェア機能のエミュレート(qemu) VM内のメモリの論理アドレスと実際に格納されている物理メモリのアドレスの変換(メモリマッピングorメモリエミュレータ) の2つが主な仕事となる。ここでは一例としてKVM + qemuを例に説明する。 エミュレートする範囲によって、qemuタイプ、kqemuタイプ、kvm...