試験運用中なLinux備忘録・旧記事

はてなダイアリーで公開していた2007年5月-2015年3月の記事を保存しています。

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版では無事にインストールできた。動作も安定。
安定はしているのだが

  • 再起動ができない
  • KNOPPIXを起動させると画面が真っ黒になって進まない?ReactOSのインストールも真っ黒で停止

といった不具合も出ている(kqemu版ではともに問題なし)。しかし、これがKVM自体の問題なのかは不明。今後のバージョンではもっと安定してくるのではないか、と期待が持てる。

KVMモジュールのみインストールする

(2007/8/5)カーネルの更新後など、KVMモジュールだけを再ビルドしてインストールしたいときには

$ tar zxf [kvm-33.tar.gzの場所]
$ cd kvm-33/
$ ./configure --qemu-cc=gcc-3.4.6
$ cd kernel
$ make
$ sudo make install

とする。

使用したバージョン:

*1:ネットワークインストールをするための、ベースシステムのみのCDイメージから起動してインストール

*2:-kernel-qemuを付けても同様