今回は、Fedora 13を使って最新のLinux KVM機能を解説します。基本的な使い方については省略しますので、基本から学びたい方は以前弊社宮原が執筆した「実践!仮想化ソフトウェア 2009 第5回 Linux KVMを使ってみよう」 を参照してください。
CentOS 5とFedora 13のLinux KVMの違い
先述の記事では、CentOS 5.4を利用してLinux KVMの基本的な使い方を解説しました。現在はCentOS 5.5がリリースされていますが、今回は2010年中にリリース予定のRed Hat Enterprise Linux 6(RHEL6)を想定して、よりRHEL6に環境が近いと思われるFedora 13を選択しています。
Fedora 13のLinux KVMおよびその周辺ツールは、CentOS 5に比べて新しい機能が数々追加されており、最新のLinux KVMに触れるには良い環境となっています。本項では、次の3つについて解説していきます。
仮想マシンマネージャーのアップデート
virshコマンドの拡充
vhost_net機能の追加
Fedora14について
つい先日、Fedora14がリリースされました。今回は時間の都合で詳しく取り上げることはできませんが、仮想化関連では次のような機能が加えられています。
デスクトップ仮想化「SPICE」の搭載
XenからKVMへの移行支援ツール「virt-v2v」を収録
Xenカーネルのサポート(DomUのみ)
仮想マシンマネージャーでネットワークブリッジを設定する
これまで、Linux KVMの仮想マシンでブリッジ接続を行うには設定ファイルの書き換えが必要でした。Fedora 13に収録されている最新の仮想マシンマネージャーでは、面倒なスクリプト書き換え作業をする事なく簡単にネットワークのブリッジ設定が行えるようになりました。
ブリッジ設定を行う前に必要な作業
Fedora 13は、ネットワーク接続管理に従来のnetworkではなくNetworkManagerを使用しています。しかし、仮想マシンマネージャーはNetworkManager環境下でブリッジを作成することができません。
そこで、仮想マシンマネージャーでブリッジを作成する前に以下のコマンドを実行して、NetworkManagerから従来のnetworkに切り替えます。
# /etc/init.d/NetworkManager stop
# /etc/init.d/network start
# chkconfig NetworkManager off
# chkconfig network on
仮想マシンマネージャーでブリッジを作成
仮想マシンマネージャーのリストからホストを選択し、メニューバーの「編集」 →「 Connection Details」を選択します。
図1 仮想マシンマネージャーのメイン画面
ホストの詳細ウィンドウの「ネットワークインターフェース」タブを開きます。左下の「+」ボタンをクリックします。
図2 ホストの詳細画面
インターフェースの種類を選択します。「 Bridge」を選択して次に進みます。
図3 インターフェースの設定画面(1ページ目)
ブリッジ名や、ブリッジに使用する物理インターフェースを設定します。ここではeth0のブリッジとしてbr0を作成することとします。名前を入力し、「 開始モード」は「onboot」にします。「 ブリッジするインターフェースを選択」でeth0を選択すると、「 IPの設定」が自動的にeth0の設定を引き継ぐよう設定されます。「 ブリッジの設定」はデフォルトのままで良いです。
「完了」をクリックすると作成が実行されます。eth0の設定を上書きしても良いか尋ねられるので「はい」をクリックします。
図4 インターフェースの設定画面(2ページ目)
以上でブリッジが作成され、仮想マシンのネットワーク接続方法として使用可能になります。
強化されたvirshコマンド
Fedora 13に収録されているvirshコマンドはバージョン0.8.2となり、CentOS 5.5に収録されているバージョン0.6.3に比べて44ものオプションが追加されています。先述のネットワークインターフェース関連の設定もvirshコマンドから実行可能となっており、コマンドで操作できる内容がより充実してきたと言えます。
新しい機能すべてを紹介するのは大変ですので、ここではdomjobinfoとdomjobabortの2つのオプションについて簡単に解説します。これらのオプションは、仮想マシンのマイグレーションに関する内容になります。
ちなみに、virshからマイグレーションを行うには次のようにコマンドを実行します。
# virsh migrate 仮想マシン名 qemu+ssh://移動先ホスト名 /system
※ライブマイグレーションを行う場合は--liveを付記する
domjobinfo
# virsh domjobinfo 仮想マシン名
このオプションは仮想マシンのマイグレーションの状態を表示します。仮想マシンのライブマイグレーションを実行している途中で実行すると、仮想マシンのデータの転送状況が表示されます。
# virsh domjobinfo vm01
Job type: Unbounded
Time elapsed: 23763 ms
Data processed: 495.160 MB
Data remaining: 579.109 MB
Data total: 1.016 GB
Memory processed: 495.160 MB
Memory remaining: 579.109 MB
Memory total: 1.016 GB
domjobabort
このオプションは実行中のマイグレーションを中止させます。中止すると、仮想マシンは移動元のホストに残ったまま動作を続けます。
# virsh domjobabort VM名
vhost_net機能を試す
vhost_netは、通常のネットワーク仮想化よりもシステムコール回数を減らしてオーバーヘッドを減らすことを目的としたカーネルモジュール実装です。この機能はKernel 2.6.33で組み込まれ、Fedora 13をはじめとした最新のLinuxで利用することが可能です。
vhost_netを有効にする
有効にするには「vhost_net」カーネルモジュールを読み込みます。
# modprobe vhost_net
lsmodコマンドで、モジュールが読み込まれたことを確認します。
# lsmod | grep vhost_net
vhost_net 21253 0
macvtap 6980 1 vhost_net
tun 13854 3 vhost_net
仮想マシンの仮想NICオプションでvhost_netを有効にした状態で起動すると、有効にした仮想NICの数だけvhost_netのカウントが増えていきます。それでは、仮想マシンを起動してみましょう。
vhost_netを有効にして仮想マシンを起動する
現状では、仮想マシンマネージャーでvhost_netを有効にして仮想マシンを起動することはできないようですので、コマンドを直接実行して仮想マシンを起動します。はじめに、仮想マシンマネージャーで通常通りVMを起動し、psコマンドで実行コマンドを取得してテキストエディタに貼り付けます。
# ps auxww | grep qemu-kvm
不要なパラメータを取り除きつつ、vhost_netを有効にするための「vhost=on」パラメータを「-net」のオプション部分に追記します。赤文字が取り除くパラメータ、青文字が追記する部分です。
/usr/bin/qemu-kvm -S -M fedora-13 -enable-kvm -m 1024 -smp 1,sockets=1,cores=1,threads=1 -name FedoraVM1 -uuid 74b52e50-b95e-569e-1f04-85101152e6e3 -nodefaults -chardev socket,id=monitor,path=/var/lib/libvirt/qemu/FedoraVM1.monitor,server,nowait -mon chardev=monitor,mode=readline -rtc base=utc -boot c -drive file=/var/lib/libvirt/images/FedoraVM1.img,if=none,id=drive-virtio-disk0,boot=on,format=raw -device virtio-blk-pci,bus=pci.0,addr=0x4,drive=drive-virtio-disk0,id=virtio-disk0 -device virtio-net-pci,vlan=0,id=net0,mac=52:54:00:89:50:ba,bus=pci.0,addr=0x5 -net tap,fd=40, vlan=0,name=hostnet0,vhost=on -chardev pty,id=serial0 -device isa-serial,chardev=serial0 -usb -device usb-tablet,id=input0 -vnc 127.0.0.1:0 -vga cirrus -device AC97,id=sound0,bus=pci.0,addr=0x6 -device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x3
上記パラメータで仮想マシンを実行する前に、2つのスクリプトを/etcの中に作成する必要があります。これは、仮想マシンがネットワークに接続するために必要なスクリプトになります。まず、次のスクリプトを「/etc/qemu-ifup」ファイルとして作成します。パーミッションは755です。
#!/bin/sh
echo "Bringing up $1 for bridged mode..."
ifconfig $1 0.0.0.0 promisc up
echo "Adding $1 to br0..."
brctl addif br0 $1
同じく「/etc/qemu-ifdown」ファイルを作成します。こちらのパーミッションを755にします。
#!/bin/sh
echo "Removing $1 to br0..."
brctl delif br0 $1
echo "Shutting down $1..."
ifconfig $1 down
スクリプトの設置が完了したら、仮想マシンを起動してみましょう。またlsmodコマンドを実行し、vhost_netのカウントが増えていることを確認してください。
パフォーマンスの確認
vhost_netを有効にすると、TCP_RR(単位時間あたりに送受信されるTCPのデータ数)が改善されます。TCP_RR値のベンチマークを行うにはNetperfを使用します。公式サイト よりソースコードをダウンロードして、コンパイルして使用することが可能です。
ベンチマークは、仮想化環境とは別にマシンを1台用意し、別のマシンから仮想化環境上のVMに対してベンチマークを実行します。パラメータは次のようになります。
# netperf -H VMのIPアドレス -t TCP_RR -c -C -l 30
私が社内のサーバと10Gbのイーサネットカードを使用したベンチマークを実施したところ、ほぼ誤差の範囲となり、残念ながら目に見えて大きく改善されるわけではありませんでした。
ベンチマークの詳細は以前イベントで発表したスライドがありますので、ご興味がある方はこちらも合わせて参照してください。
日本仮想化技術株式会社 公開資料
URL:http://VirtualTech.jp/handout/
まとめ
KVMの基本的な部分に関してはCentOS 5でも概ね簡単に管理することができましたが、Fedora 13ではより細かい部分での使い勝手が向上しているように感じました。
vhost_netについてはわかりやすく改善されている例が紹介できませんでしたが、環境によっては大きく改善される可能性もありますので、皆さんも秋の夜長にベンチマークなどはいかがでしょうか。