由VMWare轉KVM

📁 Computer
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而產生出這個問題.