エンジニアなら知っておきたい仮想マシンのしくみ

第2回 Linux KVMで知る仮想マシンの概要

この記事を読むのに必要な時間:およそ 3 分

第1回では,仮想マシンとは何か,その生い立ちや機能について簡単に紹介しました。今回から,x86システム仮想マシンがどのように実現されているのかを解説していきたいと思います。

x86システム仮想マシンには,VMwareによる仮想化製品をはじめHyper-V,Linux KVM,Xenなどがあることは,すでにご紹介したとおりです。この連載では,その中でも最近とくに注目を浴びているLinux KVMを中心に,x86仮想マシンの実装を見ていきましょう。今回は,Linux KVMの概要,および構成するソフトウェアについて解説します。

コンピュータを構成する3大要素

仮想マシンを理解するために,まず実際のコンピュータがどのような構成になっているかを知っておくと良いでしょう。コンピュータは,CPU,システムメモリ,I/Oデバイスの3つの要素から構成されています。

図1 コンピュータを構成する3大要素

図1 コンピュータを構成する3大要素

CPU

CPU(中央演算装置)は,プログラムを実行するための回路です。CPUはプログラムを解析して,命令に従って演算したり,CPUのまわりにあるハードウェアとデータを入出力したりします。

システムメモリ

CPUが直接データの読み書きできるメモリであり,実行中のプログラムやデータを記憶するメモリをシステムメモリ(主記憶装置)と呼びます。

I/Oデバイス

CPUの周辺に接続されたハードウェアをI/Oデバイス(入出力装置)と呼びます。たとえばキーボードやマウス,ビデオアダプタ,ディスクやネットワークのコントローラなど,いろいろな種類のI/Oデバイスが存在します。

これら3要素は,仮想マシンの世界でも通用します。つまり仮想マシンとは,これらの要素をひとつひとつソフトウェア的に実現するプログラムを集めたものだと言えます。では,これらの要素がLinux KVMでどのように実現されているのかを見ていきましょう。

Linux KVMとは

これから本連載で扱っていくLinux KVMは,Kernel-based Virtual Machineの略で,Linux自体を仮想マシンの実行基盤として機能させるタイプのソフトウェアです。

Linux KVMは,Linux用のカーネルモジュールとして実装されており,OSが持つメモリ管理やプロセススケジューリングの機能などを積極的に利用します。このため,一般的には仮想マシンソフトウェアが個別に実装しているスケジューラなどの実装が簡潔になっている(Linuxのスケジューラを利用しているため,Linux KVM自体に実装されているコードは最低限となっている)といった点も特徴的です。

Linux KVMは2006年にQumranetが中心となり開発を開始したオープンソースソフトウェアであり,2007年にはLinuxカーネルのソースツリーにマージされました。さらに2008年にはRed HatがQumranetを買収し,以後RedHatからLinux KVMを活用したRed Hat Enterprise Virtualization (RHEV)やRed Hat Enterprise Linux 6(RHEL6)などがリリースされています。

このような状況から考えて,Linux KVMは現在もっとも勢いがあるオープンソースの仮想マシンソフトウェアと言っても過言ではないでしょう。

Linux KVMの動作要件

Linux KVMを動作させるためには,Linuxが動作するハードウェアであることに加え,下記の条件を満たす必要があります。

  • 仮想化支援機能(Intel VTもしくはAMD-V)を搭載したプロセッサ
  • プロセッサの仮想化支援機能に対応したBIOSを持つマザーボード
  • ホストOS,ゲストOSを実行するために十分な容量のシステムメモリ
  • 64bit対応プロセッサを強く推奨(ディストリビューションによっては32bit非対応)
  • Intel EPT/AMD RVI搭載プロセッサの利用を強く推奨

このように,仮想化支援機能を搭載したプロセッサおよびマザーボードに注意すれば,Linux KVMの動作の最低動作要件を満たすことはそれほど難しくありません。Linux KVMはLinux対応のハードウェアをほぼそのまま使えますので,Linuxがハードウェアを認識していればほぼ「利用できる」と考えて差し支えありません。仮想化支援機能が利用でき,かつLinuxが動作するコンピュータであれば,ネットブックなどのノートパソコンでも仮想マシンを実行できます。

Linux KVMを構成するソフトウェア

Linux KVMは,複数のプログラムの組み合わせで仮想マシンの機能を実現しています。Linuxカーネルはもちろんのこと,KVMのカーネルモジュール,そしてqemu-kvmと呼ばれるユーザモードのプログラムで構成されています。

Linux KVMカーネルモジュール

Linux KVMのカーネルモジュールには,ユーザモードのプロセスの要求に応じて,仮想マシンにメモリを割り当てて,実行する機能を持っています。Linux KVMカーネルモジュールはIntel VTやAMD-Vの仮想化支援機能を使用して仮想マシンを作成し,その仮想マシン環境上に作り出した仮想CPU上でプログラムを実行する機能を持っています。これは,コンピュータの3大要素のうちCPUに相当する,と考えればよいでしょう。

qemu-kvm

ユーザモードプロセスとして動作するqemu-kvmには,x86システムを構成するI/Oデバイスのエミュレータ,つまりCPUの周辺にあるI/Oデバイスの動きを再現するソフトウェアが含まれています。

たとえば,ゲストOSが画面にメッセージを表示しようとすると,KVMカーネルモジュールがqemu-kvmに「ゲストOSが何かしようとしている」と伝えます。qemu-kvmは,ゲストOSが何をしようとしているのかを判断して,本物のビデオアダプタのように振る舞い,結果をゲストOSに返します。qemu-kvmには,ビデオアダプタだけでなく,Linux KVMによる仮想マシン上で使われる一通りのI/Oデバイスエミュレータが含まれています。

また,qemu-kvmには,物理マシンが持っているシステムメモリから,仮想マシンが必要とする容量のメモリを確保する役割も持っています。このため,コンピュータの3大要素のうちシステムメモリ,I/Oデバイスに相当する機能を提供していると言えます。

図2 Linux KVMのしくみ

図2 Linux KVMのしくみ

著者プロフィール

長谷川猛(はせがわたけし)

(株)SRAで7年間のシステム構築&提案を経験したのち,Fusion-ioのセールスエンジニアを経て,フリーランスエンジニアとして活動中。『LDAP Super Expert』(技術評論社)に寄稿したほか,『Xen 徹底入門』(翔泳社)および『萌え萌えうにっくす!UNIX ネットワーク管理ガイド』(毎日コミュニケーションズ)の共著者のひとりである。

スノーボード,ごまラーメン,飼い犬のミニチュアシュナウザー「ラピス君」が大好き。

コメント

コメントの記入