ホーム » 技術 » Linux KVM » KVMを使う(インストール編)

SAKURA Internet Inc.

アーカイブ

KVMを使う(インストール編)

今回は仮想化ソフトウェアのひとつ、KVMのインストール手順をご紹介します。

仮想化ソフトウェアといえば、世の中ではXenやVMwareが有名で、これらを利用したサービスも数多くあります。さくらインターネット社内でもXenServerを使った実験プロジェクトがいくつかあるのですが、KVMの方は少なく、ノウハウの共有が進んでいません。それならば、ということで研究所では現在KVMの動作の確認とパフォーマンス試験に取り組んでいます。

今回ご紹介する手順は、読者のみなさんにも気軽に試していただけるようカジュアルにまとめましたが、KVMを動作させる専用のサーバと、VNCクライアントやtelnet等を使いリモートでコントロールする作業用のWindows PCを分けることを想定しています。1台のマシンしか都合できないという方は、それぞれの環境に合わせて工夫していただければと思います。

KVMの構成

KVMを用いた仮想化は、実際にはqemuというエミュレータと高速な仮想化環境をサポートするカーネルモジュールKVMの2つから成っています。KVMは最新のLinuxカーネルに組み込まれているので特に準備は必要ありません。VMのコントロールはもっぱらqemuの機能を利用することになります。

ホストOSを準備する

まず最初にホストOSを用意します。専用のホストをゼロから用意できるのでしたら、お勧めなのはFedora12の64bit版です。社内で聞き取り調査をしたところ、Ubuntuが素直でいい感じですよという意見があったのですが、私(鷲北)がUbuntuの癖をまったく理解していないため、Fedoraをチョイスしています。このほかサーバマシンについては;

  • VTに対応したサーバを用意しましょう
  • コア数は多いほどよいですが、性能を求めなければ1コアでも動きます
  • メモリはVM同士で取り合いになるので多めに用意しましょう
  • HDDはそれほど大きくなくても大丈夫です。使う分だけ用意しましょう

などのポイントを押さえておくべきと思います。

ホストOSのインストールが終わったら、最初にKVMモジュールをロードします。前述したとおり、LinuxはすでにKVMモジュールが組み込まれているので、ロードするだけでOKです。

# modprobe kvm_intel

もしもAMDのCPUをお使いなら、「kvm_amd」をロードしてください。正しくロードされているか否かを確認するには

# lsmod | grep kvm
kvm_intel              48184  0
kvm                   163952  1 kvm_intel

で判断できます。

KVM(qemu)をインストールする

KVM(qemu)のインストールはパッケージを使ってもいいのですが、最新版をmakeした方がオプションをきちんとコントロールできるのでお勧めです。私が試した限りでは、yum等を使って引っ張ってくると微妙に古いバージョンだったり、コンパイル時オプションがoffだったりします。というわけでコンパイルする手順をご紹介します。

KVMのソースコードは本家サイトからリンクをたどっていくと入手できます。qemu-kvm-0.12.2.tar.gzのような名前のうち、一番新しいものを選べばOKです。kvm-kmod-2.6.33.tar.bz2のようなカーネルモジュールのパックもありますが、Fedora12付属のモジュールで十分動きますので不要と思います。

KVMのコンパイルにはいくつかパッケージが必要です。列挙すると;

  • gcc
  • kernel-devel (Fedoraでは必要、と本家ガイドに書いてあります)
  • zlib-devel
  • pciutils-devel、pciutils-libs (KVM device assigningを有効にするために必要)

これらはyumでインストールすればよいでしょう。また、本家ガイドによるとSDL-devel(グラフィック端末に必要)やgnutls-devel(VNCでTLSを利用するために必要)が示されていますが、とりあえずなくても動きます。

当方で遭遇した問題なのですが、pciutils-develが3.1.6にアップデートされたとき、3.1.4では問題がなかったpciutls-develパッケージが、pciutils-libsを明示的に指定してやらないとリンクが壊れてライブラリが読めなくなります。念のためこのガイドには両方を指定しています。

