Linux KVM上でSEIL/x86を使う

先日リリースされたSEIL/x86 2.20にてKVM対応を行いました。今回はKVMの簡単な紹介とSEIL/x86をKVM上で動作させるための起動オプションについて解説します。

記事一覧

機能解説に関しては、以下のページに記載しています。

http://www.seil.jp/support/tech/doc/function/vm/kvm/x86_kvm.html

KVMとは

KVMとは Linuxで動作する仮想化技術の一つです。KVMが提案される以前には Linux上で動作する仮想化ソフトウェアの一つとして、qemuというソフトウェアがありました。qemuの完全仮想化方式ではCPU命令をすべてユーザランドでエミュレーションするため、ゲストOSの動作が遅いという問題がありました。

そこで、カーネルモジュールを通して、Intel VTもしくは、AMD-Vに対応したCPUに対して、命令を実行することにより、qemuよりも高速に仮想マシンを実行できるようにしたものがKVMという技術です。KVMは KVMモジュールとKVMに対応したqemu(qemu-kvm)が連携することにより、ゲストOSを実用的な速度で実行することができます。

また、qemu-kvm上で動作するマシン(以下 ゲストOS)の様々な入出力を高速化するために、準仮想化ドライバ(virtio)といったものがKVMではサポートされています。

virtio とは

virtioとは、ゲストOSの様々な入出力を高速に動作させるためのKVMにおける準仮想化ドライバです。virtioはKVMに対して直接入出力を行うため、qemu-kvm 上でエミュレーションされたハードウェアデバイスを介してKVMに入出力を行うよりも性能を向上させることができます。

準仮想化ドライバは、以下のような種類があります。

これらのドライバをゲストOSがサポートすることにより、ゲストOSのパフォーマンスを向上させることや利便性の向上が期待できます。

SEIL/x86 では、ネットワークドライバと時刻同期ドライバに対応しています。

KVMにおける仮想マシンの管理方法

KVMでは以下のような仮想マシンの管理方法が挙げられます。

今回はCUIからSEIL/x86を起動するためのオプションについて解説します。

SEIL/x86の起動方法

SEIL/x86では以下の環境で動作を確認しています。

qemu-kvm は以下のコマンドでインストールしています

# yum install qemu-kvm

それでは以下のようなシンプルな構成を構築するために必要な手順を説明していきます。

ネットワークの設定

今回はSEIL/x86をお試しで使うために、brctl コマンドを使ってゲストOSとホストOSのネットワークインタフェースを紐付けるブリッジインタフェースを作成しています。

再起動後にもブリッジインタフェースを有効にしたい場合には、/etc/sysconfig/network-scripts 以下に設定を適宜記述してください。

まずは、ゲストOSが外部のネットワークと通信するために必要になるブリッジインタフェースを作成します。

# brctl addbr br0

そして、ゲストOS側で作成されるネットワークインタフェースとホストOS上で認識している物理的なネットワークインタフェースを紐付けるために、インタフェースの追加を行います。

# brctl addif br0 eth0

SEIL/x86 の起動オプション

qemu-kvm コマンドに以下のようなオプションを指定して起動します。

# qemu-kvm -enable-kvm -m 512 \
-net nic,model=virtio \
-net tap,ifname=tap0,script=/etc/qemu-ifup-br0,downscript=no \
-net nic,model=virtio \
-net tap,ifname=tap1,script=/etc/qemu-ifup-br0,downscript=no \
-drive file=seilx86.qcow2,index=0 \
-vnc :1

各オプションの意味は以下のようになります。

  • -enable-kvm
    • KVMを有効にしてゲストOSを起動する
  • -m 512
    • ゲストOSにメモリを512MB割り当てる
  • -net nic,model=virtio
    • ネットワークインタフェースに virtio を使用する
  • -net tap,ifname=tap0,script=/etc/qemu-ifup-br0,downscript=no
    • tapインタフェースを使用して、起動時に /etc/qemu-ifup-br0 スクリプトを実行する。ダウン時のスクリプトは無し
  • -drive file=seilx86.qcow2,index=0
    • ディスクに関する設定。ゲストOSのディスクイメージとしてseilx86.qcow2 を使用する
  • -vnc :1
    • ホストOSのVNC画面の1番を有効にする

qemu-ifup-br0 は以下のようなスクリプトです。

#!/bin/sh -e

SCRIPT=`basename $0`
BRIDGE=${SCRIPT#qemu-ifup-}

# create tap interface
echo "create interface: $1"
ifconfig $1 0.0.0.0 promisc up
echo "done"

# assign to bridge
echo "bridge: $BRIDGE"
brctl addif $BRIDGE $1
echo "done"

このスクリプトが実行されることにより、tap0, tap1 インタフェースが br0 に紐付けられ、eth0 と対応付けられます。こういった仕組みによって、ゲストOS上からホストOSを通してネットワークの疎通を取ることが可能になります。

起動オプションの注意点

SEIL/x86では virtio ディスクドライバに対応していないため、以下のようなオプションを指定してしまうと正常に動作しないことがあります。

-drive file=seilx86.qcow2,if=virtio,index=0

前述したオプションとの相違点は「if=virtio」が指定されていることです。これは ディスクの入出力に virtio を使用するといったオプションですが、SEIL/x86 では対応していないため、このオプションは指定しないでください。

virtio ディスクドライバに関しては現在実装中ですので、次回リリースまでお待ちください。

また、同様に -drive オプションの中で

-drive file=seilx86.qcow2,index=0,boot=on

のように「boot=on」という指定が含まれていると、qemu-0.15.0未満を使っている場合に正しく動作しないことが分かっています。(SEIL/x86が再起動を繰り返してしまう) qemu-0.15.0 以降であれば問題なく動作すると思われますが、ご注意ください。

ゲストOSへの接続

正常に起動が完了したら、ホストOSに対して VNC クライアントを用いて接続します。

サンプル画面では「RealVNC」を使用して、ホストOSのIPアドレスである 192.168.1.43の画面番号1番に対して接続しています。

設定した仮想インタフェースが認識されているかどうかを確認するためにshow config interface コマンドを実行してみます。

インタフェースが2つ認識されていることが確認できるかと思います。

最後に

今回は qemu-kvm を使ったSEIL/x86の起動までを解説しました。今回は構成要素を簡素にするために、qemu-kvmを用いた起動方法をご紹介しましたが、次回では仮想マシンの管理が容易なLinuxのGUI上からSEIL/x86を起動するまでをご紹介します。