しょんぼり技術メモ

まいにちがしょんぼり

KVMのインストールとQCOW2スナップショット

XenでのディスクイメージのスナップショットがどうやってもうまくいかないのでKVMに逃げることにしました。

で、KVMのインストールと。とりあえずCentOS5.2 x86クリーンインストールし、Kernel 2.6.28.3をソースからインストール。
SourceforgeからKVM-84を落としてきて、展開。いくつか必要になるファイルがあるので、

yum install qemu
yum install SDL SDL-devel

でインストーる。

./configure --prefix=/usr/local/kvm
make
make install
modprobe kvm-intel

として、

# lsmod|grep kvm
kvm_intel              47336  0
kvm                   155680  1 kvm_intel

こうなればOK。

ゲストOSの作成

まずはディスクイメージの作成。QCOW2形式なら、最初に全容量を確保しなくて良いのでディスクスペースの有効活用ができる。また、CoW(Copy on Write)が使えるので、ディスクイメージ本体には書き込まず、差分ファイルにデータを書き込むといったことも可能。

$ /usr/local/kvm/bin/qemu-img create -f qcow2 diskimage.qcow2 20G
Formating 'diskimage.qcow2', fmt=qcow2, size=20971520 kB

試しに20GBのディスクイメージを作成したが、実際に消費されているディスクスペースは100KB程度。書き込みを行うとこれが増えていくようになっている。

で、そのイメージとWinXPのISOイメージを使ってゲストOSを起動する。
なお、OSがx86だろうとx86_64だろうと、実行するファイルは qemu-system-x86_64で良いらしい。

-hda でディスクイメージの指定。 -cdrom でOSのインストールディスクのイメージを指定。 -boot d はCDからの起動を意味して、 -m 512 は512MBのメモリをゲストに割り当てる、という意味。

$ sudo /usr/local/kvm/bin/qemu-system-x86_64 -hda diskimage.qcow2 -cdrom ../XPSP3_Custom.iso -boot d -m 512

すると、QEMUの画面が表示されるはず。あとは通常のWindowsのインストール手順と同じ。

スナップショット

QCOW2形式では、起動時に利用するディスクイメージに対して変更を加えない、という起動方法がある。
スナップショットと呼ばれる機能のうち、特にCoW(Copy on Write)と呼ばれるもので、ディスクイメージは読み込み専用となる代わりに、そのディスクイメージへの書き込みは別の一時ファイルに対して行われるというもの。
これを使うと、起動するたびに特定の状態に戻す、といったことが可能になる。

スナップショットを利用するには、

$ sudo /usr/local/kvm/bin/qemu-system-x86_64 -hda diskimage.qcow2 -boot c -m 512 -snapshot

のように、 -snapshot をつければよい。

また、変更を次回以降も適用したいが、基となるディスクイメージには手を加えたくない、という場合には、差分ディスクイメージ形式を使えばよい。
この方法では、ディスクイメージへの変更は、差分ディスクイメージファイルに対して行われる。この差分ディスクイメージファイルはHDD上に残るので、次回以降も使えることになる。

差分ディスクイメージの作成は、qemu-imgコマンドで行う:

qemu-img create -b diskimage.qcow2 -f qcow2 diskimage.diff.qcow2

-b で基になるディスクイメージを指定し、-fで出力する差分ディスクイメージの形式を指定、最後に差分ディスクイメージファイルの名前を指定する。
その上で、ゲストOSを起動する際に、差分ディスクイメージのファイル名を指定してやることで、実際の書き込みは差分ディスクイメージファイルに対して行われる。

具体的な例を出そう。
基になるファイルを diskimage.qcow2 、 差分ディスクイメージファイルを diskimage.diff.qcow2 とした環境を考える。

ゲストOS(WinXP)をインストールしたあとのディスクイメージファイルのMD5ハッシュ値はこのようになっていた。

$ md5sum ./diskimage.*
4fed009e246cbf883fb4e6c5df80a67d  ./diskimage.diff.qcow2
acfda577246b258098f998acd90bb872  ./diskimage.qcow2

ここで、差分ディスクイメージファイルdiskimage.diff.qcow2を指定してゲストOSを起動する。このとき、-snapshot はつけない。
起動したWinXP上で、たとえばC:\test.txt のようなファイルを作成し、書き込みを行い、OSを終了してみる。

終了後に、ディスクイメージファイルを確認してみると、差分ディスクイメージファイルのファイルサイズが約95KBから約15MBまでふくらんでいることが確認できる。
また、MD5ハッシュ値に関しても、

$ md5sum ./diskimage.*
f95ef0dcbb7e126d56dada2552643e14  ./diskimage.diff.qcow2
acfda577246b258098f998acd90bb872  ./diskimage.qcow2

となり、基のイメージファイルには変更は加えられず、差分ディスクイメージファイルにのみ変更が加えられたことが確認できる。
ここで、次もまた差分ディスクイメージファイルを指定してゲストOSを起動すれば、先ほど加えた変更(C:\test.txt)が反映されていることを確認できるし、基のディスクイメージを指定して起動すれば加えた変更が反映されていないことを確認できる。