環境が整ったら、ソースコードを展開してconfigureを実行します。オプションは色々ありますが、動かすだけなら特別なオプションはいりません。configureは環境をチェックしてオプションの有無を表示するので、必要なオプションが有効化されているかを確認します。

Install prefix    /usr/local
BIOS directory    /usr/local/share/qemu
binary directory  /usr/local/bin
Manual directory  /usr/local/share/man
ELF interp prefix /usr/gnemul/qemu-%M
Source path       /root/make-kvm/qemu-kvm-0.12.2
C compiler        gcc
Host C compiler   gcc
CFLAGS            -O2 -g
QEMU_CFLAGS       -m64 -Wold-style-definition -Wold-style-declaration -I. -I$(SRC_PATH) -U_FORTIFY_SOURCE -D_GNU_SOURCE -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -Wstrict-prototypes -Wredundant-decls -Wall -Wundef -Wendif-labels -Wwrite-strings -Wmissing-prototypes -fno-strict-aliasing
LDFLAGS           -Wl,--warn-common -m64 -g
make              make
install           install
host CPU          x86_64
host big endian   no
target list       x86_64-softmmu
tcg debug enabled no
gprof enabled     no
sparse enabled    no
strip binaries    yes
profiler          no
static build      no
-Werror enabled   no
SDL support       no
curses support    no
curl support      no
check support     no
mingw32 support   no
Audio drivers     oss
Extra audio cards ac97 es1370 sb16
Block whitelist
Mixer emulation   no
VNC TLS support   no
VNC SASL support  no
xen support       no
CPU emulation     yes
brlapi support    no
bluez  support    no
Documentation     no
NPTL support      yes
GUEST_BASE        yes
PIE user targets  no
vde support       no
IO thread         no
Linux AIO support no
Install blobs     yes
KVM support       yes
KVM PIT support   yes
KVM device assig. yes
KVM trace support no
fdt support       no
preadv support    yes
fdatasync         yes
uuid support      no

問題がなければmakeし、終了したらmake installして完了です。

ゲストOSを準備する

続いてゲストOSを起動するための準備をします。

  • ゲストOSのファイルシステムのために、ホストOS上にimgファイルを作ります。このファイルがゲストOSのHDDとしてアタッチされます
  • からっぽのHDDをフォーマットしてインストールするために、ゲストOSのインストールイメージが必要です。インストールしたいゲストOSのインストール用ISOイメージを入手します

ファイルの準備

ゲストOSのためのファイルは、qemu-imgというツールを使います。ゲストOSをvm00と命名し、そのイメージファイルとして「vm00.img」という名前のファイルを作成する場合、以下のようになります。

# qemu-img create -f qcow2 vm00.img 10G

qcow2とはKVMで推奨されているファイルフォーマットの名前です。ちょっと試すためにはこの指定で十分ですが、10GBを超える大きなファイル(たとえば100GB)を指定するとパフォーマンスに多大な影響が出ます。詳細は別の機会に説明したいと思いますが、とりあえず試すなら10GBもあれば十分です。

ゲストOSのインストールISOイメージ

なんでもお好きなものをご用意いただければよいのですが、今回はFreeBSDにします。たとえばftp://ftp.freebsd.org/pub/FreeBSD/releases/i386/ISO-IMAGES/8.0/をご覧いただき、8.0-RELEASE-i386-dvd1.iso.gzをダウンロードして、gunzipしてisoファイルに展開しておきます。

VNCビューアを用意する

ゲストOSを起動した直後には、ゲストOSへのアクセス手段を特別に用意しなければいけません。KVMはSDLとVNCの2つの手段を用意しています。ここではホストOSとは別に、作業用のWindows PCがあることを前提にして、Windowsから簡単にアクセスできるVNCをご紹介しておきます。

VNCクライアントには色々あるので、お好みのものを使ってください。私はUltraVNCのViewer onlyのzipをダウンロードして使っています。

ゲストOSをインストールする

いよいよゲストOSの起動です。これから何度も起動することになると思うので、スクリプトにしておくのがお勧めです。

#!/bin/sh
qemu-system-x86_64 -hda vm00.img -m 1024 -monitor telnet::4444,server,nowait -vnc :0 -daemonize \
  -cdrom 8.0-RELEASE-i386-dvd1.iso -boot d

