背景信息


本文档是自己在工作中对kvm使用上的一些记录,基于ubuntu 12.04 desktop, 在我的工作笔记本电脑实现,机器带一块以太网卡和一块无线网卡,无线网卡连互联网。

文档目的


介绍kvm,包括配置,不使用libvirt层实现的命令行模式虚拟机操作,一些主要参数介绍, 以及kvm虚拟机优化等。在文档中,我会利用kvm命令行方式,实现一个nat模式的虚拟化网 络,虚拟机通过nat访问外网,外网无法访问虚拟机。

KVM安装


在ubuntu下需要安装的kvm包:
sudo apt-get install kvm uml-utilities bridge-utils 加载kvm模块:
modprobe kvm-intel 可以先确认是否加载,没有的话可以自己加载(我用的是intel cpu,如果是amd可以通过 kvm-amd加载),修改/etc/modules,在里面添加如下行,使其自动加载:
kvm_intel 如果需要kvm nest功能,上面行需要修改为:
kvm_intel nested=1 同时guest启动命令需要带上如下参数:
-cpu host 或者 -cpu qemu64,+vmx

NAT模式虚拟网络


在这里没有使用libvirt,其实用libvirt操作kvm非常方便,这里没用主要是自己希望了解 一下kvm的一些细节,包括虚拟网络创建、参数使用和优化参数等等。

虚拟网络创建通过bridge实现,相比xen的虚拟网络实现,kvm要简单的多,基本就是创建一 个bridge,但是不用绑定到物理网卡上,配置nat策略,同时启用dnsmasq负责guest dhcp即 可,实现方式可以直接修改/etc/qemu-ifup脚本内容如下:

#!/bin/sh
#
# Copyright IBM, Corp. 2010
#
# Authors:
#  Anthony Liguori <aliguori@us.ibm.com>
#
# This work is licensed under the terms of the GNU GPL, version 2.  See
# the COPYING file in the top-level directory.

# Set to the name of your bridge
BRIDGE=virbr0

# Network information
NETWORK=192.168.122.0
NETMASK=255.255.255.0
GATEWAY=192.168.122.1
DHCPRANGE=192.168.122.2,192.168.122.254

# Optionally parameters to enable PXE support
TFTPROOT=
BOOTP=

do_brctl() {
    brctl "$@"
}

do_ifconfig() {
    ifconfig "$@"
}

do_dd() {
    dd "$@"
}

do_iptables_restore() {
    iptables-restore "$@"
}

do_dnsmasq() {
    dnsmasq "$@"
}

check_bridge() {
    if do_brctl show | grep "^$1" > /dev/null 2> /dev/null; then
        return 1
    else
        return 0
    fi
}

create_bridge() {
    do_brctl addbr "$1"
    do_brctl stp "$1" off
    do_brctl setfd "$1" 0
    do_ifconfig "$1" "$GATEWAY" netmask "$NETMASK" up
}

enable_ip_forward() {
    echo 1 | do_dd of=/proc/sys/net/ipv4/ip_forward > /dev/null
}

add_filter_rules() {
do_iptables_restore <<EOF
# Generated by iptables-save v1.3.6 on Fri Aug 24 15:20:25 2007
*nat
:PREROUTING ACCEPT [61:9671]
:POSTROUTING ACCEPT [121:7499]
:OUTPUT ACCEPT [132:8691]
-A POSTROUTING -s $NETWORK/$NETMASK -j MASQUERADE
COMMIT
# Completed on Fri Aug 24 15:20:25 2007
# Generated by iptables-save v1.3.6 on Fri Aug 24 15:20:25 2007
*filter
:INPUT ACCEPT [1453:976046]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [1605:194911]
-A INPUT -i $BRIDGE -p tcp -m tcp --dport 67 -j ACCEPT
-A INPUT -i $BRIDGE -p udp -m udp --dport 67 -j ACCEPT
-A INPUT -i $BRIDGE -p tcp -m tcp --dport 53 -j ACCEPT
-A INPUT -i $BRIDGE -p udp -m udp --dport 53 -j ACCEPT
-A FORWARD -i $1 -o $1 -j ACCEPT
-A FORWARD -s $NETWORK/$NETMASK -i $BRIDGE -j ACCEPT
-A FORWARD -d $NETWORK/$NETMASK -o $BRIDGE -m state --state RELATED,ESTABLISHED
   -j ACCEPT
-A FORWARD -o $BRIDGE -j REJECT --reject-with icmp-port-unreachable
-A FORWARD -i $BRIDGE -j REJECT --reject-with icmp-port-unreachable
COMMIT
# Completed on Fri Aug 24 15:20:25 2007
EOF
}

