仮想環境テクノロジの話題でもなく、Linux KVMのなんたるかを語るでもなく、ただのメモ記事なのであしからず。
これまでVMware Server 2でサーバを運用してきたけどやめました。
理由
・最新カーネルに正式対応しない(moduleのビルドがパッチなしでできない)
・パフォーマンスがよくない
・たまにHost側のカーネルがcall traceだしてて不安
・Javaで書かれた管理UIがあまりよくない
で、代替環境としてはXenとかOpenVZとLinux KVMなどがあるわけですが、XenとOpenVZはカスタムカーネルが必要だし、最新カーネルで使えるかといえば否になります。そこで、標準カーネルで使える(=最新カーネルに変更無しで使える)KVMを試すことにしました。
KVMは単なる仮想化支援機能でそれだけでは環境を構築できないので、KVMを利用した仮想環境ソフトウェアが必要になります。
とりあえず、PCエミュレータのqemuがKVM対応してるのでこれを使うことになります。
また、qemuは
libvirtといわれる仮想環境マネージャの上で動かすことで、管理が可能になります。
まぁ標準カーネルで使えて、ブリッジネットワークでIPv6が使えて、リモート管理ができれば何でも良いのですがKVMくらいしかなさそうです。
で、本題。
いかにしてVMwareから移行したかのメモ。
元環境
・VMware Server 2.0.x
・VMは2つ
・ストレージは raw block device, 単一ファイルのvmdk, 分割されたvmdkの三つ
・ネットワークはブリッジ
ぶっちゃけストレージの変換さえできればそれで終わったようなものです。
ともかく、関連するパッケージをいれる。
# apt-get install qemu-kvm libvirt-bin
仮想マシンを定義するXMLは virt-manager とか virtinst とかで作ればよい。
まず raw block デバイスは変換の必要はない。そのままつかえる。
<disk type='block' defice='disk'>
<source dev='/dev/sdb' />
<target dev='vda' bus='virtio' />
</disk>
次に vmdk。これはまぁqcow2形式にするのがいいらしいということなので
# qemu-img convert -f vmdk source.vmdk -O qcow2 dest.vmdk
単一だろうが分割だろうかこれでOK
XMLは
<disk type='file' device='disk'>
<driver name='qemu' type='qcow2'/>
<source file='/storage/1/kvm/vm1.img'/>
<target dev='vda' bus='virtio'/>
</disk>
こんな感じで。
Guest側では /dev/vda? でマウント
次にネットワーク。ブリッジを使ってHostを含めて外部と通信するので、Hostの/etc/network/interfaces に
auto br0
iface br0 inet static
address 192.168.1.1
netmask 255.255.255.0
broadcast 192.168.1.255
bridge_ports eth0
こんな感じでbr0を作成。
VMのXMLでは
<interface type='bridge'>
<mac address='fe:ff:ff:7a:a7:4d'/>
<source bridge='br0'/>
<model type='virtio'/>
</interface>
こんなんで。
まとめ /etc/libvirt/qemu/vm1.xml
<domain type='kvm'>
<name>vm2</name>
<uuid>b7a82db2-d205-ae5c-021e-a43d21755a42</uuid>
<memory>2097152</memory>
<currentMemory>2097152</currentMemory>
<vcpu>1</vcpu>
<os>
<type arch='i686' machine='pc-0.11'>hvm</type>
<boot dev='hd'/>
</os>
<features>
<acpi/>
<apic/>
<pae/>
</features>
<clock offset='utc'/>
<on_poweroff>destroy</on_poweroff>
<on_reboot>restart</on_reboot>
<on_crash>restart</on_crash>
<devices>
<emulator>/usr/bin/kvm</emulator>
<disk type='file' device='disk'>
<driver name='qemu' type='qcow2'/>
<source file='/storage/1/kvm/vm1.img'/>
<target dev='vda' bus='virtio'/>
</disk>
<interface type='bridge'>
<mac address='fe:ff:ff:7a:a7:5d'/>
<source bridge='br0'/>
<model type='virtio'/>
</interface>
<console type='pty'>
<target port='0'/>
</console>
<input type='mouse' bus='ps2'/>
<graphics type='vnc' port='-1' autoport='yes' keymap='en-us'/>
<video>
<model type='cirrus' vram='9216' heads='1'/>
</video>
</devices>
</domain>
virsh create /etc/libvirt/qemu/vm1.xml などとして起動。
コンソールは VNC でremoteからopenできる。
結局のところ、VMwareに比べてネットワークのパフォーマンスがかなり上がった。
block I/Oはそれほどでもない気がする。若干VMwareよりいいかなというくらい。
すこぶる安定して動いてくれてるのでそれが一番。
あと 2.6.32 から Kernel Samepage Mergingという機能が追加されたのでこれを使うと消費メモリを抑えられる。(らしい)
複数プロセスでの共通ページをマージして重複を排除するという機能。
VMなんかでは比較的共通のメモリ領域が発生しやすいので有効だとか。
# echo 1 > /sys/kernel/mm/ksm/run
それほど効いているような気はしない。
あとはlibvirt, virt-managerの出来次第か。まだ発展途上なのでこれからに期待。