特殊:Badtitle/NS100:KVM
![]() |
文章出处: |
{{#if: | {{{2}}} | https://help.ubuntu.com/community/KVM }} |
![]() |
点击翻译: |
English {{#ifexist: {{#if: UbuntuHelp:KVM | UbuntuHelp:KVM | {{#if: | :}}KVM}}/af | • {{#if: UbuntuHelp:KVM|Afrikaans| [[::KVM/af|Afrikaans]]}}|}} {{#ifexist: {{#if: UbuntuHelp:KVM | UbuntuHelp:KVM | {{#if: | :}}KVM}}/ar | • {{#if: UbuntuHelp:KVM|العربية| [[::KVM/ar|العربية]]}}|}} {{#ifexist: {{#if: UbuntuHelp:KVM | UbuntuHelp:KVM | {{#if: | :}}KVM}}/az | • {{#if: UbuntuHelp:KVM|azərbaycanca| [[::KVM/az|azərbaycanca]]}}|}} {{#ifexist: {{#if: UbuntuHelp:KVM | UbuntuHelp:KVM | {{#if: | :}}KVM}}/bcc | • {{#if: UbuntuHelp:KVM|جهلسری بلوچی| [[::KVM/bcc|جهلسری بلوچی]]}}|}} {{#ifexist: {{#if: UbuntuHelp:KVM | UbuntuHelp:KVM | {{#if: | :}}KVM}}/bg | • {{#if: UbuntuHelp:KVM|български| [[::KVM/bg|български]]}}|}} {{#ifexist: {{#if: UbuntuHelp:KVM | UbuntuHelp:KVM | {{#if: | :}}KVM}}/br | • {{#if: UbuntuHelp:KVM|brezhoneg| [[::KVM/br|brezhoneg]]}}|}} {{#ifexist: {{#if: UbuntuHelp:KVM | UbuntuHelp:KVM | {{#if: | :}}KVM}}/ca | • {{#if: UbuntuHelp:KVM|català| [[::KVM/ca|català]]}}|}} {{#ifexist: {{#if: UbuntuHelp:KVM | UbuntuHelp:KVM | {{#if: | :}}KVM}}/cs | • {{#if: UbuntuHelp:KVM|čeština| [[::KVM/cs|čeština]]}}|}} {{#ifexist: {{#if: UbuntuHelp:KVM | UbuntuHelp:KVM | {{#if: | :}}KVM}}/de | • {{#if: UbuntuHelp:KVM|Deutsch| [[::KVM/de|Deutsch]]}}|}} {{#ifexist: {{#if: UbuntuHelp:KVM | UbuntuHelp:KVM | {{#if: | :}}KVM}}/el | • {{#if: UbuntuHelp:KVM|Ελληνικά| [[::KVM/el|Ελληνικά]]}}|}} {{#ifexist: {{#if: UbuntuHelp:KVM | UbuntuHelp:KVM | {{#if: | :}}KVM}}/es | • {{#if: UbuntuHelp:KVM|español| [[::KVM/es|español]]}}|}} {{#ifexist: {{#if: UbuntuHelp:KVM | UbuntuHelp:KVM | {{#if: | :}}KVM}}/fa | • {{#if: UbuntuHelp:KVM|فارسی| [[::KVM/fa|فارسی]]}}|}} {{#ifexist: {{#if: UbuntuHelp:KVM | UbuntuHelp:KVM | {{#if: | :}}KVM}}/fi | • {{#if: UbuntuHelp:KVM|suomi| [[::KVM/fi|suomi]]}}|}} {{#ifexist: {{#if: UbuntuHelp:KVM | UbuntuHelp:KVM | {{#if: | :}}KVM}}/fr | • {{#if: UbuntuHelp:KVM|français| [[::KVM/fr|français]]}}|}} {{#ifexist: {{#if: UbuntuHelp:KVM | UbuntuHelp:KVM | {{#if: | :}}KVM}}/gu | • {{#if: UbuntuHelp:KVM|ગુજરાતી| [[::KVM/gu|ગુજરાતી]]}}|}} {{#ifexist: {{#if: UbuntuHelp:KVM | UbuntuHelp:KVM | {{#if: | :}}KVM}}/he | • {{#if: UbuntuHelp:KVM|עברית| [[::KVM/he|עברית]]}}|}} {{#ifexist: {{#if: UbuntuHelp:KVM | UbuntuHelp:KVM | {{#if: | :}}KVM}}/hu | • {{#if: UbuntuHelp:KVM|magyar| [[::KVM/hu|magyar]]}}|}} {{#ifexist: {{#if: UbuntuHelp:KVM | UbuntuHelp:KVM | {{#if: | :}}KVM}}/id | • {{#if: UbuntuHelp:KVM|Bahasa Indonesia| [[::KVM/id|Bahasa Indonesia]]}}|}} {{#ifexist: {{#if: UbuntuHelp:KVM | UbuntuHelp:KVM | {{#if: | :}}KVM}}/it | • {{#if: UbuntuHelp:KVM|italiano| [[::KVM/it|italiano]]}}|}} {{#ifexist: {{#if: UbuntuHelp:KVM | UbuntuHelp:KVM | {{#if: | :}}KVM}}/ja | • {{#if: UbuntuHelp:KVM|日本語| [[::KVM/ja|日本語]]}}|}} {{#ifexist: {{#if: UbuntuHelp:KVM | UbuntuHelp:KVM | {{#if: | :}}KVM}}/ko | • {{#if: UbuntuHelp:KVM|한국어| [[::KVM/ko|한국어]]}}|}} {{#ifexist: {{#if: UbuntuHelp:KVM | UbuntuHelp:KVM | {{#if: | :}}KVM}}/ksh | • {{#if: UbuntuHelp:KVM|Ripoarisch| [[::KVM/ksh|Ripoarisch]]}}|}} {{#ifexist: {{#if: UbuntuHelp:KVM | UbuntuHelp:KVM | {{#if: | :}}KVM}}/mr | • {{#if: UbuntuHelp:KVM|मराठी| [[::KVM/mr|मराठी]]}}|}} {{#ifexist: {{#if: UbuntuHelp:KVM | UbuntuHelp:KVM | {{#if: | :}}KVM}}/ms | • {{#if: UbuntuHelp:KVM|Bahasa Melayu| [[::KVM/ms|Bahasa Melayu]]}}|}} {{#ifexist: {{#if: UbuntuHelp:KVM | UbuntuHelp:KVM | {{#if: | :}}KVM}}/nl | • {{#if: UbuntuHelp:KVM|Nederlands| [[::KVM/nl|Nederlands]]}}|}} {{#ifexist: {{#if: UbuntuHelp:KVM | UbuntuHelp:KVM | {{#if: | :}}KVM}}/no | • {{#if: UbuntuHelp:KVM|norsk| [[::KVM/no|norsk]]}}|}} {{#ifexist: {{#if: UbuntuHelp:KVM | UbuntuHelp:KVM | {{#if: | :}}KVM}}/oc | • {{#if: UbuntuHelp:KVM|occitan| [[::KVM/oc|occitan]]}}|}} {{#ifexist: {{#if: UbuntuHelp:KVM | UbuntuHelp:KVM | {{#if: | :}}KVM}}/pl | • {{#if: UbuntuHelp:KVM|polski| [[::KVM/pl|polski]]}}|}} {{#ifexist: {{#if: UbuntuHelp:KVM | UbuntuHelp:KVM | {{#if: | :}}KVM}}/pt | • {{#if: UbuntuHelp:KVM|português| [[::KVM/pt|português]]}}|}} {{#ifexist: {{#if: UbuntuHelp:KVM | UbuntuHelp:KVM | {{#if: | :}}KVM}}/ro | • {{#if: UbuntuHelp:KVM|română| [[::KVM/ro|română]]}}|}} {{#ifexist: {{#if: UbuntuHelp:KVM | UbuntuHelp:KVM | {{#if: | :}}KVM}}/ru | • {{#if: UbuntuHelp:KVM|русский| [[::KVM/ru|русский]]}}|}} {{#ifexist: {{#if: UbuntuHelp:KVM | UbuntuHelp:KVM | {{#if: | :}}KVM}}/si | • {{#if: UbuntuHelp:KVM|සිංහල| [[::KVM/si|සිංහල]]}}|}} {{#ifexist: {{#if: UbuntuHelp:KVM | UbuntuHelp:KVM | {{#if: | :}}KVM}}/sq | • {{#if: UbuntuHelp:KVM|shqip| [[::KVM/sq|shqip]]}}|}} {{#ifexist: {{#if: UbuntuHelp:KVM | UbuntuHelp:KVM | {{#if: | :}}KVM}}/sr | • {{#if: UbuntuHelp:KVM|српски / srpski| [[::KVM/sr|српски / srpski]]}}|}} {{#ifexist: {{#if: UbuntuHelp:KVM | UbuntuHelp:KVM | {{#if: | :}}KVM}}/sv | • {{#if: UbuntuHelp:KVM|svenska| [[::KVM/sv|svenska]]}}|}} {{#ifexist: {{#if: UbuntuHelp:KVM | UbuntuHelp:KVM | {{#if: | :}}KVM}}/th | • {{#if: UbuntuHelp:KVM|ไทย| [[::KVM/th|ไทย]]}}|}} {{#ifexist: {{#if: UbuntuHelp:KVM | UbuntuHelp:KVM | {{#if: | :}}KVM}}/tr | • {{#if: UbuntuHelp:KVM|Türkçe| [[::KVM/tr|Türkçe]]}}|}} {{#ifexist: {{#if: UbuntuHelp:KVM | UbuntuHelp:KVM | {{#if: | :}}KVM}}/vi | • {{#if: UbuntuHelp:KVM|Tiếng Việt| [[::KVM/vi|Tiếng Việt]]}}|}} {{#ifexist: {{#if: UbuntuHelp:KVM | UbuntuHelp:KVM | {{#if: | :}}KVM}}/yue | • {{#if: UbuntuHelp:KVM|粵語| [[::KVM/yue|粵語]]}}|}} {{#ifexist: {{#if: UbuntuHelp:KVM | UbuntuHelp:KVM | {{#if: | :}}KVM}}/zh | • {{#if: UbuntuHelp:KVM|中文| [[::KVM/zh|中文]]}}|}} {{#ifexist: {{#if: UbuntuHelp:KVM | UbuntuHelp:KVM | {{#if: | :}}KVM}}/zh-hans | • {{#if: UbuntuHelp:KVM|中文(简体)| [[::KVM/zh-hans|中文(简体)]]}}|}} {{#ifexist: {{#if: UbuntuHelp:KVM | UbuntuHelp:KVM | {{#if: | :}}KVM}}/zh-hant | • {{#if: UbuntuHelp:KVM|中文(繁體)| [[::KVM/zh-hant|中文(繁體)]]}}|}} |
{{#ifeq:UbuntuHelp:KVM|:KVM|请不要直接编辑翻译本页,本页将定期与来源同步。}} |
{{#ifexist: :KVM/zh | | {{#ifexist: KVM/zh | | {{#ifeq: {{#titleparts:KVM|1|-1|}} | zh | | }} }} }} {{#ifeq: {{#titleparts:KVM|1|-1|}} | zh | | }}
- title The Kernel Virtual Machine
Introduction
Preliminary notes
- This is still work in progress! Feel free to jump in and extend this documentation!
- The previous version of this page (which was documenting KVM for Feisty) has been moved to KVMFeisty
Basic info
Ubuntu uses kvm as the backend virtualisation technology. To manage VMs we use libvirt as the basic toolbox and virt-manager as the graphical frontend for managing your vm's.
How to get started
How to check if your CPU supports hardware virtualisation
To run KVM, you need a processor that supports virtualisation; Intel and AMD both have developed extensions for their processors, respectively INTEL-VT and AMD-V. To see if your processor supports one of these, you can run the following command:
egrep '(vmx|svm)' /proc/cpuinfo
If nothing is printed, it means that your CPU doesn't support hardware virtualisation. Otherwise, it does - but you still need to make sure that virtualisation is enabled in the BIOS.
Installation of KVM
For the following setup, we will assume that you are deploying KVM on a server, and therefore do not have any X server on the machine. You need to install a few packages first:
$ sudo apt-get install kvm libvirt-bin ubuntu-vm-builder
- libvirt-bin provides libvirtd which you need to administer qemu and kvm instances using libvirt
- kvm is the backend
- ubuntu-vm-builder powerful command line tool for building virtual machines
Then, add yourself to the libvirtd and kvm groups:
$ sudo adduser `id -un` libvirtd $ sudo adduser `id -un` kvm
This will give you access to the system-wide libvirtd instance. This is preferable for you because it gives you access to the advanced networking options rather than simply the "userspace networking" option as you may know it from QEmu. Note: You need to log out and log back in for the new group membership to take effect. Note: The `id -un` command will return the current username, for example if your username is joe you will be effectively be running sudo adduser joe libvirtd. You can test if your install has been successful with the following command:
$ virsh -c qemu:///system list Id Name State ---------------------------------- $
If on the other hand you get something like this:
$ virsh -c qemu:///system list libvir: Remote error : Permission denied error: failed to connect to the hypervisor $
Something is wrong and you probably want to fix this before you move on. The critical point here is whether or not you have write access to /var/run/libvirt/libvirt-sock.
Network Bridging
There are a few different ways to allow a virtual machine access to the external network. The default virtual network configuration is usermode networking, which uses the SLIRP protocol and traffic is NATed through the host interface to the outside network. To enable external hosts to directly access services on virtual machines a bridge needs to be configured. This allows the virtual interfaces to connect to the outside network through the physical interface, making them appear as normal hosts to the rest of the network. Warning: Network bridging will not work when the physcial network device (eg eth1, ath0) used for bridging is a wireless device (eg ipw3945), as most wireless device drivers do not support bridging!
Creating a network bridge on the host
To setup a bridge interface edit /etc/network/interfaces and either comment or replace the existing config with (replace with the values for your network):
auto lo iface lo inet loopback 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_fd 9 bridge_hello 2 bridge_maxage 12 bridge_stp off iface eth0 inet static address 172.16.5.0 netmask 255.255.255.0
or to use DHCP
auto lo iface lo inet loopback auto br0 iface br0 inet dhcp bridge_ports eth0 bridge_fd 9 bridge_hello 2 bridge_maxage 12 bridge_stp off iface eth0 inet static address 172.16.5.0 netmask 255.255.255.0
This will create a virtual interface br0. Don't worry about the static eth0 line. It gets overwritten by the bridge but the statement is necessary or you get an eth0 error. Now restart networking :
sudo /etc/init.d/networking restart
Configuring ubuntu-vm-builder to create bridged guests by default
Virtual machines are defined in XML files; ubuntu-vm-builder, the tool we will use to create VMs, bases them on the template file /usr/share/ubuntu-vm-builder/templates/libvirt.tmpl. Open that file, and change:
<interface type='network'> <mac address='%MAC%'/> <source network='default'/> </interface>
To:
<interface type='bridge'> <mac address='%MAC%'/> <source bridge='br0'/> </interface>
Converting an existing guest
If you have already created VMs before, you can make them use bridged networking if you change the XML definition (in /etc/libvirt/qemu/) for the network interface, adjusting the mac address as desired from:
<interface type='network'> <mac address='00:11:22:33:44:55'/> <source network='default'/> </interface>
to:
<interface type='bridge'> <mac address='00:11:22:33:44:55'/> <source bridge='br0'/> </interface>
You do not need to restart libvirtd to reload the changes; the easiest way is to log into virsh (a command line tool to manage VMs), stop the VM, reread its configuration file, and restart the VM:
yhamon@paris:/etc/libvirt/qemu$ ls mirror.xml networks vm2.xml yhamon@paris:/etc/libvirt/qemu$ sudo virsh Connecting to uri: qemu:///system Welcome to virsh, the virtualization interactive terminal. Type: 'help' for help with commands 'quit' to quit virsh # list Id Name State ---------------------------------- 10 vm2 running 15 mirror running virsh # shutdown mirror Domain mirror is being shutdown virsh # define mirror.xml Domain mirror defined from mirror.xml virsh # start mirror Domain mirror started
The VM "mirror" is now using bridged networking.
Creating virtual machines
Now that KVM is installed, let s see how we install our first VM. There is a tool to manage VMs on a remote host: virt-manager. Sadly, VM creation on a remote host is not supported yet - therefore you will have to create the VM in command line. There are two different tools to do this; virt-install, a python script developed by redhat, and ubuntu-vm-builder, developed by Canonical.
Ubuntu-vm-builder: the fast & powerful way to create Ubuntu JEOS VMs
Ubuntu-vm-builder is probably the best tool to use if you want to create VMs running Ubuntu JEOS 8.04, as the install is entirely scripted (very fast). This tool is packaged, and in universe:
sudo apt-get install ubuntu-vm-builder
Basic use
Here is a very basic example of how to use it:
sudo ubuntu-vm-builder kvm hardy
This will create an Ubuntu Hardy, with all options set to default.
More complex example
Now here is a somewhat more complex example:
ubuntu-vm-builder kvm hardy \ --domain newvm \ --dest newvm \ --arch i386 \ --hostname hostnameformyvm \ --mem 256 \ --user john \ --pass doe \ --ip 192.168.0.12 \ --mask 255.255.255.0 \ --net 192.168.0.0 \ --bcast 192.168.0.255 \ --gw 192.168.0.1 \ --dns 192.168.0.1 \ --mirror http://archive.localubuntumirror.net/ubuntu \ --components main,universe \ --addpkg vim \ --libvirt qemu:///system ;
This will create a new Ubuntu Hardy VM called "newvm", the hostname will be set to "hostnameformyvm", the network will be configured with a static IP address and a gateway at address 192.168.0.1. The --mirror will tell the script to download the packages from a local Ubuntu mirror instead of the default server (this may speed up by a lot the time necessary to create the VM). The components argument will enable main and universe by default on the VM, --addpkg vim will install vim, and finally the last argument will automatically add the newly created VM to KVM. Note: The manual isn't specific about the --exec option, used to execute a script file during the vm build process. If you specify the --exec option then you must provide the full path to the script you are executing. Not doing so will cause the installer to tell you that it can't find the script file.
Install on a raw block device
Ubuntu-vm-builder doesn't allow you to create the VM on a raw block device yet (like a standalone partition, or a iSCSI share). You can use ubuntu-vm-builder to create the qcow2 image and then move the VM to the block device with qemu-img though; if /dev/sdb is the disk device on which you want to move the virtual machine:
sudo qemu-img convert root.qcow2 -O raw /dev/sdb
Edit the XML definition file for the VM in /etc/libvirt/qemu/, and set the source file to be:
<source file='/dev/sdb'/>
Redefine the VM and start it; it is now running from /dev/sdb. Ubuntu-vm-builder is a very powerful tool - to get a more detailed list of its capabilities, use ubuntu-vm-builder --help.
Create VMs running other operating systems: virt-install
Virt-install is radically different in the way it works. Instead of creating automagically a new VM, it will allow you to boot on an iso, and therefore to install almost any operating system. For a list of supported operating system, consult kvm's official webpage. Copy the ISO of the system you want to install to your working directory:
yhamon@paris:~$ ls *.iso ubuntu-8.04-server-i386.iso windowsxpsp2.iso
Then, run virt-install:
sudo virt-install -n xpsp2 -r 512 -f devserver.img -s 5 -c windowsxpsp2.iso --accelerate --vnc --noautoconsole
This will boot a new VM from the ISO. Connect to the new VM using virt-viewer:
virt-viewer -c qemu+ssh://10.10.10.10/system xpsp2
You should now have a graphical interface to install your VM!
Manage your virtual machines
From the shell
You can manage your VMs from the shell using virsh. You can get a list of the available commands if you type "help". Type "help command" to get additional infos for a particular command.
List your VMs
Virsh allows you to list the virtual machines available on the current host:
yhamon@paris:/etc/libvirt/qemu$ sudo virsh Connecting to uri: qemu:///system Welcome to virsh, the virtualization interactive terminal. Type: 'help' for help with commands 'quit' to quit virsh # help list NAME list - list domains SYNOPSIS list [--inactive | --all] DESCRIPTION Returns list of domains. OPTIONS --inactive list inactive domains --all list inactive & active domains virsh # list Id Name State ---------------------------------- 15 mirror running 16 vm2 running virsh # list --all Id Name State ---------------------------------- 15 mirror running 16 vm2 running - test5 shut off
Define, undefine, start, shutdown, destroy VMs
The VMs you see with list --all are VMs that have been "defined" from an XML file. Every VM is configured via a XML file in /etc/libvirt/qemu. If you want to remove a VM from the list of VMs, you need to undefine it:
virsh # undefine test5 # WARNING: undefine will delete your XML file! Domain test5 has been undefined virsh # list --all Id Name State ---------------------------------- 15 mirror running 16 vm2 running
To be able to undefine a virtual machine, it needs to be shutdown first:
virsh # shutdown mirror Domain mirror is being shutdown
This command asks for a nice shutdown (like running shutdown in command line) - but you can also use "destroy", the more brutal way of shutting down a VM, equivalent of taking the power cable off:
virsh # destroy mirror Domain mirror destroyed
If you have made a change to the XML configuration file, you need to tell KVM to reload it before restarting the VM:
virsh # define /etc/libvirt/qemu/mirror.xml Domain mirror defined from /etc/libvirt/qemu/mirror.xml
Then, to restart the VM:
virsh # start mirror Domain mirror started
Suspend and resume a Virtual Machine
Virsh allows you to easily suspend and resume a virtual machine.
virsh # suspend mirror Domain mirror suspended virsh # resume mirror Domain mirror resumed
Using a graphical interface
There is also an easier way to manage your virtual machines. The tool virt-manager allows you to use a graphical interface to interact with KVM. Install virt-manager on your desktop:
sudo apt-get install virt-manager virt-viewer
And use it to connect to your server:
$ virt-manager -c qemu+ssh://10.10.10.10/system
10.10.10.10 being the IP address of your host running KVM.
How-to edit the attributes of a Virtual Machine (add CPUs, RAM)
KVM allows you to create SMP guests: If you have several processors/cores on the KVM host, each VM can use one or more than one of these. To add CPUs to one VM, you need to edit the '/etc/libvirt/qemu/yourvm.xml' file:
<domain type='kvm'> <name>mirror</name> <uuid>ec13fb81-7960-ec5a-fa99-d8928f75d3ea</uuid> <memory>524288</memory> <currentMemory>524288</currentMemory> <vcpu>1</vcpu> <os> <type>hvm</type> <boot dev='hd'/> </os> <clock offset='utc'/> <on_poweroff>destroy</on_poweroff> <on_reboot>restart</on_reboot> <on_crash>destroy</on_crash> <devices> <emulator>/usr/bin/kvm</emulator> <disk type='file' device='disk'> <source file='/home/yhamon/mirror.img'/> <target dev='hda' bus='ide'/> </disk> <interface type='bridge'> <mac address='00:16:3e:4d:94:c0'/> <source bridge='br0'/> </interface> <input type='mouse' bus='ps2'/> <graphics type='vnc' port='-1' listen='127.0.0.1'/> </devices> </domain>
This file is the equivalent of *.vmx files in vmware, and is pretty easy to understand. To assign 2 CPUs to your VM, just change '<vcpu>1</vcpu>' by '<vcpu>2</vcpu>'. You will need to shutdown your vm, redefine it, and restart it, to have the changes active (see previous chapter for how to do this).
Troubleshooting/FAQ
How to boot Dapper, Edgy, Feisty or Gutsy ISO
- Q: I'm on Intel hardware, and I'm trying to boot Dapper, Edgy, Feisty, or Gutsy, but kvm fails immediately.
- A: Yes, this is rather unfortunate. The issue is a limitation in Intel's virtualisation extensions that don't interact very well with gfxboot. The evil, hacky workaround is to modify the ISO to disable gfxboot. The following has worked for me, but it might kill your cat or make your coffee go cold or make other unpleasantries happen to you. You've been warned!
$ sed -e 's/GFXBOOT bootlogo/#FXBOOT bootlogo/g' < ubuntu-7.10-server-amd64.iso > ubuntu-7.10-server-amd64-nogfxboot.iso
/!\ Don't change the above command! The length of the string mustn't change or you will have knackered the filesystem on the CD. A slightly safer way is to download gfxboot-disable from [1] and then run:
$ gfxboot-disable ubuntu-7.10-server-amd64.iso
How to convert VMware machines to virt-manager
kvm has the ability to use VMware's vmdk disk files directly, as long as the disk is wholly contained in the vmdk (ie VMware allows splitting a disk into smaller, usually 2GB, vmdk files. kvm can't use these). Point kvm at the vmdk with the appropriate options (see man kvm-qemu
), and it should work.
To use the VMware machine from within virt-manager, the .vmx file must be converted to libvirt's .xml. vmware2libvirt was created to help with this, and it can be used like so:
$ vmware2libvirt -f ./file.vmx > file.xml $ virsh -c qemu:///system define file.xml
The first command converts the VMware 'file.vmx' file to the libvirt compatible 'file.xml'. See man vmware2libvirt
for details. Note: until vmware2libvirt is shipped with the libvirt packages, you can download it from [2]. The second command imports file.xml into libvirt. The imported .xml files are stored in /etc/libvirt/qemu.
IMPORTANT: keep in mind that while the .vmx file is converted to .xml, the disks are used as is. Please make backups, especially if you want to use the virtual machine in VMware later.
Caveats
While vmware2libvirt works well on simple virtual machines, there are limitations because .vmx files don't always contain enough information, and also because vmware2libvirt tries not to make too many assumptions about what it finds. A couple of things to look out for:
- While vmware2libvirt attempts to detect a 64-bit guest, be sure that your 64-bit guest has in its .xml file:
<os> <type arch='x86_64' machine='pc'>hvm</type> ... </os>
- vmware2libvirt only detects and uses the first ethernet interface found. Additional interfaces can be added from within virt-manager.
- Currently the first scsi disk is used if found, otherwise the first ide disk. Additional disks can be added from within virt-manager.
- The converted virtual machine is hard-coded to use 1 cpu. This can be changed with:
<vcpu>2</vcpu>
- vmware2libvirt does not (and cannot) convert anything that was VMware-specific within the guest. See 'Guest Notes' below for more details.
Guest notes
- Be sure to remove vmware-tools if you have it installed (otherwise it will overwrite xorg.conf on reboot)
- Guests should not use ntp to synchronize the clock, so be sure to remove/disable ntpd
- Linux guests with Xorg should be using the 'cirrus' video driver. To use, adjust /etc/X11/xorg.conf to have:
Section "Device" Identifier "Configured Video Device" Driver "cirrus" EndSection
then be sure that your Screen section uses 'Configured Video Device' for its Device. - Linux guests with Xorg should be using the 'vmmouse' driver (not available on Ubuntu Dapper). To use, perform within the guest:
aptitude install xserver-xorg-input-vmmouse
then adjust /etc/X11/xorg.conf to have (the Identifier line should not change, and you should have only an Identifier line and Driver line for the mouse):Section "InputDevice"
Identifier "Configured Mouse" Driver "vmmouse"
EndSection
- Linux guests with Xorg need to adjust the resolution for Xorg in /etc/X11/xorg.conf. Look for the Screen section, and make sure each of the 'Modes' lines has a reasonable resolution for your system (due to bug #193456 the resolution in the guest's resolution needs to be smaller than the host). Eg:
Section "Screen" ... SubSection "Display" Depth 16 Modes "800x600" "640x480" EndSubSection SubSection "Display" Depth 24 Modes "800x600" "640x480" EndSubSection EndSection
- Windows (other than Vista) virtual machines should substitute in the .xml file:
<features> <acpi/> </features>
with:<features/>
- Windows Vista virtual machines should add these to the /etc/libvirt/qemu/my-vista.xml file:
<domain type='kvm'> ... <features> <acpi/> </features> </domain>
- Debian Sarge (oldstable) may write /boot/grub/menu.lst incorrectly, resulting in the following on boot:
pivot_root: no such file or directory /sbin/init: 432: cannot open dev/console: no such file Kernel panic: Attempted to kill init!
The fix is at the grub menu, press 'e' and adjustroot=/dev/hdb1
to beroot=/dev/hda1
. After a successful boot, you will need to update /boot/grub/menu.lst to have:
and run:- kopt=root=/dev/hda1 ro
- update-grub