start_dnsmasq() {
    do_dnsmasq \
	--strict-order \
	--except-interface=lo \
	--interface=$BRIDGE \
	--listen-address=$GATEWAY \
	--bind-interfaces \
	--dhcp-range=$DHCPRANGE \
	--conf-file="" \
	--pid-file=/var/run/qemu-dnsmasq-$BRIDGE.pid \
	--dhcp-leasefile=/var/run/qemu-dnsmasq-$BRIDGE.leases \
	--dhcp-no-override \
	${TFTPROOT:+"--enable-tftp"} \
	${TFTPROOT:+"--tftp-root=$TFTPROOT"} \
	${BOOTP:+"--dhcp-boot=$BOOTP"}
}

setup_bridge_nat() {
    if check_bridge "$1" ; then
	create_bridge "$1"
	enable_ip_forward
	add_filter_rules "$1"
	start_dnsmasq "$1"
    fi
}

setup_bridge_vlan() {
    if check_bridge "$1" ; then
	create_bridge "$1"
	start_dnsmasq "$1"
    fi
}

setup_bridge_nat "$BRIDGE"

if test "$1" ; then
    do_ifconfig "$1" 0.0.0.0 up
    do_brctl addif "$BRIDGE" "$1"
fi
cmdcmd

这样当你在启动一个kvm guest的时候,就会自动创建一个nat模式的网络,bridge名字是 virbr0,guest通过dhcp获得一个192.168.122.0/24网段的ip地址,可以联通互联网。

创建虚拟机


创建镜像

以创建centos虚拟机为例,你首先需要创建一个磁盘镜像文件,也可以是一个块设备:
$kvm-img create -f raw centos.img 10G

这里我们创建了一个raw格式的磁盘镜像文件,大小为10g,注意文件实际并不占用10g空 间,而是按需分配[fn:1]。关于文件格式的区别简单描述如下:

  • raw格式在文件镜像中性能最优,但是功能支持也少,比如不支持快照,精简分配需要文 件系统支持holes。
  • qcow2是功能丰富,精简配置无须文件系统支持holes,支持压缩和加密,支持快照和 backing_file功能。
  • vdi/vmdk/vpc,分别对应virtualbox/vmware/ms virtualpc

当然你也可以通过lvm来分配一个lv给虚拟机用,块设备性能最佳,当然也有很多问题,可 维护性一般,而且一般也不支持精简配置,其他的分布式块系统比如sheepdog这里就不多说 了。最终目的只有一个,给虚拟机提供磁盘块安装操作系统。

配置启动参数

有了磁盘镜像文件之后,你就可以启动虚拟机了,由于我们这里直接通过KVM命令行启动虚 拟机,不需要创建额外的xml配置文件。启动虚拟机涉及到组成计算机的几个核心组件: cpu/ram/storage/network/cdrom/soundcard/display,我们一一描述:

  • cpu

可以通过下面命令查看kvm支持的cpu类型: : kvm -cpu ?

主要涉及到一些指令集多少问题,qemu32/qemu64兼容性最好,如果你需要支持特定的指 令集,添加即可,比如你需要添加vt指令集,直接”qemu64,+vmx”即可[fn:2]