qemu-system-x86_64がVMを生成してゲストOSを実行するエミュレータです。今回、ゲストOSでのネットワーク設定には触れていません。別の機会にご紹介します。

オプションの意味は以下の通りです。

  • -hda vm00.img
    作成したイメージファイル(vm00.img)を1台目のIDEディスクとしてアタッチします
  • -m 1024
    ゲストOSのメモリサイズを指定します。単位はMBです
  • -monitor telnet::4444,server,nowait
    qemuモニタへのアクセス手段を指定します。上記のようにするとホストOSのポート4444番にtelnetすることでモニタに接続できます。複数のゲストOSを立ち上げる場合、ポート番号を変更して区別できます。nowaitオプションを指定しないと、モニタに接続するまでqemuがホールドしてしまいます
  • -vnc :0
    VNCの接続番号を指定します。複数のゲストOSを立ち上げる場合、この数字を指定して特定のゲストOSに繋ぎます
  • -daemonize
    プロセスをデーモン化します。指定しないと通常プロセスとなるため、コンソールを占拠されてしまいます
  • -cdrom filename.iso
    インストールISOファイルをCD-ROMドライブとしてアタッチします
  • -boot d
    CD-ROMからブートします

コマンドを実行するとすぐにプロンプトに返ってくると思いますが、ゲストOSは起動しています。VNCviewerを使ってアクセスしてみましょう。


ホストOSのIPアドレスを指定すると、起動しているゲストOSへ接続できます。

VNC Viewerの内側は完全にゲストOSの環境なので、キー操作で自由にコントロールできます。インストーラの指示に従ってOSインストールを行います。

インストールが終わったら

インストールが終るとリブートの指示になりますが、KVMはCD-ROMブートに固定されてしまっているので、リブートしてもうまく起動できません。インストーラからゲストOSを終了できないときは、ホストOS上で動くqemuモニタから強制終了することができます。ホストOSのコマンドラインから、telnetを使ってモニタに接続します。起動時に-monitorオプションで指定したポート番号にアクセスするとモニタが起動します。

# telnet localhost 4444
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
QEMU 0.12.2 monitor - type 'help' for more infomation
(qemu) q                        ←コマンド入力
Connection closed by foreign host.

ゲストOSがシャットダウンすると、VNCの接続も自動的に切れます。

イメージファイルにはゲストOSのインストールが終わったので、CD-ROMを外してゲストOSを起動します。先ほどのスクリプトを変更して、-cdrom以降の部分を削除します。

#!/bin/sh
qemu-system-x86_64 -hda vm00.img -m 1024 -monitor telnet::4444,server,nowait -vnc :0 -daemonize

これを実行して、ふたたびVNC Viewerでアクセスすると、今度は起動したFreeBSDのloginプロンプトが見えるはずです。

おわりに

いかがでしたでしょうか。うまく起動できましたか?

ゲストOSのシャットダウンは、FreeBSDであれば shutdown -p をお勧めします。最後にゲストOS自体が切れて完全に終了します。shutdown -h をするとhaltしてしまうので、qemuモニタから切らなければならなくなります。

今後はゲストOSへのネットワークの導入、qemuモニタの使い方、LiveMigrationの方法、ベンチマーク比較などをご紹介する予定です。

参考文献


10件のコメント

  1. […] なぜ今、FCoEか?を、腹に落ちるまで理解すると…(前編)newsing:1 KVMを使う(インストール編) « さくらインターネット研究所はてブ:8 浴衣のアイドル画像まとめnewsing:1 […]

  2. 参考になりました。ありがとうございました。

  3. qemu-imgコマンドの引数にcreateが足りないですね。

  4. 亀レスですみません! 2ヶ月も放置してしまいました。
    おっしゃる通り create が抜けていますね。謹んで訂正させていただきます。

  5. こんにちは!

    KVMとXenのパフォーマンス検証しているんですが、KVMの方がCPU使用率高くて御社で実施されている
    チューニングがあったら教えて下さい!

    よろしくお願いします!

コメントは停止中です。