由VMWare轉KVM

Server需要大修, 於是把web和mysql等, 搬到macmini上, 而用VM的好處, 能把整個IMAGE, 搬到另一部機繼續運行, 而原本那部機就可以大修, 而搬的過程非常簡單方便, 只要在另一部機上裝上VMWare, 再把vm image rsync過去就行.

而為何無故地由VMWare轉上KVM? 因為ubuntu出了9.10, 而原本server行ubuntu6.10, 當時kernel不支援底板在SATA AHCI mode下行SOFTWARE RAID, 而在9.04以後就支援了; 而Server亦因顯示卡爆電容而需要修理一下. 那就順手把原本只行一硬碟的主系統, 轉成行raid1, 並安裝9.10. 為了資料安全, 把舊有系統的硬碟拿掉, 轉了2顆1TB的硬碟, 待安裝完後, 再接上舊硬碟把原有資料rsync回去.

在安裝完成後, 正當要安裝VMWare時, 才發現手上只有VMWare Server 32bit版本, 而現在新系統用64bit, 需要安裝VMWare Server 64bit, 而正需要下載時, VMWare個Site那時正在維修中, 不能下載.

為了盡快把所有的services搬回主server, 唯有試一下用KVM(Kernel-base Virtual Machine).


在由VMWare轉用KVM時, 當然要先安裝KVM.

而在用KVM前, 要先知道CPU本身是否支援硬體VM, 否則不能用KVM.
而本人買CPU最重要是支援硬體VM, 所以沒有問題.
若不知本身所用的CPU是否支援, 可以看看/proc/cpuinfo.
Intel CPU:
grep vmx /proc/cpuinfo
AMD CPU:
grep svm /proc/cpuinfo
如支援的話, 會有result, 否則就是不支援.

如在安裝系統時有選安裝Virtualization的套件, 那就可以開始設定VM.
否則, 可以在此時安裝有關KVM的套件.
sudo apt-get install kvm libvirt-bin ubuntu-vm-builder bridge-utils
安裝完成後, 這時就可用ubuntu-vm-builder去建立新的ubuntu VM.

而此時建立的VM的network, 是用安裝KVM時已建立的vitbr0作NAT mode用, 若希望VM的network是用bridge mode, 就要修改一下/etc/network/interfaces, 增加修改eth0成以下幾行,
DHCP:

auto br0
iface br0 inet dhcp
bridge_ports eth0
bridge_stp off
bridge_fd 5
bridge_maxwait 5


static:

auto br0
iface br0 inet static
address 192.168.0.10
network 192.168.0.0
netmask 255.255.255.0
broadcast 192.168.0.255
gateway 192.168.0.1
bridge_ports eth0
bridge_stp off
bridge_fd 5
bridge_maxwait 5

那就完成. 所有VM由libvirtd來管理, 管理方法是用virsh來控制.
詳細設定及使用ubuntu KVM的方法, 可到這裡.

在準備完畢後, 終於可以試一下怎樣由現有VMWare的image, 轉成能讓KVM使用的image.

首先, 要安裝virt-goodies.

sudo apt-get install virt-goodies

之後用vmware2libvirt去把裝有VMWare VM基本資料的vmx檔轉成KVM能讀的XML. 如

vmware2libvirt -f myvm.vmx > myvm.xml

再把VMWare VM的disk image, 用qemu-img轉成KVM能讀的檔.

qemu-img convert -f vmdk myvm.vmdk -O qcow2 myvm.qcow2

若VMWare VM的disk image是一連串的分割檔, 那就要用VMWare Server本身提供的vmware-vdiskmanager去把分割開的檔合併成一個image, 之後才convert成qcow2檔.

之後再去修改原先由vmx轉成的xml檔, 如修改DISK和NETWORK INTERFACE. 比較要留意disk入面的target dev, 在原本VMWARE入面是ide(target dev=’hda’ bus=’ide’)還是scsi(target dev=’sda’ bus=’scsi’), 用錯了VM的kernel會認錯而找不到ROOT MOUNT;
另外就是若是用bridge mode, 需要把interface type=’network’改成interface type=’bridge’, 而source network=’default’亦要改成source bridge=’br0′.

修改完成, 就可以用以下指令來把VM登記到libvirtd中.

virsh -c qemu:///system define myvm.xml



virsh -c qemu:///system list --all

去看一下所有VM及看看剛才的登記是否成功.

開動VM就用以下指令

virsh -c qemu:///system start myvm

查閱其他指令

virsh -c qemu:///system help

若覺得每次都打virsh -c qemu:///system太麻煩,
以下指令可直接登入libvirt shell中

virsh -c qemu:///system

此時VM是在背景執行中, 因此沒有畫面, 若要由畫面知道VM是否運作正常,
可以安裝virt-viewer來看VM的畫面. 若不能直接看SERVER螢幕, 亦可把virt-viewer安裝在client機, 用此程式遠端連接VM.

先安裝virt-viewer
sudo apt-get install virt-viewer

再用以下指令連上VM.
本機:

virt-viewer -c qemu:///system myvm

遠端:
virt-viewer -c qemu+ssh://server/system myvm

有了libvirt+kvm基本上和vmware的使用方法無異,
現時我用KVM的問題是, libvirtd本身提供了在主機REBOOT後會自動啟動VM, 但我在REBOOT主機時, bridge network有時會出問題,
有時是主機network斷掉, 有時是VM的network. 反而在主機開動完全後, 再啟動VM, 就沒有這個NETWORK問題. 正懷疑是否bridge未啟動完成就啟動了VM而產生出這個問題.

Leave a Reply