如果你的所有主机CPU一样,可以直接用“-cpu host”,这样虚拟机的cpu和宿主机一致, 性能最佳。通过-smp参数设置多cpu支持,通过“-numa”参数模拟多节点numa。

  • storage

通过下面参数设置:

: -drive file=centos.img if=virtio,cache=none,aio=native

这里涉及到两个参数if和cache: 1. if用来指定驱动类型,这里我们用的是virtio, virtio绕开qemu模拟层,是优化io的 重要部分,当然前提是你的guest os需要支持virtio,安装对应的驱动。

  1. cache指定缓存模式

    | Mode | host page cache | guest disk write cache | | none | off | on | | writethough | on | off | | writeback | on | on | | unsafe | on | ignored |

    cache设置涉及到两个层面的影响,一个是宿主机的缓存,一个是guest的缓存:[fn:3]

    host page cache打开意味着数据copy到宿主机缓存即完成写操作,通过fsync刷新缓 存,能够从缓存完成读,但是问题在于guest也会缓存同样的数据,也就意味着同样的 数据在内存中保留两份,一般建议如果是本地设备(包括文件和块设备),建议关闭 宿主机缓存。

    guest disk write cache打开意味着写操作进入缓存即完成,可能存在数据丢失风险 ,能提高写性能。

    一般情况下本地设备建议选择none,性能最佳,如果是远程设备,建议选择writeback 或者writethrough。unsafe一般很少使用,在安装系统的时候使用能加快安装速度, 但是如果进入正式环境使用,需要切换到对应模式。

    另外对于磁盘镜像文件模式,还需要考虑块对齐问题,一般保持和宿主机同样的块大 小,分区块对齐,否则可能引发跨块的io操作,影响io性能。

  2. aio指定io的模式,支持thread和native,native性能更佳。

  • network

通过下面参数设置: #+begin_example -net nic,vlan=0,model=virtio,macaddr=DE:AD:BE:EF:FC:70
-net tap,vlan=0,vhost=on
#+end_example

缺省qemu使用user mode网络,完全和宿主机隔离,性能差,通常都需要使用tap模式,同 时打开vhost-net特性,vhost-net完全bypass qemu,并且运行在kernel层,能大大降低 cs的开销,性能接近宿主机网络。

同时采用virtio半虚拟化驱动,相比模拟驱动性能提升明显,前提同样是guest os需要支 持virtio驱动。同时打开两者获取最好的网络性能。另外注意vhost需要加载vhost_net模块: : modprobe vhost_net

确保使用了vhost_net特性,你只需在启动guest的时候,查看是否有vhost线程存在: #+begin_example ps -ef | grep vhost- | grep -v grep root 1563 2 0 Feb18 ? 00:00:00 [vhost-1561] #+end_example

  • qemu monitor

qemu和guest交互的一个控制台,支持多种模式交互,比如unix socket,tcp socket等, 通过下面参数设置: : -monitor unix:/home/tacy/vm/monitor/centos.monitor,server,nowait

上面是unix socket模式, 这样你可以直接发送system_powerdown指令关机了,相当于按 power键;system_reset相当于按reset键,这个要小心: : socat - UNIX-CONNECT:/home/tacy/vm/monitor/centos.monitor

直接关闭虚拟机可以通过下面指令: : echo system_reset|socat - UNIX-CONNECT:/home/tacy/vm/monitor/centos.monitor

  • other

时间同步可以采用ntp或者”-rtc base=localtime,clock=vm”, vnc鼠标同步用 “-usbdevice tablet”, pass-through usb口用”-usbdevice host:19d2:0117”, 关闭 console用”-nographic”.

启动虚拟机

下面是我的启动命令:

