环境:ubuntu 11.04
[TOC]
准备工作
检查CPU是否支持虚拟化
如果支持VT的话,Intel会打印出vmx,AMD会打印出svm。
$ egrep '(vmx|svm)' /proc/cpuinfo
检查内核是否编译了kvm支持
kvm支持从linux 2.6.20已被集成到内核中,成为内核的一部分。
$ lsmod |grep kvm
检查设备 /dev/kvm
的权限,如果你不想使用root权限,需要把你的用户加入kvm
用户组:
$ sudo usermod -aG kvm jqian
安装kvm管理组件
$ sudo apt-get install kvm
安装网络工具
用于桥接网络,依赖工具tunctl
;如果不需要桥接,可以不用安装。
$ sudo apt-get install bridge-utilities uml-utilities
安装虚拟机
打算虚拟一个Windows XP。
创建磁盘文件
虚拟机磁盘文件可以有很多格式,qcow2、raw、vdi、vmdk等。官方推荐qcow2+virtio,其性能和raw基本接近。qcow2的优点是根据磁盘使用量自增长,不需要一次性分配;raw的优点是便于移植,且能直接挂载到本地,不用开启虚拟机即可访问虚拟机数据。
$ qemu-img create -f qcow2 winxp.img 10G
安装虚拟机
$ kvm -no-acpi -m 512 -cdrom /store1/Public/WinISO/WindowsXP_PRO_SP3_VOL.iso -hda winxp.img -boot d
其中,
-M pc
选择模拟PC机型,可用-M ?
得到机型列表;-hd(a|b|c..)
指定硬盘镜像文件;-boot d
表示从光盘启动,-boot c
表示从硬盘启动;-no-acpi
表示禁止电源管理;-m 512
设置虚拟机内存大小。
运行虚拟机
直接运行
$ kvm -m 512 winxp.img -boot c
这是最简单的运行方法,执行后将出现一个Windows运行窗口。网络默认是工作在NAT方式,虚拟机DHCP得到的地址一般是10.0.2.x,主机作为网关地址是 10.0.2.2,你可以通过samba协议共享主机内容。
kvm的图形性能很差,所以,直接访问虚拟机鼠标移动速度很慢,基本不可用,只用于测试虚拟机是否安装成功,或进行简单的设置。
后台运行
$ kvm -M pc -m 512 -smp 2 -hda winxp.img -net nic -net user -usb -localtime -daemonize -nographic -vnc 127.0.0.1:1 -redir tcp:3389::3389 -soundhw all
其中,
-net nic -net user
即默认的NAT方式,KVM充当虚拟机的网关和防火墙,这种方式下一般需要搭配-redir
参数,后者用于重定向端口号,否则无法从外部访问虚拟机网络,-redir tcp:3389::3389
重定向虚拟机的3389端口到主机的网络界面上,可以在远程使用RDP协议登录虚拟机,-smp 2
表示使用两个CPU核心;-vnc :1
开启vnc远程访问,其中:1
标识vnc端口;-daemonize
在后台运行虚拟机;-nographic
不显示图形界面;-soundhw all
开启声卡。
此时,可以使用vncviewer访问虚拟机,但鼠标性能还是较差:
$ vncviewer 127.0.0.1:1
最佳的办法是使用RDP协议访问,需要先直接访问Windows开启远程桌面支持;然后,使用RDP客户端访问宿主机IP加端口号,即可远程访问后台运行的虚拟机,比如:
$ rdesktop host-ip:3389 -g 1024x768 -u "Julian Qian" -p password -r sound:local
这种方式比直接登录虚拟机界面速度要快很多,也比VirtualBox之类的虚拟机方案方便快捷很多,就好像你有一台远程主机一样。
桥接网络
桥接可以使得虚拟机和主机在同一个子网内。
增加桥接设备
编辑 /etc/network/interface
,增加虚拟网卡设备tap0和桥接设备br0。
auto eth0
iface eth0 inet manual
auto tap0
iface tap0 inet manual
up ifconfig $IFACE 0.0.0.0 up
down ifconfig $IFACE down
tunctl_user jqian
auto br0
iface br0 inet static
address 192.168.1.150
netmask 255.255.255.0
gateway 192.168.1.1
bridge_ports eth0 tap0
bridge_stp off
bridge_fd 0
bridge_hello 0
bridge_maxwait 0
这里把实际网卡eth0和虚拟网卡tap0都加入了网桥设备br0,所以eth0和tap0都不用再设置IP地址。
另外,检查一下设备/dev/net/tun
的访问权限,也许需要把你的用户加入uml-net
用户组:
$ sudo usermod -aG uml-net jqian
激活网卡设备后可以用brctl
命令检查,可以看到eth0
和tap0
都桥接到了br0
上:
$ brctl show
bridge name bridge id STP enabled interfaces
br0 8000.00012e36c181 no eth0
tap0
禁止netfilter
kvm通过VLAN向处于同一VLAN的虚拟机发送数据包。如果没有特别指定VLAN,默认就是VLAN0。如果虚拟机没法接收到数据包,应该查看 /proc/sys/net/bridge
,禁止netfilter相关设置。
$ cd /proc/sys/net/bridge
$ for f in bridge-nf-*; do sudo echo 0 > $f; done
或者,编辑 /etc/sysctl.conf
,增加如下内容:
# Disable netfilter on the bridge interface for KVM
# Solution is associated with launchpad bug number 573461
net.bridge.bridge-nf-call-ip6tables = 0
net.bridge.bridge-nf-call-iptables = 0
net.bridge.bridge-nf-call-arptables = 0
运行虚拟机
由于此时虚拟机会分配到和宿主机相同子网的IP地址,所以,最好先直接登录虚拟机取消DHCP,设置固定IP,然后再后台运行虚拟机。
$ kvm -no-acpi -M pc -m 512 -smp 2 -drive file=/home/jqian/winxp.img,cache=writeback,if=virtio -net nic -net tap,ifname=tap0,script=no -rtc base=localtime,clock=host -vnc :1 -daemonize -usb -soundhw es1370
其中,
-net nic -net tap
表示使用TAP网络设备;-drive
和-rtc
都是新的参数格式,用法类似。
连接USB设备
目前好像没有看到自动挂载usb设备的方法,只能手动加载。
可以在主机上用lsusb
,或者在虚拟机的控制台里运行info usbhost
,得到设备的verdorID:productID
。
控制台挂载
kvm支持所谓的usb passthrough,挂载USB设备的话,在启动kvm时需加上-usb
参数。如果以图形界面启动,直接按下Ctrl+Alt+2,进入控制台;如果以vnc后台启动,需要远程使用vncviewer连上vnc server,然后按下Ctrl+Alt+2,进入控制台。
在控制台内,你也可以查询USB设备信息,使用命令 usb_add
挂载设备。
(qemu) info usbhost
husb: using sys file-system with /dev/bus/usb
Device 1.1, speed 480 Mb/s
Hub: USB device 1d6b:0002, EHCI Host Controller
Device 2.1, speed 480 Mb/s
Hub: USB device 1d6b:0002, EHCI Host Controller
Device 3.1, speed 12 Mb/s
Hub: USB device 1d6b:0003, xHCI Host Controller
Device 1.2, speed 480 Mb/s
Hub: USB device 8087:0024
Device 2.2, speed 480 Mb/s
Hub: USB device 8087:0024
Device 3.2, speed 480 Mb/s
Hub: USB device 2109:0811, USB 2.0 Hub
Device 2.3, speed 480 Mb/s
Class 00: USB device 1307:0165, USB Flash Disk
(qemu) usb_add host:1307:0165
挂载完成后,按下Ctrl+Alt+1,返回虚拟机界面。
不过,对于usb不要抱太大期望,目前qemu/kvm只支持usb1.1。所以,你只能够挂载usb disk之类的设备,如果想连接iPhone之类的手机设备目前是不可能的。这也是virtualbox比kvm的优势所在。
这里有一份kvm的特性开发计划,usb2.0的支持尚在计划之中。