KVM(Ubuntu12.04) + Windows 8 環境下におけるVirtIOを用いたストレージアクセスの改善

自宅のWindows機がお亡くなりになったので、ここらで一つ仮想化でも試してみるかと、Windows 8をノートパソコン上のUbuntu12.04にのっけた。
今回の記事は、Windows 8の導入方法と、ディスクアクセスの高速化について、技術的な情報も含めながら記載している。

細かい環境は、以下の通り。

CPU : Intel(R) Core(TM) i5-2450M CPU @ 2.50GHz
メモリ : 4GB
ストレージ : SSD 128GB
ホストOS : Ubuntu 12.04
ゲストOS : Windows 8 (DSP版)

DSP版を仮想環境に入れてもライセンス的に大丈夫ということは公式サイトで確認済み。

とりあえず、最初は仮想マシンの仕組みを簡単に勉強するためにエンジニアなら知っておきたい仮想マシンのしくみを読んだ。センシティブ命令をちゃんとトラップしなきゃいけないという知識とかが得られた。

Windows 8 のインストール

まずは、virt-managerをインストール。aptから入れられたと思うけど、何入れたかは忘れた。
virt-managerを立ち上げたら

  1. 新しい仮想マシンの作成
  2. ローカルのインストールメディアからインストール
  3. インストールメディアの場所は「ISOイメージを使用」を選択。Windows 8のDVDから作ったisoファイルを指定する。
  4. OSの種類とバージョンは「全般」のまま放置。これ、なんか意味あるんだろうか。
  5. メモリとCPUを適当に割り当て。ディスクイメージは前もって「kvm-img create -f raw windows.img 28G」で作ったイメージを利用。

これで出来てしまった。すごい簡単。

ただし、一度、インストールメディアの指定で躓いた。最初はDVDから読み込みを指定していたが、それではいつまでたってもインストールが進まなかったので、「dd if=/dev/sr0 of=/tmp/windows.iso」みたいな感じでディスクイメージを作成して、それを指定した。

VirtIOを用いたストレージの高速化

まずは、Virt IOの仕組みについて調べた。KVMは基本的に完全仮想化を行うが、ゲストOS側に、仮想環境であることを意識したドライバを入れることによって、パフォーマンスを大幅に上昇できる。・・・みたいな理屈があるのだが、技術的背景が気になる人は以下の記事を読んで欲しい。


やるべきことは、簡単に言ってしまうと

  • ゲストOS(Windows)にVirtIO対応のドライバを入れる
  • 仮想マシンの設定でストレージの通信方式(?)をVirtIOに変更

の2点。

Windows用のVirtIOドライバは、Windows VirtIO Driversの記事中にあるリンク先にあるvirtio-win-0.1-59.isoに含まれている。色んなサイトも言ってるように、64bit版Windowsは一部の例外を除き署名されているドライバしか受け入れないんだけど、上のドライバはRedHatさんが署名してくれている。

isoの中にはWindows 7とかWindows 8とか、それぞれに対応したドライバが格納されている。格納されているドライバは次の通り。

  • BALLOON.INF
  • NETKVM.INF
  • VIOSCSI.INF
  • VIOSER.INF
  • VIOSTOR.INF

VIOSTORがストレージ用ドライバ。VIOSTORがストレージ用であることを確認するために、VirtIO適用後にデバイスマネージャーからoem1.inf(インストール時にVIOSTOR.INFがリネームされた)がストレージと結びついているのを確認した。

VIOSTOR.INFを眺めてみるとSCSIのためのドライバっぽい。デバイスにはまったく詳しくないので、IDE用のドライバとかじゃないんだー? とか最初思った。なんでSCSIドライバをストレージのために使うかという議論は丁寧なスライドがあったのだが、ぱっと見つからないので、KVM - The Linux Kernel-Based Virtual Machineの上の方見てください。

とにかく、VIOSTORをインストールすればよい。方法として、世間でやられているのは、

  1. ストレージの追加で、新しいストレージをVirtIO方式で接続する(virt-managerのハードウェアの追加、からできる)。新しいストレージとして振る舞うイメージファイルは適当に用意する。
  2. Windowsのデバイスマネージャーでそのストレージのドライバが無い旨が!マークで表現されてるので、そこを右クリックしてドライバをisoからインストールする。(virt-managerからvirtio-win-0.1-59.isoを仮想マシンに接続しているCDに見せかけることができる)

という方式。Windowsインストール時にデバイスをインストールできる場面があるので、そこからも出来ると思ってるんだけど、なぜかうまくいかなかった。(詳細は後述)

こうしてドライバを入れた後は、最後にvirt-managerで先程追加した新しいストレージを削除し、元のストレージの接続方式をVirtIOにしてやればよい。
ね、簡単でしょ?

パフォーマンス比較


上がVirtIO適用前で下が適用後。凄まじい高速化! ここまで速いと高速化前の設定がどこかおかしかったか、計測方法が間違ってるか(どっかでキャッシュが効いてしまってるとか)という気もするがとりあえず速くなった。嬉しい。

つまった所

最初は一向にうまくいかなかった。ストレージをイメージファイルではなくパーティションにして、ドライバのインストールを新しいハードウェアの追加を利用した方法ではなく、Windowsインストール時にインストールする方式で試していた。それらを上記の方法に切り替えたらきちんと動くようになった。わからん