玩转KVM虚拟机

环境: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命令检查,可以看到eth0tap0都桥接到了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的支持尚在计划之中。