Index ソフト・ハード KVM | KVM 動作 |
機能・要件 構成・方式 動作 Linuxマシン 実行フロー 新規ゲスト 仮想CPU 仮想メモリ 仮想ディスク 仮想NIC QEMU タスク 導入 仮想化 |
ハイパーバイザとなるLinuxマシン ・Linuxの上で仮想マシンを起動 1つのプロセスとして仮想マシンが起動する。QEMU/KVMの大枠の実行フロー ・KVMカーネルモジュール(デバイスドライバ)の導入 「/dev/kvm」というファイルを作成・QEMUの起動 「/dev/kvm」または、ここを基点として作成されたファイルディスクリプタに対して、 ioctl()システムコールでアクセスし、 KVMに対してハイパーバイザとしての様々な要求を伝える。 ゲストOSの実行を開始時も、このioctl()でKVMカーネルモジュールに指示を出す。・KVMカーネルモジュールはVM Entryして、ゲストシステムの実行を開始 ・しばらくして、ゲストシステムが、センシティブ命令を実行してVM Exitする。 ・KVMはVM Exitの原因を評価する。 I/Oの実行などのように、QEMUの介入が必要であれば、 QEMUプロセスに制御を移し、QEMUが処理を行う。 完了すれば再びioctl()を実行して、ゲストの処理の継続をKVMに依頼新規ゲストのインスタンス化 ・新しいゲストOSをインスタンス化するのは、kvmユーティリティー KVMカーネルモジュールと連動する。 /dev/kvm を使用してゲストをロードし、 仮想ディスク (ホストOS内の通常のファイル)を関連付けてからブートする。・制御をサポートするのは、/dev/kvm デバイス上で実行される一連の ioctl (デバイス制御) まず特殊なファイルがオープンされ、 仮想 CPU と関連付けられたVM オブジェクトが新規に作成される。 新規VMオブジェクトが作成されると、ioctl による仮想CPUの作成、 kvm バージョンのチェック、メモリー領域の作成、仮想 CPU の起動が可能になる。 これらの操作には kvm コマンドを使用する。仮想CPU ・ホストLinuxカーネルのプロセス・スケジューラは、仮想マシンをプロセスと考え、 仮想マシンが持つ仮想CPUに対して、定期的にCPUの実行時間を割り当てる。 ・複数の仮想CPUを割り当てた場合は、1つのプロセス内で複数の処理を平行して行う マルチスレッドの仕組みにより、複数の仮想CPUによる並列処理を実現する。 仮想メモリ(2段階のアドレス変換を行う) ・各ゲストOSは、インスタンス化されるときに独自のアドレス空間がマッピングされる。 KVMのハイパーバイザは、各仮想マシンに「仮想的な物理メモリ」を割り当てる。 (位置は指定はGPFN(Guest Page Frame Number)) このとき本物の物理メモリの位置を指定はMPFN(Machine Page Frame Number)。 MPFNとGPFNの対応はEPT(拡張ページテーブル)に記録され管理される。・ゲストOS用にマッピングされる物理メモリーは、 実際にはこのプロセスにマッピングされた仮想メモリー ・一連のシャドー・ページ・テーブルが維持されて、 ゲストの物理アドレスからホストの物理アドレスへの変換がサポートされる。 各仮想マシン上のゲストOSは、「仮想的な物理メモリ」を本物の物理メモリと思い込み、 各プロセスの論理アドレスとGPFNの対応をページテーブルに記録する。 仮想マシン上のプロセスが、論理アドレスを指定してメモリにアクセスすると、 「論理アドレス→GPFN→MPFN」というアドレスの変換が行われ、 実際にデータが存在する物理メモリにアクセスする。 ・プロセッサーは、マッピングされていないメモリー位置がアクセスされた場合には、 ハイパーバイザー(ホストカーネル) を活用し、メモリーの変換プロセスをサポートする。 仮想ディスク 仮想NIC QEMU ・ゲストOSによる入出力要求はすべてインターセプトされ、 ユーザー・モードにルーティングされて、QEMUプロセスによってエミュレートされる。 仮想マシン上のゲストOSが発行したCPU命令のうちセンシティブ命令を CPUの仮想化支援機構が検出するとKVMに通知する。 命令によってはQEMUのハンドラが呼び出され適切なデバイスのエミュレーションや 命令の変換が実行される。 実デバイスを利用するためのデバイスドライバを仮想マシン上のゲストOSが持って いない場合、そのゲストOSが持っているデバイスドライバで利用可能なデバイスの ふりをするのはQEMUの代表的な作業 |
All Rights Reserved. Copyright (C) ITCL |