sudo kvm -m 2048 -smp 2 -cpu host -enable-kvm -boot c \
    -drive file=/home/tacy/software/CentOS-6.3-x86_64.iso,media=cdrom -boot d \
    -drive file=centos.img,if=virtio,cache=none,aio=native \
    -net nic,vlan=0,model=virtio,macaddr=DE:AD:BE:EF:FC:70 \
    -net tap,vlan=0,vhost=on \
    -soundhw es1370 \
    -rtc base=localtime,clock=vm \
    -usbdevice host:19d2:0117 -usbdevice tablet \
    -monitor unix:/home/tacy/vm/monitor/centos.monitor,server,nowait \
    -vga std -nographic -vnc :0 \
    >/dev/null 2>&1 &

上面我指定了光驱,和从光驱启动,这样你通过vnc就可以连接上虚拟机,进行系统安装了。

虚拟机串口


如果你设置了nographic启动参数,你就看不到虚拟机的console了,有时候你希望能看看 console上的一些异常,比如导致启动失败的异常,这时候,你就可以利用虚拟机串口重定 向功能来解决,简单来说,就是让虚拟机把console重定向到串口输出,然后再通过qemu设 置虚拟机串口输出到host设备上,可以是tcp/udp/unix socket/file/pipe,然后在host上 查看虚拟机console信息。

首先需要完成虚拟机重定向console设置,简单修改grub.conf,添加参数:
console=/dev/tty0 console=/dev/ttyS0,115200
设置qemu启动参数,添加如下启动项:
-serial telnet::4446,server,nowait

重启虚拟机,然后你就可以通过telnet连接到虚拟机console上了。这里只是以telnet为例 子,其他的你可以参考qemu man实现,比如你可以直接设置虚拟机串口输出到host当前终端 的stdio,试试就知道了,非常方便。

Windows7 guest


virtio

