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の方法、ベンチマーク比較などをご紹介する予定です。
参考文献
著者

1998年、エス・アール・エス有限会社入社の後、合併を経てさくらインターネット株式会社へ。技術部部長、取締役を経て、2009年7月に研究所所長就任。
会社設立時より技術担当。レンタルサーバ組み立てから始め、データセンタ構築、バックボーン構築、オンラインゲームプロジェクトの技術運用などを歴任。2018年まで、クラウドサービスのマネージャを担当。
初代所長に任命された割に研究者としての実績はなく、論文は学生時代に書いたきり。他、数冊の書籍の執筆経験がある。
最近の興味の中心は、サーバの仮想化、クラスタリングなど。