KVMを使用したQEMUを試してみる(AMD-Vを使用)
Linuxカーネル(2.6.20以降)が持つ仮想化機能で、CPUの仮想化支援機能(Intel製CPUの「VT」とAMD製CPUの「AMD-V」)を使用している「KVM」を実験してみた。
過去に2〜3回実験したのだが、いずれも完全にフリーズする結末を迎えてしまい、まだ手元で動かせるのは先か(あるいはマザーボードやBIOSの部分で未対応?)、と思っていたのだが、今回は動作することを確認できたので、手順も含めてメモ。
ハードウェア環境(関連しそうな部分)
AMD-Vに関しては、手元のマザーボードではBIOSで設定する項目が存在せず、強制的に有効になっているものと思われる。他のマザーボード・BIOSでは、設定項目があるかもしれないし、無いかもしれない。/proc/cpuinfoにおいては、「flags」の中の「svm」という項目がAMD-Vのサポートを示している。「cpu MHz」の値が1000なのは、cpufreq(Cool'n'Quietを使用)によるもの。
$ cat /proc/cpuinfo processor : 0 vendor_id : AuthenticAMD cpu family : 15 model : 79 model name : AMD Athlon(tm) 64 Processor 3500+ stepping : 2 cpu MHz : 1000.000 cache size : 512 KB fpu : yes fpu_exception : yes cpuid level : 1 wp : yes flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 syscall nx mmxext fxsr_opt rdtscp lm 3dnowext 3dnow pni cx16 lahf_lm svm extapic cr8_legacy bogomips : 2010.66 TLB size : 1024 4K pages clflush size : 64 cache_alignment : 64 address sizes : 40 bits physical, 48 bits virtual power management: ts fid vid ttp tm stc
パッケージ構成
パッケージとして配布されているのは、KVMモジュールのソースと改変版QEMUのセット。
現状、KVMのモジュールを利用できるアプリケーションが、KVMと一緒に配布しているQEMU(改変バージョン)のみで、これを使う以外に、KVMを使う手段がない。
KVMパッケージのダウンロード
KVMの本家からパッケージをダウンロードする。
使用するバージョンについての注意書きもあるので、よく読んでから、使用するバージョンを決める。基本的には、最新バージョンのダウンロードを推奨している。
インストール(カーネル付属のKVMモジュールを使用する場合)
過去に実験したときは、カーネルの設定でKVMを無効にした上で、KVMパッケージに付属しているモジュールを使用していたのだが、フリーズしてしまったため(パッケージ内のKVMを使用したのがその原因と特定できたわけではないが)、今回は、まず、カーネルに含まれるKVMモジュールを使用してみることにする。
なお、QEMUは依然としてGCC 3を必要とするため、あらかじめこれをインストールし、その実行ファイル名を指定する必要がある。ただし、C言語のプログラムのみコンパイルできればよく、Gentoo Linuxでは、「nocxx」というUSEフラグを付けてビルドして問題ない。
$ tar zxf [kvm-33.tar.gzの場所] $ cd kvm-33/ $ ./configure --with-patched-kernel --qemu-cc=gcc-3.4.6 $ make $ sudo paco -lD make install
/dev/kvmの属性について
/dev/kvmに一般ユーザで読み書きできるようにする必要があるため、グループを作り、一般ユーザをメンバーにしておく。ここでは、既に「qemu」というグループがあったため、それを使うようにしている。
udevのルールファイルのファイル名は環境によって異なるかもしれない。xx-qemu.rulesというファイルが無ければ作成。
モード0666にしてしまうのは楽なのだが、どうも抵抗がある。
ファイル名: /etc/udev/rules.d/48-qemu.rules
KERNEL=="kvm", NAME="%k", GROUP="qemu", MODE="0660"
あるいは、パッケージに含まれている
ファイル名: 65-kvm.rules
KERNEL=="kvm", NAME="%k", GROUP="kvm", MODE="0660"
このファイルを/etc/udev/rules.d/以下にコピーする。この場合、kvmというグループを作成し、使用する一般ユーザをメンバーにしておく。
モジュールを読み込む
手元のCPUではAMD-Vを使うため
$ sudo modprobe kvm-amd
となる。IntelのCPUでVTを使う場合は
$ sudo modprobe kvm-intel
とする。「kvm」というモジュールも自動的に読み込まれるが、削除(modprobe -r)する場合は「kvm」も後で指定する。
動作テスト
イメージファイルの作成やゲストOSのインストールに関してはここでは触れない。
x86_64の場合はqemu-system-x86_64を実行。
$ /usr/local/bin/qemu-system-x86_64 [HDDファイル]
これだけを指定してとりあえず動作させてみる。configureスクリプトに--prefix指定をした場合は、インストール先が変わるので、それに合わせて実行。
動作結果(Linux 2.6.22付属のKVMモジュールの場合)
今回はフリーズせず、正常に動いているかのように見えた。のだが、残念なことに、ところどころ、挙動が怪しい。kqemuを使用している通常のQEMUで処理させると普通に進むところで、突然固まってしまうことも多かった。
KVMパッケージ付属のモジュールを試してみる
既存のモジュールを全て削除してから
$ tar zxf [kvm-33.tar.gzの場所] $ cd kvm-33/ $ ./configure --qemu-cc=gcc-3.4.6 $ make $ sudo paco -lD make install
でインストール。
今回もフリーズするのか、と不安ではあったが、なんと正常に動作し、それどころか、カーネル(2.6.22)付属のモジュールを使用したときよりも安定している。Debianのテスト版を試しにインストールしてみたが*1、止まることは一度もなかった(カーネル付属のKVMでは途中で固まってしまってダメだった)。その後も安定動作している。
(2007/8/4)更に、Debian lennyのx86_64版のインストールを試したところ、kqemu版(QEMU 0.9.0 + kqemu 1.3.0_pre11)では途中で突然落ちてしまう*2のだが、KVM版では無事にインストールできた。動作も安定。
安定はしているのだが
といった不具合も出ている(kqemu版ではともに問題なし)。しかし、これがKVM自体の問題なのかは不明。今後のバージョンではもっと安定してくるのではないか、と期待が持てる。