完整的xml文件
<domain type='kvm'>
<name>centoskvm3</name>
<uuid>bdbb89fb-57d1-4d01-b3b7-ff33a9346ae6</uuid>
<memory>2048000</memory>
<currentMemory>1024000</currentMemory>
<vcpu>2</vcpu>
<os>
<type arch='x86_64' machine='pc'>hvm</type>
<boot dev='hd'/>
</os>
<features>
<acpi/>
<apic/>
<pae/>
</features>
<clock offset='localtime'/>
<on_poweroff>destroy</on_poweroff>
<on_reboot>restart</on_reboot>
<on_crash>destroy</on_crash>
<devices>
<emulator>/usr/libexec/qemu-kvm</emulator>
<disk type='file' device='disk' cache='none'>
<source file='/usr/local/kvm/centvm3.img'/>
<target dev='vda' bus='virtio'/>
</disk>
<interface type='bridge'>
<mac address='3b:6e:01:69:3a:11'/>
<source bridge='br0'/>
      <model type='virtio'/>
</interface>
<input type='mouse' bus='ps2'/>
<graphics type='vnc' port='-1' autoport='yes' listen='221.196.131.121' keymap='en-us' passwd='123456'/>
</devices>
</domain>
1、kvm guest 定义开始
<domain type='kvm'>
2、guest的short name。由字母和数字组成,不能包含空格
<name>centosvm1</name>
3、uuid,由命令行工具 uuidgen生成。
<uuid>bdbb89fb-57d1-4d01-b3b7-ff33a9346ae6</uuid>
4、在不reboot guest的情况下,guset可以使用的最大内存,以KB为单位
<memory>2048000</memory>
5、guest启动时内存,可以通过virsh setmem来调整内存,但不能大于最大可使用内存。
<currentMemory>1024000</currentMemory>
6、分配的虚拟cpu
<vcpu>2</vcpu>
7、有关OS
x86架构:i686  
hvm:全虚拟化
kernel:指定guest使用的内核,如果使用ISO(安装时)或guset系统中(系统已经安装完成)的内核,不需要指定该项
initrd:指定guest使用的ram disk,如果使用ISO(安装时)或guest系统中(系统已经安装完成)的ram disk,不需要指定该项
注:kernel 和initrd文件位于RHEL系统光盘的images/pxeboot目录,拷贝这两个文件到本地磁盘,并指定路径。
注:这两个元素,如果是为了安装guset而指定,在安装完成以后即可以删除。
如 果host开启了SELINUX,you also need to change the type of security context for the files to virt_image_t to allow libvirtd to access them for booting: 
# chcon -t virt_image_t /tmp/vmlinuz-rhel54
 # chcon -t virt_image_t /tmp/initrd-rhel54.img
After you change the security context, verify that the correct security context is assigned to them as shown in the following example: 
# ls -Z /tmp|grep virt
 -r--r--r--  root root root:object_r:virt_image_t         initrd-rhel54.img
 -r--r--r--  root root root:object_r:virt_image_t         vmlinuz -rhel54
boot:指定启动设备,可以重复多行,指定不同的值,作为一个启动设备列表。
可以在cmdline元素中添加启动参数,例如,使用kickstart文件:
<cmdline>method=http://10.1.1.212/install/rhel5.4/x86_64 
ks=http://10.1.1.212/install/autoinst/c20m2n05v3</cmdline>
<os>
<type arch='x86_64' machine='pc'>hvm</type>
<kernel>/tmp/vmlinuz-rhel54</kernel>
<initrd>/tmp/initrd-rhel54.img</initrd>
<boot dev='hd'/>
</os>
8、处理器特性
<features>
<acpi/>
<apic/>
<pae/>
</features>
关于处理器特性,查看:
http://blog.chinaunix.net/space.php?uid=1838361&do=blog&id=1753201

9、时钟。使用本地时间:localtime
    <clock offset='utc'/>

仍然需要再计划任务中添加时间同步:
*/15 * * * * (/usr/sbin/ntpdate 210.72.145.44 > /dev/null 2>&1;/sbin/hwclock -w)
10、定义了在kvm环境中power off,reboot,或crash时的默认的动作为destroy。其他允许的动作包括:restart,preserve,rename-restart.
在 这个例子中,destory之所以也用在了on_reboot元素中,是因为一旦安装完成,期望的guest动作是stop,以便从the installed guest operating system而不是从the installation kernel or ISO编辑guest的定义。
destroy:停止该虚拟机。相当于关闭电源
    <on_poweroff>destroy</on_poweroff>
<on_reboot>destroy</on_reboot>
<on_crash>destroy</on_crash>
11、设备定义开始
<devices>
12、模拟元素,此处写法用于kvm的guest(xen怎么写?)
<emulator>/usr/libexec/qemu-kvm</emulator>
13、用于kvm存储的文件。在这个例子中,在guest中显示为IDE设备。
使用qemu-img命令创建该文件,kvm image的默认目录为:/var/lib/libvirt/images/
<disk type='file' device='disk'>
 <driver name='qemu' type='raw' cache='none'/>
