本特集「KVM徹底解説」の第1回「サーバ仮想化技術をおさらいしよう」では、仮想化技術の概念とKVMの概要について解説しました。
今回は、KVMの機能とクラウドOSについて紹介します。
前回述べたとおり、KVMは、Linuxカーネルにサーバ仮想化を実現するハイパーバイザ機能を組み込んだソフトウェアです。つまり、Linux上で稼働するプロセスとして、仮想マシン環境を実現しています。
大きな特徴としては、KVMは、CPUの仮想化支援機能(Intel VTやAMD-V)に対応したCPUを搭載したサーバで利用することが前提条件になります。
KVMが提供する主な仮想化機能を以下に解説します。
1. KVMが提供する機能
1-1. CPUの仮想化
KVMでは、仮想マシンがLinux上の1つのプロセスとして動作しますので、Linuxカーネルのプロセススケジューラーによって、各仮想マシンのプロセスに対するCPUの割り当てが行われます。よって、CPUが割り当てされている実行時間中は、ゲストOSは、物理CPUで動作しているということになります。
簡単に言えばこれだけのことですが、詳細に見ていくと話は単純ではありません。
複雑化させている原因は、CPUの特権モード(リングプロテクション)の扱いにあります。インテルアーキテクチャのCPUは、特権モード(リング0〜3の4種類)があります。LinuxやWindowsの場合でいうと、カーネルはリング0で動作し、ユーザープロセスはリング3で動作します(リング0、リング3の2種類のみを使っている)。言い換えると、リング3で動作するユーザープロセスからシステムコールを発行することで、リング0で動作しているカーネルが物理リソースへのアクセスを行うといった動作です。つまり、リング0は全てのCPU命令が実行可能なモードであるのに対して、リング3は物理的なハードウェア資源を操作する命令が実行できないモードなのです。しかし、KVMでは、仮想マシンはLinux上の1プロセスとして動作するので、そこで実行されるゲストOSは、リング3だけでは動作することができない、という問題が発生します。
この問題を解決するために、前述のCPUの仮想化支援機能を利用しています。
Intel VTなどは、通常の特権モード(リング0〜3)とは別に、ハイパーバイザ(ホストLinux)が稼働するVMX rootモードと、仮想マシンが稼働するVMX non-rootモードが追加されています。
VMX non-rootモードは見かけ上、リング0とリング3の両方が動作できる仕様となっていますが、仮想マシン上で動作するゲストOSが物理リソースにアクセスする命令を要求した際には、自動的にVMX rootモードで稼働するハイパーバイザに処理を委ねます。このような動作によって、仮想環境上で発生する特権モードの問題を回避しています。