如果把系统安装在virtio磁盘上,安装的时候必须指定驱动,否则找不到磁盘,驱动下载地 址可以参考[[http://www.linux-kvm.org/page/WindowsGuestDrivers][Windows guest drivers]],另外注意,在安装的时候加载virtio驱动,需要把驱 动光盘防止在第一个光盘驱动器,否则会无法启动,例如:

sudo kvm -m 2048 -smp 2 -cpu host -enable-kvm -boot d \
    -drive file=/home/tacy/vm/software/virtio-win-0.1-30.iso,media=cdrom \
    -drive file=/home/tacy/vm/software/win7/win7_ultimate_sp1.iso,media=cdrom \
    -drive file=win7.template.img,if=virtio,cache=none,aio=native \

采用virtio磁盘安装,我测试了一下,在我机器上不超过15分钟就完成了。

audio

直接用ac97,不过你需要自己去下载驱动,注意下载win7版本的就行

usb

式加载usb:
-usb -usbdevice host:0951:1624
恭喜你,是有八九你能碰到和我同样的问题,在windows上能发现设备,但是在设备管理器 里面有警告:
usb mass storage usb cannot start code 10
里面有警告:
usb mass storage usb cannot start code 10
告:
usb mass storage usb cannot start code 10

就为这问题,害我重复编译了好几遍qemu,最后看到这两个帖子太恍然大悟[fn:4][fn:5], 查了一下我机器上的usb口:

tacy@tacy:~$ lspci|grep USB
00:1a.0 USB controller: Intel Corporation 6 Series/C200 Series Chipset Family USB Enhanced Host Controller #2 (rev 05)
00:1d.0 USB controller: Intel Corporation 6 Series/C200 Series Chipset Family USB Enhanced Host Controller #1 (rev 05)

没错,我的是ehci,不是uhci,而qemu用-usb方式模拟出来的是uhci,搞半天,在uhci上接 了2.0的设备,不能正常驱动,知道原因,解决起来就简单了:

-device usb-ehci,id=ehci \
-drive if=none,id=usbstick,file=/dev/sdX \
-device usb-storage,bus=ehci.0,drive=usbstick \

其中的sdX是你的usb驱动名,这样你就可以正常在windows上看到usb驱动器了,后面两行可 以通过monitor动态添加,但是第一行必须带上:

drive_add 0 id=usbdrive,if=none,file=/dev/sdX
device_add usb-storage,id=usbdrive,bus=ehci.0,drive=usbdrive

shutdown(about winxp and win2003)

gpedit.msc (允许无用户登入关机)

Computer Configuration\Windows Settings\Security Settings\Local Policies\
Security Options\Shutdown: Allow system to be shut down without having to log on
regedit (有用户登入时,提示超时关机)
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows] “ShutdownWarningDialogTimeout”=dword:00000001

Spice


很不幸,在ubuntu12.04上要用spice缺省是不行的,首先,缺省的kvm包不带spice功能,需 要另外安装qemu-kvm-spice,但是这个版本有bug[fn:6],用这个包启动黑屏并且CPU 100% ,没法启动虚拟机。查了一圈,有人说是seabios问题,也有人说改改配置就可以,我试了 试都不好使。bug里面说ubuntu 12.10里面的版本已经解决了这个问题,但咱这是工作电脑 ,不能随便升级,所以只能自己动手编译。

更悲剧的事情是,spice由于是redhat开发的,对ubuntu极不友好,依赖的一些包在fedora 上是标准包但在ubuntu上都没有,必须自己去编译,我这里主要参考了两个文档[fn:7][fn:8]

准备软件包

下载相关依赖包和代码[fn:9]

sudo apt-get install libtool libnss3-dev libxrandr-dev libxfixes-dev
  libaio-dev libsasl2-dev libjpeg8-dev libpixman-1-dev libcap-dev
  libattr1-dev libusb-1.0.0-dev texinfo
wget http://downloads.us.xiph.org/releases/celt/celt-0.5.1.3.tar.gz
wget http://spice-space.org/download/releases/spice-protocol-0.12.4.tar.bz2
wget http://spice-space.org/download/releases/spice-0.12.2.tar.bz2
wget http://spice-space.org/download/libcacard/libcacard-0.1.2.tar.bz2
wget http://spice-space.org/download/usbredir/usbredir-0.6.tar.bz2
wget http://wiki.qemu-project.org/download/qemu-1.3.1.tar.bz2

这里的celt版本是指定版本,缺省ubuntu 12.04上的版本不行,必须安装这个版本,注意, 我这里由于没有使用virt-manager,使用系统里面相关的spice包都被我删除了,一般你的情 况不一样,应该不用从头编译[fn:10],另外这里没用spice代码库里的qemu,而是直接用的 qemu代码库里的代码,我试了试没问题,应该是合并了。

编译软件包

  1. celt,注意我们这里缺省都安装在/usr/local下,以免出现覆盖系统包的情况 #+begin_example tar zxvf celt-0.5.1.3.tar.gz cd celt-0.5.1.3 ./configure –prefix=/usr/local make -j5 sudo make install #+end_example

  2. libcacard #+begin_example cd libcacard ./configure –prefix=/usr/local make -j5 sudo make install #+end_example

  3. usbredir #+begin_example cd usbredir ./configure –prefix=/usr/local make -j5 sudo make install #+end_example

  4. spice-protocol #+begin_example cd spice-protocol #./configure –prefix=/usr/local make -j5 sudo make install #+end_example

  5. spice #+begin_example cd spice ./configure –prefix=/usr/local –enable-client –enable-smartcard make j5 sudo make install #+end_example

  6. qemu,这里编译没有带sdl,这样qemu启动不会弹出窗口,如果你需要,添加相关编译参数即可 #+begin_example cd qemu ./configure –prefix=/usr/local
    –target-list=x86_64-softmmu
    –extra-cflags=“-march=native -O2 -no-omit-framepoint -pipe”
    –extra-ldflags=“-Wl,-Bsymbolic-functions -Wl,-z,relro”
    –audio-drv-list=“pa,alsa,oss”
    –enable-kvm –enable-linux-aio –enable-spice
    –enable-vhost-net –enable-vnc –enable-virtfs
    –enable-system –enable-usb-redir –enable-docs make j5 sudo make install #+end_example 参考了ubuntu qemu-kvm包编译[fn:11]和gentoo编译优化[fn:12]

编译过程中,可能会出现动态库找不到的情况,确保LD_LIBRARY_PATH包括/usr/local/lib 目录,这样你就可以用spice了。[fn:13]

启动虚拟机

启动windows虚拟机

sudo LD_LIBRARY_PATH=/usr/local/lib:${LD_LIBRARY_PATH} qemu-system-x86_64 \
    -m 2048 -smp 2 -cpu host -enable-kvm -boot d \
    -drive file=win7.template.img,if=virtio,cache=none,aio=native \
    -net nic,vlan=0,model=virtio,macaddr=DE:AD:BE:EF:FC:74 \
    -net tap,vlan=0,vhost=on \
    -soundhw ac97 \
    -rtc base=localtime,clock=vm \
    -device virtio-serial-pci \
    -device usb-ehci,id=ehci \
    -drive if=none,id=usbstick,file=/dev/sdc \
    -device usb-storage,bus=ehci.0,drive=usbstick \
    -device virtserialport,chardev=spicechannel0,name=com.redhat.spice.0 \
    -chardev spicevmc,id=spicechannel0,name=vdagent \
    -monitor unix:/home/tacy/vm/monitor/win7.monitor,server,nowait \
    -vga qxl -spice port=5900,addr=127.0.0.1,disable-ticketing \
    >/dev/null 2>&1 &

客户端连接

启动spice客户端spicec
/usr/local/bin/spicec -h localhost -p 5900 -f

为了获得更好的性能,需要在虚拟机上安装spice guest tools,直接去spice网站下载 spice-guest-tools即可:http://www.spice-space.org/download.html, 里面已经包括 了qxl驱动和guest agent。

usbredir[fn:14]

简单来说,就是客户端机器上插入的usb存储设备能够在vm上发现并使用,举例来说,你用 你的笔记本电脑通过网络访问远程虚拟机,那么插入你笔记本电脑上的usb存储设备能在虚 拟机上使用。目前支持usbredir的spice客户端只有spice-gtk,我们下面来编译spice-gtk ,使他具有usbredir功能:

  1. 下载spice-gtk代码:

    wget http://spice-space.org/download/gtk/spice-gtk-0.18.tar.bz2
  2. 编译包: #+begin_example cd spice-gtk ./configure –prefix=/usr/local –with-gtk=2.0 –enable-usbredir=yes
    –enable-smartcard=yes –with-python=yes make sudo make install #+end_example

  3. 运行虚拟机命令增加usbredir设置: 首先需要一个ich9-ehci-uhci.cfg文件,你可以从qemu代码里面找,在 src/qemu1.3.1/docs目录下,拷贝到/usr/local/etc/qemu/目录下

    cp qemu1.3.1/docs/ich9-ehci-uhci.cfg /usr/local/etc/qemu/

然后需要修改虚拟机启动脚本,添加如下三行 #+begin_example -readconfig /usr/local/etc/qemu/ich9-ehci-uhci.cfg
-chardev spicevmc,name=usbredir,id=usbredirchardev1
-device usb-redir,chardev=usbredirchardev1,id=usbredirdev1,debug=3
#+end_example

然后启动虚拟机,并用spicy连接 : sudo spicy -h localhost -p 5900

选中spicy option菜单中的auto connection选项,在客户端中插入usb设备,不出意外 的话,你就能在虚拟机上看到插入的usb设备了。

Base image & Snapshot


base image[fn:15]

base image简单可以理解为模板,举个例子,你在部署公司的虚拟化环境,公司的所有的系 统都跑在centos上,只是上面配置的应用各有不同,有c开发的,有java开发的等等,简单 来说,你会先安装一个base image

$kvm-img create -f qcow2 centos.qcow2 10g
$kvm -drive file=centos.qcow2 -m 1024 -boot d -drive file=centos.iso,media=cdrom
安装完操作系统和相应补丁之后,你可以从你的base image创建一个新的image:
$kvm-img create -b centos.qcow2 -f qcow2 centos-clone.qcow2

新的image文件并不会实际占用空间,他链接在base image上,只有修改之后,才会通过 copy on write方式保存修改内容到新的image文件: #+begin_example $kvm-img info centos-clone.qcow2 image: centos-clone.qcow2 file format: qcow2 virtual size: 10G (10737418240 bytes) disk size: 136K cluster_size: 65536 backing file: centos.qcow2 (actual path: centos.qcow2) #+end_example

新的base image:
kvm-img convert centos-clone.qcow2 -O qcow2 centos-base-java.qcow2
新的base image:
kvm-img convert centos-clone.qcow2 -O qcow2 centos-base-java.qcow2

base-java.qcow2

移动base image

关的clone,否则clone就会出错:
kvm-img rebase -f qcow2 -u -b centos54.img -F raw centos-clone.qcow2
的clone,否则clone就会出错:
kvm-img rebase -f qcow2 -u -b centos54.img -F raw centos-clone.qcow2

snapshot[fn:16]

快照是虚拟机一个常用的功能,你可以利用快照功能来保留某个时间点的虚拟机状态,方便 虚拟机回滚。离线快照参考man手册即可。在线快照通过monitor或者QMP实现。

qemu概念

arm-softmmu和arm-linux-user区别

前者是指模拟的硬件平台;后者是直接在宿主平台运行arm程序,无须安装android系统即 可运行。

其他相关


查看虚拟机ip地址

如果虚拟机很少,简单通过“arp -an”查看即可,如果虚拟机很多,你不容易找到ip和mac的 对应关系,需要自己写脚本去实现了[fn:17].

查看设备信息

进入monitor, 然后用info qtree命令查看设备信息.

Footnotes


[fn:1] [[http://en.wikipedia.org/wiki/Sparse_file][sparse file]]

[fn:2] [[http://www.linux-kvm.org/page/Tuning_KVM][tuning kvm]]

[fn:3] Optimizing the QEMU Storage Stack by Stefan Hajnoczi

[fn:4] [[http://www.spinics.net/lists/kvm/msg56923.html][The usb mass storage driver can’t be installed successfully]]

[fn:5] [[http://en.wikipedia.org/wiki/Host_controller_interface_(USB,_Firewire)][Host controller interface]]

[fn:6] [[https://bugs.launchpad.net/ubuntu/%2Bsource/qemu-kvm-spice/%2Bbug/970234][Selecting spice and qxl mode results in blank screen]]

[fn:7] [[http://docs.cslabs.clarkson.edu/wiki/SPICE][Spice on ubuntu]]

[fn:8] [[http://www.spice-space.org/page/Building_Instructions][Spice build instructions]]

[fn:9] [[http://spice-space.org/download.html][Spice download]]

[fn:10] [[http://huang.yunsong.net/2012/spice-gtk-ubuntu.html][Build and Install SPICE-GTK on UBUNTU]]

[fn:11] [[https://launchpad.net/ubuntu/%2Bsource/qemu-kvm/1.2.0%2Bnoroms-0ubuntu2.12.10.3][Ubuntu qemu-kvm build log]]

[fn:12] [[http://wiki.gentoo.org/wiki/Dell_XPS_15z][Gentoo build on dell xps 15z]]

[fn:13] [[http://www.linux-kvm.org/page/SPICE][Spice KVM]]

[fn:14] [[http://hansdegoede.livejournal.com/11686.html][Using spice from the qemu cmdline]]

[fn:15] [[http://www.linux-kvm.com/content/how-you-can-use-qemukvm-base-images-be-more-productive-part-1][how to use base image]]

[fn:16] [[http://wiki.qemu.org/Features/Snapshots][kvm snapshot]]

[fn:17] [[http://rwmj.wordpress.com/2010/10/26/tip-find-the-ip-address-of-a-virtual-machine/][find the ip address of a vm]]