KVM で仮想マシンを作る(続き)

はじめに

KVM で仮想マシンを作る - tatsuyaoiw.hatenablog.com仮想マシンを作っていろいろいじってみたんですが、せっかくなのでちゃんと勉強しようと思って本買いました。

KVM徹底入門 Linuxカーネル仮想化基盤構築ガイド

KVM徹底入門 Linuxカーネル仮想化基盤構築ガイド

目次

1. KVM と仮想化技術の基礎知識
2. パッケージによるKVMの導入
3. 仮想マシンの作成
4. 仮想マシンの基本操作
5. リソース制御と管理
6. KVMマイグレーション機能
7. コマンドラインによる操作(libvirt と virsh)
8. QEMU 入門
9. 付録

内容は KVM のインストール手順やコマンドの説明が多いのでそんなに重くないです。1 日あれば十分読めちゃうと思います。

前回は知識ゼロで WEB から情報集めながら始めたので、QEMUとかハイパーバイザとか libvirt とか virsh とかその他ネットワーク関連用語なども出てきてしんどかったんですが、この本を一通り読んでようやくつながってきた感じです。

以下、内容まとめました。

KVM とは

KVM(Kernel-based Virtual Machine)は、CPU の仮想化支援機能を利用して QEMU を高速化するためのカーネルモジュール。カーネルの中に仮想化のためのインターフェイスと、Intel-VT や AMD-V など、仮想化機能に対応した CPU を利用する仕組みが入っている。KVMLinux カーネル自体がハイパーバイザの能力を持った仮想化技術である。

QEMU とは

KVM を使った仮想化には QEMU の利用が必須である。QEMU はハードウェアのエミュレータで、簡単にいうと、あるシステム上で他の OS や CPU の機能を再現する(ふりをする)ソフトウェアである。KVM では、メモリ管理、ドライバ、スケジューラといった機能は Linux カーネルの機能を利用して、その他のハードウェアのエミュレーションや管理を QEMU が行う。

ハイパーバイザとは

KVMLinux カーネル自体がハイパーバイザとなる。ハイパーバイザとは、仮想マシンを実現するための制御プログラムである。仮想マシンモニタ(Virtual Machine Monitor, VMM)とも呼ばれる。

ハイパーバイザにはいくつかの種類がある。

パーティショニング型

主にメインフレームや大規模な UNIX サーバで用いられる手法で、ハードウェア自体を論理的に分割(パーティショニング)することで、1 つの物理サーバ上で複数の OS を動作させる。

ハイパーバイザ型

ハイパーバイザ型は、ソフトウェアベースの仮想マシンモニタを利用する。ハードウェア上で直接動作し、ハードウェアとハイパーバイザの間に OS を必要としない。VMware ESX、Citrix の Xen Server などが代表的な製品である。KVMLinux にハイパーバイザの能力を追加するのでこのタイプに分類される。

ハイパーバイザタイプでは、特権命令(OSのみ実行可能な命令)を実行するための管理 OS が動作し、デバイスドライバやネットワークの機能を提供する。完全仮想化と準仮想化の 2 つの手法があり、完全仮想化では BIOS も含めたハードウェアすべてをゲスト OS に見せるのことによりゲスト OS は自身が仮想化されているかどうかを意識せずに動作する。対して、準仮想化では OS の動作を「動的」にでなく「静的」に変更するため、ゲスト OS に修正を加える必要がある。完全仮想化と準仮想化の違いについては後述。

ホスト OS 型

ホストOS型(アプリケーション型)はソフトウェアベースの仮想マシンモニタで、ホスト OS 上でアプリケーションとして動作する。商用の VMware Workstation や ParallelsParallels DesktopオープンソースQEMU などがある。

なお、KVMLinux に取り込まれているのでハイパーバイザ型に分類されるものの、QEMU を高速化させるような形で動作するため、ホスト OS 型に分類されることもある。

仮想化の実行モード

前述の完全仮想化と準仮想化の違いを理解するためには CPU の動作モードを理解する必要がある。

多くの CPU はソフトウェアからの命令を制御するために、下の図のようなリングプロテクションという階層構造で形成される仕組みを用いる。

