Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
仮想マシンのしくみ
Search
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
akam1o
March 07, 2026
Technology
59
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
仮想マシンのしくみ
akam1o
March 07, 2026
More Decks by akam1o
See All by akam1o
200GbE 時代に再考するハイパーバイザネットワーク設計
akam1o
0
47
EPYC Turin で実現する 200Gbps サーバのハイパーバイザ基盤
akam1o
0
37
OpenvSwitch で作る透過 L3DSR
akam1o
1
56
virsh の使い方
akam1o
0
7
パフォーマンス分析のススメ
akam1o
0
6
プライベートクラウドのストレージライフサイクル問題に立ち向かう!〜ストレージ間マイグレーションの話〜
akam1o
0
45
コンピュートノードのネットワーク高速化
akam1o
0
46
Other Decks in Technology
See All in Technology
Bill One 開発エンジニア 紹介資料
sansan33
PRO
7
20k
AI駆動開発はどこまで来たのか? ファインディの最新実態調査で読み解く現在地 Devin Con Tokyo
akiratom
4
1.9k
markdown-poster Introduction
kazamori
0
390
本番に近いテストをもっと手軽に - Postmanで広がるAPIテストの世界 / Expanding the World of API Testing with Postman
yokawasa
1
120
全社に広がるMCPサーバーを、 どう安全に管理するか MCPass開発の舞台裏
mtpooh
3
170
指示待ちから変化に応じるClaude Codeへ!~環境からAgentへの帰り道を作る~
gotalab555
7
1.5k
[ホンマでっか SRE] あなたはなぜ SRE に?
_awache
0
310
アクセスキー流出時の対応で再認識した攻撃側と防御側の非対称性について
kazzpapa3
0
430
Data Hubグループ 紹介資料
sansan33
PRO
0
3.2k
「ミスを許さない手順書」を作ってみた 〜 個人的にはこれ以上できることはあまりなさそう/20260827-ssmjp-operation-procedure-update
opelab
12
8.9k
Distributed Transactions Under Fire: Building a Zero-Oversell Flash Sale Platform with Amazon Aurora DSQL
yama3133
0
100
わたしが知り合いゼロの勉強会に 行けるようになるまで
r5ni4
2
830
Featured
See All Featured
Leading Effective Engineering Teams in the AI Era
addyosmani
9
2.4k
Paper Plane (Part 1)
katiecoart
PRO
1
10k
Exploring the relationship between traditional SERPs and Gen AI search
raygrieselhuber
PRO
2
4.3k
The Power of CSS Pseudo Elements
geoffreycrofte
82
6.5k
Fantastic passwords and where to find them - at NoRuKo
philnash
52
3.8k
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
659
62k
Typedesign – Prime Four
hannesfritz
42
3.1k
Thoughts on Productivity
jonyablonski
76
5.3k
Done Done
chrislema
186
16k
Between Models and Reality
mayunak
4
410
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
31
3.3k
Raft: Consensus for Rubyists
vanstee
141
7.7k
Transcript
仮想マシンのしくみ Akira Kamio
仮想マシンとは ・物理マシンじゃないけど 物理マシンっぽく振る舞う何か ・プライベートクラウドにおいては大抵 x86 の エミュレーションするやつのことを指している
仮想マシンとは ・Android 開発するときのこれも仮想マシン
• CPU 仮想化 • メモリ仮想化 • ディスク仮想化 • ネットワーク仮想化
• CPU 仮想化 • メモリ仮想化 • ディスク仮想化 • ネットワーク仮想化
CPU 仮想化
CPU アーキテクチャ ・世の中には様々な CPU アーキテクチャがある ・今回は x86 に絞って説明していく ・ぺけはちろく <-
私はこっち派 ・えっくすはちろく
CPU アーキテクチャ ・世の中には様々な CPU アーキテクチャがある ・今回は x86 に絞って説明していく ・ぺけはちろく <-
私はこっち派 ・えっくすはちろく 実は x86 は仮想化が難しいアーキテクチャ
仮想化の歴史 ・1974年に発表された論文の中で、 第3世代アーキテクチャ 仮想化のための 要件が語られている ・Formal Requirements for Virtualizable Third
Generation Architectures
仮想化の歴史 ・1974年に発表された論文の中で、 第3世代アーキテクチャ 仮想化のための 要件が語られている ・Formal Requirements for Virtualizable Third
Generation Architectures 特権レベル機構や仮想メモリ機構を備えたアーキテクチャ -> x86 の原型
仮想化の要件 (1/3) ・等価性 ・実マシンと同じ振る舞いを示さなくてはならない ・資源管理 ・仮想化された資源を完全に管理しなくてはならない ・効率性 ・大部分の命令を実 CPU で直接実行しなくてはならない
仮想化の要件 (2/3) ・命令を3種類に分類 ・特権命令 ・特権モードでないと実行できない ・ユーザモードであればトラップ ・制御センシティブ命令 ・システムの資源状態に変更を加える命令 ・動作センシティブ命令 ・システムの資源状態に動作や結果が依存
仮想化の要件 (3/3) 仮想マシンモニタ (VMM) の構成要件 ・コンピュータが仮想化可能であるためには、 すべてのセンシティブ命令が特権命令 である必要がある ・仮想マシンでセンシティブ命令が実行 ・トラップが発生
・特権モードで動く VMM に処理が移る ・適切に処理し復帰
センシティブ命令 ⊂ 特権命令 (1/2) 要件 命令セット 特権命令 センシティブ命令
センシティブ命令 ⊂ 特権命令 (2/2) x86 命令セット 特権命令 センシティブ命令
センシティブ命令 ⊂ 特権命令 (2/2) x86 命令セット 特権命令 センシティブ命令 WTF?
センシティブ命令 ⊂ 特権命令 (2/2) x86 命令セット 特権命令 センシティブ命令 WTF? 非特権センシティブ命令
センシティブ命令 ⊂ 特権命令 (2/2) x86 命令セット 特権命令 センシティブ命令 WTF? 非特権センシティブ命令
x86 の仮想化は難しい
非特権センシティブ命令の例 ・メモリアクセス ・I/O レジスタアクセス ・DMA コントローラアクセス ・IRQ 割り込み発生
x86 の仮想化手法 (1/2) ・困難と言われながらもなんだかんだ仮想化される ・1998年 VMware社が PC 向けの x86 エミュレータ発表
・2001年 VMware社がサーバ向けの x86 エミュレータ発表 ・2003年 Xen 1.0 公開 ・2005年 OpenVZ リリース ・2005年 VT-x 対応 Pentium 4 発売 ・2006年 KVM プロジェクト開始 ・2006年 Hyper-V 開始
x86 の仮想化手法 (2/2) ・完全仮想化 ・非特権センシティブ命令 の動的な置換 ・非特権センシティブ命令 の静的な置換 ・ソフトウェア ・ハードウェア
完全仮想化 ・完全仮想化 (Full virtualization) ・代表例: QEMU ・1命令ずつソフトウェアでエミュレート ・遅い ・他のプラットフォームの模倣も可能 ・昔の
Android のエミュレータが 遅かったのもこのため
非特権センシティブ命令の置換 (1/3) x86 命令セット 特権命令 センシティブ命令 非特権センシティブ命令
非特権センシティブ命令の置換 (1/3) x86 命令セット 特権命令 センシティブ命令 非特権センシティブ命令 置き換えればいいのでは?
非特権センシティブ命令の置換 (2/3) ・非特権センシティブ命令の動的な置換 (バイナリ変換 /Binary Translation) ・代表例: VMware ・非特権センシティブ命令を実行前に 動的に書き換える
・通常命令は 直接 CPU で実行 ・ゲスト OS はハイパーバイザのレイヤを意識しない
非特権センシティブ命令の置換 (3/3) ・非特権センシティブ命令の静的な置換 (準仮想化/Para virtualization) ・代表例: Xen ・非特権センシティブ命令の代わりに ハイパーバイザコール と呼ばれる命令を呼ぶ
・ゲスト OS の kernel を仮想マシン向けに 書き換える必要がある ・仮想環境でより実機に近い性能が得られるように
VT-x ・一方 Intel は x86 を拡張した ・VMX non-Root Mode と呼ばれるハイパーバイザ向け
のプロテクションモデルを追加した ・仮想マシンが非特権センシティブ命令を実行すると VMX non-Root Mode から VMX Root Mode へ 切り替えて実行する ・ゲスト OS はハイパーバイザのレイヤを意識しない ・仮想環境でより実機に近い性能が得られる
VMExit と VMEnter ・VMX non-Root Mode (VM Mode) ・VMX Root
Mode (Root Mode) ・VMExit VM Mode から Root Mode に切り替わること ・VMEnter Root Mode から VM Mode に切り替わること
KVM ・CPU は仮想化支援機能 (VT-x 等) を使うことを前提として開発 ・メモリ管理 , ドライバ, スケジューラは
Linux カーネルの機能を利用
CPU 仮想化まとめ ・x86 の仮想化は 一部のセンシティブ命令が特権命令に なっていない ため、仮想化が難しかった ・x86 の仮想化手法は下記が挙げられる ・完全仮想化
・非特権センシティブ命令の動的な置換 (e.g. VMware) ・非特権センシティブ命令の静的な置換 ・ソフトウェア (e.g. Xen) ・ハードウェア (e.g. VT-x) ・現代では VT-x 等の仮想化支援機能を用いた仮想化が主流
メモリ仮想化
KVM ・CPU は仮想化支援機能 (VT-x 等) を使うことを前提として開発 ・メモリ管理 , ドライバ, スケジューラは
Linux カーネルの機能を利用
KVM のメモリ仮想化
Linux カーネルのメモリ管理 (1/3) ・カーネルにはメモリを管理する表がある ・これをページテーブル と呼ぶ ・物理メモリとプロセスのメモリのマッピングをしている ・Linux ではプロセス毎に独立したメモリ空間 を持つ
・別のプロセスからはアクセスできない ・Windows で「仮想メモリ」という言葉を聞いたことがある人がいると 思うが、Linux の仮想メモリとは違う ので注意 ・Linux ではスワップ領域がこれにあたる
Linux カーネルのメモリ管理 (2/3) ・Linux カーネルでは物理メモリ以上のメモリ割り当てをすることができる ・この仕組みを 仮想メモリ という ・仮想メモリでは実際に読み書きしたときに物理メモリをアロケートする ・仮想メモリを実現しているのが
ページテーブル ・仮想メモリアドレスと物理メモリアドレスの管理をしている ・住所録みたいなもの ・アクセスの少ない物理メモリはスワップ領域と呼ばれるディスクに用意された領域に書き出され、 ページテーブル上のエントリは削除される (ページアウト ) ・アクセスが起こった時ディスクから読み込んでページテーブルにエントリが追加される (ページイン )
Linux カーネルのメモリ管理 (3/3) プロセスA が 1 だと思っている領域は 物理メモリ 2 プロセスB
が 1 だと思っている領域は 物理メモリ 5 プロセスB が 2 だと思っている領域は 物理メモリ 6
仮想マシンのメモリ管理 ・仮想マシンで問題になるのは 仮想メモリアドレスを 物理メモリアドレスだと思っている こと ・仮想マシンの物理メモリはホストカーネルの仮想メモリ でしかない ・仮想メモリのアドレスでメモリにアクセスしようとする ・違うメモリにアクセスしにいってしまう ・彡(゚)(゚)「何か仲介するものが必要やな〜」
・ソフトウェア : シャドーページテーブル ・ハードウェア : EPT (Extended Page Table)
シャドーページング ホストカーネルで仮想マシンの ページテーブルを複製 (シャドーページテーブル ) ゲスト OS がメモリにアクセスするときには ハイパーバイザがメモリのアドレスを CPU
に 代わりに渡す ことで正しいアドレスを伝える ※ページテーブルを読み書きする度に 複製を同期する必要がある 同期をいっぱい取る必要があるので パフォーマンスは悪い
EPT (Extended Page Table) CPU がシャドーページテーブル相当の機能をオフロード する 仮想マシンからメモリアクセスすると、 EPT のテーブルを参照して正しいメモリにアクセス
される EPT になかったときは、ホストカーネルの仮想メモリから物理メモリが割り当てられ EPT にも乗る CPU にページテーブルの変換がオフロードされる ため、パフォーマンスは良い
CERN では EPT disable? EPT を切ったほうがパフォーマンスが出た という記事を CERN が 2015/08
に公開した http://openstack-in-production.blogspot.com/2015/08/ept-and-ksm-for-high-throughput.html 当時再現試験を行ったが、同じような結果を 得ることはできなかった なおその後、TLB miss した際に EPT を利用 しているほうがペナルティが大きいという 記事を出している これは HugePage を使用することで緩和できる http://openstack-in-production.blogspot.com/2015/09/ept-huge-pages-and-benchmarking.html 一般に EPT を使ったほうが 30% 程度 性能向上すると言われている
KVM のメモリ仮想化まとめ ・KVM の仮想化ではメモリ管理・ドライバ・スケジューラは Linux カーネルの機能を利用 している ・メモリ仮想化で課題になるのはメモリマッピング ・仮想マシンは物理メモリだと思っている ->
実際にはホストカーネルの仮想メモリ ・ハイパーバイザの層で仮想マシンのメモリとホスト カーネルのメモリをマッピングするテーブルを持っている ・ソフトウェア : シャドーページテーブル ・ハードウェア : EPT (CPU の機能の拡張 )
• CPU 仮想化 • メモリ仮想化 • ディスク仮想化 • ネットワーク仮想化
ディスク仮想化
Linux のブロックデバイスへの I/O ・カーネルから I/O 要求 ・デバイスドライバに基づいて I/O が実行される device
driver device kernel
仮想マシンの I/O (1) 1. [VM] デバイスへの I/O が実行される 2. [VM]
I/O の実行を契機に VMExit 発生 3. [HV] アクセス先のデバイス情報を特定 4. [HV] デバイス I/O のエミュレーション処理を行う 5. [HV] VMEnter して VM を再開させる 6. [VM] I/O実行の次の命令から実行再開
仮想マシンの I/O (2) virtio driver device emulation kernel device driver
device VM HV
仮想マシンの I/O (2) virtio driver device emulation kernel device driver
device 1. [VM] デバイスへの I/O が発行 VM HV
仮想マシンの I/O (2) virtio driver device emulation kernel device driver
device 1. [VM] デバイスへの I/O が発行 2. [VM] I/O の実行を契機に VMExit 発生 VM HV
仮想マシンの I/O (2) virtio driver device emulation kernel device driver
device 1. [VM] デバイスへの I/O が発行 2. [VM] I/O の実行を契機に VMExit 発生 3. [HV] アクセス先のデバイス情報を特定 VM HV
仮想マシンの I/O (2) virtio driver device emulation kernel device driver
device 1. [VM] デバイスへの I/O が発行 2. [VM] I/O の実行を契機に VMExit 発生 3. [HV] アクセス先のデバイス情報を特定 4. [HV] デバイス I/O のエミュレーション処理を行う(代わりに I/O) VM HV
仮想マシンの I/O (2) virtio driver device emulation kernel device driver
device 1. [VM] デバイスへの I/O が発行 2. [VM] I/O の実行を契機に VMExit 発生 5. [HV] VMEnter して VM を再開させる 3. [HV] アクセス先のデバイス情報を特定 4. [HV] デバイス I/O のエミュレーション処理を行う(代わりに I/O) VM HV
仮想マシンの I/O (2) virtio driver device emulation kernel device driver
device 1. [VM] デバイスへの I/O が発行 2. [VM] I/O の実行を契機に VMExit 発生 5. [HV] VMEnter して VM を再開させる 3. [HV] アクセス先のデバイス情報を特定 4. [HV] デバイス I/O のエミュレーション処理を行う(代わりに I/O) 6. [VM] I/O実行の次の命令から実行再開 VM HV
仮想化デバイスの種類 ・完全仮想化デバイス ・実ハードウェアを完全にエミュレートしているデバイス ・準仮想化デバイス ・完全にエミュレートは行っていないが 実ハードウェアのように振る舞うデバイス ・VMExit, VMEnter がなるべく発生しないように 実装されている
完全仮想化デバイスが遅い理由 ・完全仮想化デバイスはハードウェアレジスタへの アクセスなども完全にエミュレートする ・ハードウェアレジスタにアクセスするたびに VMExit -> VMEnter が発生 ・完全仮想化デバイスとして実装されている NIC
によっては パケットの受信処理で 5〜6回のレジスタアクセスを行う
virtio ・Linux kernel に実装されている準仮想化のフレームワーク ・様々なデバイス向けの実装がある ・virtio-blk ブロックデバイス ・virtio-scsi SCSI デバイス
・virtiofs File 共有 ・virtio-net NIC ・virtio-pci PCI デバイス
virtio ・Linux kernel に実装されている準仮想化のフレームワーク ・様々なデバイス向けの実装がある ・virtio-blk ブロックデバイス ・virtio-scsi SCSI デバイス
・virtiofs File 共有 ・virtio-net NIC ・virtio-pci PCI デバイス
virtio のしくみ virtio driver virtio PCI controller virtio PCI controller
virtio device vring Guest kernel 転送のためのしくみ ゲストとホストでメモリを共有 QEMU
仮想マシンの I/O (再掲) virtio driver device emulation kernel device driver
device VM HV
仮想マシンの I/O (再掲) virtio driver device emulation kernel device driver
device VM HV virtio PCI controller virtio device vring virtio driver virtio PCI controller
QEMU Guest virtio Overview virtio driver virtio PCI controller virtio
PCI controller virtio device vring Host kernel device driver device Other Process
virtio-blk ・vring (virtqueue, virtio-buffer) をホストと共有 ・VM のディスクの実体は仮想ホストのディスクイメージ ・I/O 実行 ->
virtio-blk -> host I/O 命令 -> I/O 完了 ・VMExit せずに IO を完了できる ・VM は処理を続行できる ・VMExit する場合もある ・sync や Direct I/O をするとき (QEMU の設定によっては無視できる)
virtio-blk ・vring (virtqueue, virtio-buffer) をホストと共有 ・VM のディスクの実体は仮想ホストのディスクイメージ ・I/O 実行 ->
virtio-blk -> host I/O 命令 -> I/O 完了 ・VMExit せずに IO を完了できる ・VM は処理を続行できる ・VMExit する場合もある ・sync や Direct I/O をするとき (QEMU の設定によっては無視できる)
VM のディスクイメージ QEMU で使われるディスクイメージ形式は主に下記の 2つ ・RAW ・シックプロビジョニング (Thick Provisioning) ・割り当てたサイズだけ物理領域を確保
・QCOW2 ・シンプロビジョニング (Thin Provisioning) ・最小限の物理領域を確保/動的に領域を増やす
シックプロビジョニング (RAW) backing file 10GB ・割り当て時に物理領域を確保する ・backing file は物理的にコピーする
シンプロビジョニング (QCOW2) ・最低限の物理領域を確保する ・backing file は元のファイルを参照するだけ ・backing file との差分のみを記録していく ・物理領域を広げながら
I/O を行うためオーバーヘッドがある backing file 10GB diff
ディスク仮想化まとめ ・virtio という準仮想化デバイスフレームワーク がある ・ virtio-blk, virtio-scsi がディスク仮想化のための実装 ・極力 VMExit,
VMEnter しない実装になっている ・ディスクの割り当てとして シックプロビジョニング と シンプロビジョニング がある
ネットワーク仮想化
NIC の完全仮想化デバイス (e1000) ・Intel e1000 ドライバ互換の完全仮想化デバイス ・完全仮想化デバイスで e1000 は最も使われている ・完全仮想化デバイスの中では最も速い
・その他の完全仮想化デバイスの例 ・ne2k_pci ・pcnet ・rtl8139
virtio-net ・NIC の virtio デバイス ・レジスタアクセスを極力減らしている QEMU Guest virtio driver
virtio PCI controller virtio PCI controller virtio NIC RX TX ctrl
完全仮想化デバイスが遅い理由 ・ハイパーバイザ側でのトラップが多い ・準仮想化デバイスの場合は 1回
DPDK + vhostuser ・DPDK という仕組みがある ・カーネルをバイパスする ことで高速化を図っている ・ポーリングプロセスが vring を
copy ・低レイテンシ/ mode 切り替えがない qemu Linux NW stack NIC OvS kernel user DPDK pmd copy
DPDK + vhostuser ・DPDK という仕組みがある ・カーネルをバイパスする ことで高速化を図っている ・ポーリングプロセスが vring を
copy ・低レイテンシ/ mode 切り替えがない qemu Linux NW stack NIC OvS kernel user DPDK pmd copy NIC でのハードウェアオフロードや kernel への高速化フレームワーク実装など 現在も活発に開発がされている
ネットワーク仮想化まとめ ・virtio-net という virtio を利用したデバイス がある ・極力 VMExit, VMEnter をしない実装になっている
・カーネルをバイパスするしくみでの高速化など 現在でも活発に開発が行われている
EOP
参考文献 (1) ・ハイパーバイザの作り方 ・https://syuu1228.github.io/howto_implement_hypervisor/ ・CERN TechBlog ・https://techblog.web.cern.ch/techblog/ ・Virtio: An I/O
virtualization framework for Linux - IBM Developer ・https://developer.ibm.com/articles/l-virtio/ ・Virtual I/O Device (VIRTIO) Version 1.1 ・https://docs.oasis-open.org/virtio/virtio/v1.1/virtio-v1.1.html
参考文献 (2) ・bobuhiro11's blog ・https://blog.bobuhiro11.net/ ・カーネギーメロン大学の講義資料 ・https://www.cs.cmu.edu/~412/lectures/Virtio_2015-10-14.pdf ・OSC2011 Tokyo/Fall 濃いバナ(virtio)
・https://www.slideshare.net/TakeshiHasegawa1/osc2011-tokyofall-virtio ・かーねるさんとか ・https://yasukata.hatenablog.com/