<source file='/var/lib/libvirt/images/kvm3.img'/>
<target dev='hda' bus='ide'/>
</disk>
这里需要注意:使用libvirt 0.6.3写的xml,没有<driver name='qemu' type='qcow2'/>参数,当将该xml放到libvirt 0.8版本时,该参数会默认为raw,所以会造成在0.6中可以启动的guest无法启动,更改参数即可
使用virtio:
采用普通的驱动,即硬盘和网卡都采用默认配置情况下,硬盘是 ide 模式,而网卡工作在 模拟的rtl 8139 网卡下,速度为100M 全双工。采用 virtio 驱动后,网卡工作在 1000M 的模式下,硬盘工作是SCSI模式下。
<disk type='file' device='disk'>
<driver name='qemu' type='raw' cache='none'/>
<source file='/usr/local/kvm/vmsample/disk.os'/>
<target dev='vda' bus='virtio'/>
</disk>
硬盘采用 virtio 后,安装windows 系统,将不能正常的识别硬盘,解决的方法是:
从kvm 的官网下载virtio的驱动iso。
1. 先采用ide模式安装系统。
2. 安装完成后,添加一个virtio模式的硬盘。
3. 启动vm后,系统会自动搜索 SCSI的驱动,找到下载的virtio 驱动后,安装即可。
4. 修改vm 配置文件,删除掉添加的 vitro 硬盘后,修改ide硬盘为 virtio模式即可。
A Note About Virtio Drivers
Virtio is paravirtualized drivers for kvm/Linux. With this you can can run multiple virtual machines running unmodified Linux or Windows VMs. Each virtual machine has private virtualized hardware a network card, disk, graphics adapter, etc. According to Redhat:
Para-virtualized drivers enhance the performance of fully virtualized guests. With the para-virtualized drivers guest I/O latency decreases and throughput increases to near bare-metal levels. It is recommended to use the para-virtualized drivers for fully virtualized guests running I/O heavy tasks and applications. 

关于cache=none
如果不加该参数,默认cache policy为write through。
kvm官方及IBM都推荐使用raw,设置cache为none,以关闭kvm磁盘的cache策略,让数据可以直接落在实体硬盘上(实体机上其实也有磁盘cache的,并不需要kvm为cache操心)
For the best storage performance on guest operating systems that use raw disk volumes or partitions,completely avoid the page cache on the host.
下面的帖子中有一段关于cache的内容:
http://www.linuxeden.com/forum/viewthread.php?tid=205581&extra=&page=3

  
补充:可以定义多个磁盘,其他可行的磁盘定义:
Logical volume device:
<disk type='block' device='disk'>
<source 'dev=/dev/mapper/VolGroup01-LVM1'/>
<target dev='hdb'/>
</disk>
Disk partition:
<disk type='block' device='disk'>
<source dev='/dev/sda4'/>
<target dev='hdb' bus='ide'/>
</disk>
CD-ROM device:
<disk type='block' device='cdrom'>
<source 'dev=/dev/sde'>
<target dev='hdb'/>
<readonly/>
</disk>
  
x(x为0,1,2...)
<interface type='bridge'>
<source bridge='br0'/>
<mac address="3B:6E:01:69:3A:11"/>
</interface>
 补充:使用默认的虚拟网络代替网桥,即guest为NAT模式。也可以省略mac地址元素,这样将自动生成mac地址。
<interface type='network'>
<source network='default'/>
<mac address="3B:6E:01:69:3A:11"/>
</interface>
  默认分配192.168.122.x/24的地址,也可以手动指定。网关为192.168.122.1

使用virtio:
采用普通的驱动,即硬盘和网卡都采用默认配置情况下,硬盘是 ide 模式,而网卡工作在 模拟的rtl 8139 网卡下,速度为100M 全双工。采用 virtio 驱动后,网卡工作在 1000M 的模式下,硬盘工作是SCSI模式下。

rhel5.6 guest with virtio interface can not boot successfully if the system installation would use the ide interface
https://bugzilla.redhat.com/show_bug.cgi?id=647387

<interface type='bridge'>
<source bridge='br1'/>
<model type='virtio' />
</interface>
性能:通过物理机上拷贝
普通驱动:26.1M
virtio驱动:44.7M  
因为交换机为100M,无法测试从其他物理机上拷贝。

  15、输入设备
<input type='mouse' bus='ps2'/>
  
  16、定义与guset交互的图形设备。在这个例子中,使用vnc协议。listen的地址为host的地址。prot为-1,表示自动分配端口号,通过以下的命令查找端口号:
virsh vncdisplay <KVM Guest Name>    
注意:是passwd 而不是password 
VNC is configured to listen on 127.0.0.1 by default. To make it listen on all public interfaces, edit /etc/libvirt/qemu.conf
<graphics type='vnc' listen='221.191.134.123'passwd='123456' port='-1' autoport='yes' keymap='en-us'/>
  17、设备定义结束
</devices>
18、KVM定义结束
</domain>