f:id:tatsuyaoiw:20120807065745p:plain

リングは 0 から 1 -> 2 -> 3 と増えていくについて特権レベルが下がっていく。従来の OS では 1 と 2 はほとんど利用されない。Linux はカーネルモードとユーザモードという 2 つの動作モードを提供するが、カーネルモードがリング 0 、ユーザモードがリング 3 に相当する。カーネルモードではすべての命令が実行可能だが、ユーザモードでは特権命令(OS のみが事項できる命令)は実行できない。これにより、コンピュータ内のデータや機能を障害や攻撃から保護することができる。

また、サーバ仮想化を実現するためには「センシティブ命令」と呼ばれる命令をゲスト OS が仮想環境で直接実行しようとした場合、実ハードウェアで動作しているかのようにエミュレーションしなければならない。これを解決するために、仮想化ソフトウェアがとる手法がいくつかある。

バイナリトランスレーション(完全仮想化)

初期に仮想化を実現した VMware Workstation などでは、バイナリインストレーション(Binary Translation)という手法でこの問題を解決した。バイナリトランスレーションとは、仮想マシン上の OS から発行されたカーネルモードの命令を仮想マシン側のユーザーモード命令として処理し、その結果を仮想マシン上の OS に返すというもの。バイナリトランスレーションではハードウェアを完全にエミュレーションするため、ゲスト OS に変更を加える必要がないという利点があるが、処理のオーバーヘッドのために性能劣化がおこりやすいというデメリットもある。

準仮想化

Xen などの仮想マシンモニタでは、準仮想化という手法を取り入れた。準仮想化ではゲストとして動作する OS 自体に変更を加えることで、あらかじめセンシティブ命令を変換せずに実行できるようにしておく。この方法ではバイナリとレンスレーションの処理による性能劣化を押さえられるが、OS の変更が必要条件となる。

CPU の仮想化支援機能の利用(完全仮想化)

Intel-VT や AMD-V といった CPU の仮想化支援機能を使い、センシティブ命令の実行をフックする。仮想化支援機能とは、カーネルモードとユーザモード以外にもうひとつゲストモードというモードを追加して、そのモードにある間はセンシティブ命令を CPU がトラップしてカーネルに渡す仕組みのことである。ゲスト OS への変更は不要で、バイナリトランスレーションよりもオーバーヘッドを減らすことも可能。KVM はこの CPU の仮想化支援機能を利用した完全仮想化機能である。

KVM の導入

KVM の導入には、ハードウェアの前提条件として「Intel VT-x/d あるいは AMD-V をサポートしている CPU を搭載した、x86 または x86_64 アーキテクチャのマシンを利用している」ことが必須である。

CPU がこれに対応しているかを確認するには、/proc/cpuinfo に特定の機能があるかを見る。

$ grep vmx /proc/cpuinfo
  • AMD-V
$ grep svm /proc/cpuinfo
インストール

ハードウェアの確認ができたら、KVM のソフトウェアパッケージをインストールする。Ubuntu の場合、

$ sudo apt-get install qemu-kvm
$ sudo apt-get install virt-manager

で問題ない。

仮想マシンの作成

仮想マシンの作成と実行には、おもに 3 つの方法がある。

1. virt-manager による方法(GUI)
2. virt-install コマンドを利用する方法(CUI)
3. qemu-kvm コマンドを直接起動する方法

最も基本的な方法は、3 の qemu-kvm を利用する方法だが、qemu-kvm コマンドには非常に多くのオプションがあり複雑なので、libvert という仮想マシンの管理用 API を利用した 1 or 2 の方法が一般的。(libvirt は KVM 専用ではなく、Xen や VirtualBox、VMware ESX などもサポートしている)1 の virt-manager を使った方法は KVM で仮想マシンを作る - tatsuyaoiw.hatenablog.com でほぼカバーしている。2 の方法も書きたかったが疲れたので省略。続きは Amazon.co.jp: KVM徹底入門 Linuxカーネル仮想化基盤構築ガイド: 平 初, 森若 和雄, 鶴野 龍一郎, まえだ こうへい: 本 で。