中級では「ハイパーバイザが物理資源を切り分けて各VMへ割り当てる」と捉えました。上級では、その割り当てをどう速く・破綻なく実現しているか——完全仮想化と準仮想化の違い・CPUの特権レベル・メモリの二段変換・I/Oのパススルー、そしてVMとコンテナの隔離の深さの差まで掘り下げます。
概要 — まず全体をつかむ
アニメーション『仮想化の層構造(ハイパーバイザとVM)』を開く
詳細 — 1段階ずつ追う
完全仮想化・準仮想化・ハードウェア支援
ゲストOSに「本物のマシンに見せる」やり方は、歴史的に3つあります。
- 完全仮想化 — ゲストOSを改造せずそのまま動かす。特権命令をハイパーバイザが捕まえて肩代わりする(トラップ&エミュレート)。互換性は高いが、捕まえる処理が重い
- 準仮想化(paravirt) — ゲストOSを仮想化に気づかせて改造し、重い特権命令の代わりにハイパーバイザへの直接呼び出し(ハイパーコール)を使う。速いがゲストの改造が要る
- ハードウェア支援仮想化 — CPU自体(Intel VT-x/AMD-V)に仮想化専用の動作モードを足し、改造なしで速く動かす
鍵は特権レベルです。OSは本来、最も強い権限の層(リング0※1)で動くつもりでいます。ところが仮想化ではハイパーバイザこそが最強でいたい。そこでVT-x/AMD-Vは、ハイパーバイザ用の VMX root モード(※2)とゲスト用の非rootモードを別に設けました。ゲストOSは自分がリング0にいると思い込んだまま動け、危険な操作の瞬間だけ自動でハイパーバイザ側へ制御が移ります(VMExit)。「ゲストには最強に見せつつ、実権はハイパーバイザが握る」——この二重構造が支援機構の核です。
なお中級で見た Type1(ベアメタル)/Type2(ホスト型) の違いは「ハイパーバイザの置き場所」の話で、上のどの方式とも組み合わさります。
やさしく言うと(中級)
VMを束ねる管理役がハイパーバイザ(※1)です。1台分の物理資源を切り分けて、各VMへ割り当てます。
アニメーション『仮想化の層構造(ハイパーバイザとVM)』を開く
図のように、下からハードウェア → ハイパーバイザ → 複数のVMが積み上がります。各VMは、上にアプリ、下にゲストOS(※2)を丸ごと積んでいます。ここが大事な点で、VMは中に1台分のOSを持つため、しっかり分離できる反面、その分だけ重くなります。
ハイパーバイザには置き場所で2タイプあります。
- Type1(ベアメタル) — ハードの直上で動く。速く、サーバ向き
- Type2(ホスト型) — ホストOSの上で動く。手元のPCに入れて使う向き
登場人物メモ:
- ※1 ハイパーバイザ — 物理資源を切り分け、各VMへ割り当てる管理役(VMM とも)
- ※2 ゲストOS — VMの中で動くOS。VMごとに1つずつ積む
- ※3 ホストOS — Type2で、ハイパーバイザを載せる土台側のOS
メモリの二段変換
メモリ仮想化の難所は、アドレス変換が二段になることです。
- 通常のOSは「仮想アドレス → 物理アドレス」を1段だけ変換する
- VMでは、ゲストの「物理アドレス」すら偽物。だから「ゲスト仮想 → ゲスト物理 → ホスト物理」と二段変換が要る
- 昔の解決策が シャドウページテーブル(※3)——ハイパーバイザが「ゲスト仮想 → ホスト物理」の合成表をソフトで作って持つ。しかしゲストが表を書き換えるたび同期が要り、とても重かった
これをハードで解いたのが EPT/NPT(拡張ページテーブル/ネストページテーブル)です。二段目の「ゲスト物理 → ホスト物理」の対応表をCPUが直接引けるようになり、ソフトでの同期がまるごと不要になりました。仮想化の性能が実用域に届いた大きな一歩が、この二段目のハード化です。同じ「見せかけのアドレス」を扱う話として、プロセスとメモリ の仮想メモリと発想が地続きなことも押さえると理解が深まります。
vCPUとI/Oの仮想化
中級では「CPU・メモリ・ストレージ・ネットワークを見せかける」と概観しました。ここではCPUとI/Oを実装の目線で深掘りします。
vCPUスケジューリング — VMに割り当てた vCPU(※4)は、実体としては物理コアの時間の割り当てです。ハイパーバイザが物理コアを時分割し、各vCPUを順番に走らせます。ここで難しいのが、複数vCPUを持つVMで一部だけ実行され残りが止まると、ゲスト内のロック待ちなどが崩れること(co-scheduling問題)。物理コアより多くのvCPUを約束すると(オーバーコミット)、混雑時に取り合いが起きます。
I/O仮想化は、速さを求めて3段階に進化しました。
- エミュレーション — 実在のデバイス(NICなど)の振る舞いをソフトで真似る。改造不要で互換性は高いが最も遅い
- virtio(準仮想化I/O) — ゲストに専用ドライバを入れ、無駄な真似をやめて効率化した「仮想化前提のデバイス」。エミュレーションより大幅に速い
- SR-IOV(パススルー) — 物理デバイス自身が複数の仮想機能(VF)を提供し、各VMがハイパーバイザを介さず直接デバイスと話す。ほぼ実機の速度。ただしハードとドライバの対応が要り、VMの移動などで制約が出る
「ソフトで真似る → 準仮想化で賢く → ハードを直接分ける」——遅さを削るこの流れは、NIC のような実デバイスをどう共有するかという問いへの答えでもあります。
やさしく言うと(中級)
「仮想化」といっても、実体は資源をあるように見せかけて割り当てることです。
- CPU — 物理コアの時間を細切れにして、各VMへ順番に貸す
- メモリ — 物理メモリの一部を切り出し、VMには「専用の連続したメモリ」に見せる
- ストレージ — 1つのファイルやボリュームを、VMには1台のディスクとして見せる
- ネットワーク — 仮想的なNICやスイッチを作り、VM同士や外とつなぐ
VM側からは、どれも本物の1台に見えます。この「見せかけ」を破綻なくやるのがハイパーバイザの仕事です。
VMとコンテナの隔離レベル
中級では「コンテナはOSを積まず軽い」と対比しました。上級の核心は、その軽さの代償である隔離の深さの差です。
アニメーション『VMとコンテナの違い』を開く
- VM — 各VMが独立したカーネルを丸ごと持つ。ハイパーバイザという薄い境界の下で、他VMとはカーネルレベルで分離される。隔離は強いが重い
- コンテナ — ホストのカーネルを共有し、名前空間(namespace)とcgroupで「見える範囲と使える量」を仕切るだけ。カーネルは1つを分け合うので、カーネルの脆弱性を突かれると隣へ波及しうる。隔離は弱めだが軽い
つまり両者の差は「速さ対安全」ではなく、境界がどの層に引かれているかです。VMはハードウェアに近い層で、コンテナはOSの中の仕切りで隔てる。マルチテナントで強い隔離が要るなら、コンテナをさらにVMの中で走らせる(軽量VMでコンテナを包む)折衷も使われます。詳しくは Docker/コンテナ と、その土台を貸し出す クラウド を参照。
やさしく言うと(中級)
VMの弱点は、はっきりしています——OSを丸ごと積むので重い。起動に時間がかかり、1台に積める数も限られます。
その反省から生まれたのがコンテナ(Docker/コンテナ)です。コンテナはOSを積まず、ホストのカーネルを共有したまま、プロセスを隔離して動かします。だから軽く、起動も速い。VMとコンテナの積み方の違いは、既存の対比図で確かめられます。
アニメーション『VMとコンテナの違い』を開く
分離の強さがほしいならVM、身軽さがほしいならコンテナ——用途で使い分けます。
そして、クラウドで借りるサーバの中身は、結局この仮想化です。物理マシンを大量に持つ事業者が、それをVMやコンテナに切り分けて、必要な分だけ貸している——それがクラウドの正体なのです。
⚠️ 深いところの落とし穴
- CPUオーバーコミット — vCPUを物理コアより多く約束し、混雑時にスケジューリング待ちで急に遅くなる
- NUMAの無視 — 大きなVMがCPUと遠いメモリを掴み、二段変換より前の段階で遅延が増える
- SR-IOVの移動制約 — デバイス直結ゆえにVMのライブマイグレーションが難しくなる(速さと柔軟さの綱引き)
- カーネル共有の油断 — コンテナをVM並みの隔離と思い込み、カーネル脆弱性の横展開リスクを見落とす
- 準仮想化ドライバ欠如 — virtioドライバを入れ忘れ、遅いエミュレーション経路のまま運用してしまう
やさしく言うと(中級)
- オーバーコミット — 資源を実際より多く約束しすぎると、混んだときに取り合って遅くなる
- 単一障害点 — 物理1台の上のVMは、そのハードが倒れるとまとめて止まる(分散配置で緩和)
- オーバーヘッド — 仮想化の見せかけ処理そのものが、わずかに性能を食う
- VMの増えすぎ — 作るのが簡単なぶん、使われないVMが放置されがち(棚卸しが要る)
関連する知識
理解度チェック
そのまま解けます(成績は保存されません)。無料アカウントを作ると、学習の記録と進捗の山登りが始まります。
問1. ハードウェア支援のメモリ仮想化(EPT/NPT)が解決したのは?
問2. I/O仮想化でSR-IOVがエミュレーションやvirtioより速いのは なぜ?
問3. 完全仮想化(フル仮想化)の特徴として正しいのはどれ?
問4. 準仮想化(paravirt)が、重い特権命令の代わりに使うのはどれ?
問5. VT-x/AMD-Vで、ゲストOSが「自分は最強権限(リング0)にいる」と思い込めるのに実権はハイパーバイザが握る、この構造の説明として正しいのはどれ?
問6. I/O仮想化の3方式のうち「エミュレーション」の位置づけとして正しいのはどれ?
問7. 完全仮想化やハードウェア支援で、ゲストが危険な操作をした瞬間に制御がハイパーバイザ側へ自動で移ることを何と呼ぶ?(英語)
問8. EPT/NPT登場前に、メモリの二段変換をソフトで解いていた重い仕組みを何と呼ぶ?(カタカナ)