KVM是由一家以色列公司Qumarante初创的一个虚拟机解决方案,之后在2008年9月4日被Redhat收购,并且在RHEL 6中被集成,替换掉了原来集成XEN。

KVM不是一套独立的虚拟化方案,部分功能由Linux Kernel和QEMU实现。KVM支持全虚拟化和半虚拟化。

KVM构成

KVM不能独立运行它必须借助QEMU,KVM主要实现“处理器虚拟化”和“内存虚拟化”,外设的模拟大部分都交给QEMU处理(如:网卡、显卡、硬盘等);

QEMU是一个完整的虚拟化方案,是纯软件实现的,性能相对比较地下,但是它功能比较完备,甚至可以模拟出不同处理器架构的虚拟机;而且积累了大量成熟的外设的虚拟化实现,KVM则直接借用了这部分实现。

QEMU-KVM是QEMU提供KVM支持的分支版本,它将KVM虚拟化纳入进来,实现虚拟化的性能提升,而外设模拟、人机交互部分(如:创建、配置虚拟机)及其它相关功能则由QEMU实现。

所以我们普通用户面对的就是QEMU-KVM,目前QEMU主干版本已经把一部分KVM支持已经纳入进去;

体验KVM

KVM需要硬件的支持,包括:Intel VT、Intel VT-d、AMD-V,这些特性设置需要在BIOS中开启,如果你的处理器不支持这些那就不能安装了。

安装KVM环境

$ sudo apt-get update
$ sudo apt-get install kvm

建立虚拟机

安装虚拟机时需要一个VNC客户端,用来显示虚拟机界面并进行交互,如果你执行操作的电脑是Mac有Chicken可以使用,如果是Windows有UltraVNC、Linux可以使用VNC Viewer。

为了安装简单,这里的外设没有使用半虚拟化驱动,性能的确比较差,请不要用性能说事。并且此配置方式下只能访问外部网络,外部网络不能访问虚拟机。

准备一个30G大小的硬盘

# qemu-img create -f qcow2 win7-sp1-x64.qcow2 30g

启动并安装虚拟机,启动后使用VNC客户端连接母机的5909端口就可以看到界面了。如果你遭遇了蓝屏0x0000005D,请添加参数-enable-kvm或者-machine accel=kvm:tcg即可。

# qemu-system-x86_64 -m 2048 -drive file=win7-sp1-x64.qcow2 -net nic -net user -nographic -vnc :9 -device piix3-usb-uhci -device usb-tablet,id=input0 -cdrom cn_windows_7_ultimate_with_sp1_x64_dvd_u_677408.iso

安装完成后就可以简化一下命令行,取下iso,启动虚拟机了

# qemu-system-x86_64 -m 2048 -drive file=win7-sp1-x64.qcow2 -net nic -net user -nographic -vnc :9 -device piix3-usb-uhci -device usb-tablet,id=input0

KVM有一些启动选项

-boot [a|c|d|n]: 设置虚拟系统的引导顺序,a为软驱,c为硬盘,d为光驱,n为网络.

KVM与网络

KVM的网络有多种模式:内部用户模式,NAT模式,网桥模式和直接分配网卡

用户网络

如果不指定,默认为内部用户模式,即:“-net nic -net user”,此模式有一些特点:

  • 用户可以通过虚拟机访问外部网络
  • 外部用户无法访问虚拟机
  • 不能ping通外部网络

网桥模式

网桥模式默认启动和关闭时会调用/etc/qemu-ifup/etc/qemu-ifdown来配置网络,下面的介绍将使用参数script=no禁止使用脚本而是人工配置,参数为:-net tap,script=no

# qemu-system-x86_64 -machine accel=kvm:tcg -m 2048 -drive file=win7-sp1-x64.qcow2,if=virtio -net nic,model=virtio -net tap,script=no -nographic -vnc :9 -device piix3-usb-uhci -device usb-tablet,id=input0

启动后默认会生产tapX虚拟网卡,X是数字序号;并且tapX默认是down状态;

# ip link show dev tap0

假设我们已经建立网桥br100,并且已经将物理网卡加入了网桥,现将tap0加入网桥,就可以通过网桥连接外网了(如果你的网络中不是自动获取IP,别忘记了在虚拟机中人工配置IP地址)。

# ip link set tap0 up
# brctl addif br100 tap0

有时候网桥中并没有物理网卡,而是通过iptables规则将物理网卡的数据跟网桥建立通道。

在关闭虚拟机的时候会自动将tapX从网桥中移除,并删除tapX设备;那么/etc/qemu-ifdown好像就不用了。

如果想让自动配置网络那么就得编写脚本/etc/qemu-ifdown了,如果已经存在,且你害怕影响已有系统,那么换个名字无非就是多在参数中指定一下名称而已;我们给它起名/etc/qemu-ifup-cust

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
#!/bin/bash

# Bridge
switch=br100

if [ -n $1 ]; then
    ip link set $1 up
    sleep 0.5s
    brctl addif ${switch} $1
    exit 0
else
    echo "no interface!"
    exit 1
fi

添加可执行权限,否则会报错

# chmod +x /etc/qemu-ifup-cust

这是就可以启动虚拟机看看效果了

# qemu-system-x86_64 -machine accel=kvm:tcg -m 2048 -drive file=win7-sp1-x64.qcow2,if=virtio -net nic,model=virtio -net tap,script=/etc/qemu-ifup-cust -nographic -vnc :9 -device piix3-usb-uhci -device usb-tablet,id=input0

KVM与CPU

QEMU-KVM默认使用“qemu64”处理器型号,在系统中显示为“QEMU Virtual CPU version 1.5.0”,可以使用-cpu qemu,+aes选项来指定处理型号和特性,也可以使用-cpu host直接将处理器暴露给虚拟主机。

使用-smp指定虚拟CPU的数量,例如-smp 8或者-smp 8,sockets=2,cores=2,threads=2

KVM与用户界面

显示驱动

默认显卡驱动只支持到1024x768的分辨率,如果需要更高的分辨率,请使用qxl驱动:

-vga qxl

半虚拟化驱动

QEMU默认驱动性能非常低下,普通使用基本上不具备实用价值,尤其是“磁盘”和“网络”,使用VritIO半虚拟化驱动可以大幅提升性能。

半虚拟化启动目前主要有:网络,磁盘及内存

给Windows虚拟机添加半虚拟化驱动

下载VirtIO驱动

http://alt.fedoraproject.org/pub/alt/virtio-win/latest/images/bin/ ,在虚拟机中下载驱动,这个驱动是iso格式的,里面包含了各个Windows版本的驱动,需要解压,可以使用7-zip等。

安装磁盘驱动:

设备管理器-》操作-》添加过时硬件-》选择:安装我手动从列表中选择的硬件-》常见硬件类型中,选择“存储控制器”-》选择从磁盘安装,驱动文件名称为“VIOSCSI”

安装网络驱动:

设备管理器-》操作-》添加过时硬件-》选择:安装我手动从列表中选择的硬件-》常见硬件类型中,选择“网络适配器”-》选择从磁盘安装,驱动文件名称为“NETKVM”

重新启动虚拟机

修改启动参数,将硬盘和网卡修改为virtio驱动模式;

# qemu-system-x86_64 -machine accel=kvm:tcg -m 2048 -drive file=win7-sp1-x64.qcow2,if=virtio -net nic,model=virtio -net user -nographic -vnc :9 -device piix3-usb-uhci -device usb-tablet,id=input0

KVM与存储

KVM除了支持本地磁盘外,还可以使用NFS、iSCSI及Sheepdog(分布式存储);

虚拟机迁移

QEMU内置了虚拟机迁移指令,但是这只能用于KVM到KVM的迁移;

virt-v2v是一种虚拟机到虚拟机的迁移工具,支持xen、vmware、kvm到kvm的迁移;virt-v2v依赖于libvirt;

从XEN到KVM

# virt-v2v -ic xen+ssh://root@192.168.2.150 -os default --bridge br100 xen-vm1
# virsh create /etc/libvirt/qemu/xen-vm1.xml

从VMWare EXSI到KVM

# virt-v2v -ic esx://192.168.2.151/ -os pool --bridge br100 esx-vm1

从VirtualBox到KVM

# virt-v2v -ic vbox+ssh://192.168.2.152 -os pool -b br100 vbox-vm1

除了使用工具外,还可以直接拷贝镜像到目标机器然后启动;如果格式不一致可以使用qemu-img convert转换成KVM支持的qcow2等格式。

KVM管理工具

QEMU Monitor

QEMU提供了一套功能强大的管理工具:QEMU Monitor,QEMU Monitor有着丰富的管理命令,如:获取和修改虚拟机的CPU、内存、磁盘配置及迁移虚拟机等。

进入QEMU Monitor有几种方式:

1)使用-monitor参数,在命令行加入-monitor stdio,在启动后将自动进入QEMU Monitor交互界面;当然-monitor后面还有其它的选项,如果定向到串口等。

2)在-nographics后,使用Ctrl+a c切换到monitor;

3)如果是使用的sdl方式,在本机打开的界面,使用Ctrl + Alt + 2进入monitor,使用Ctrl + Alt + 1返回控制台模式;

libvirt

libvirt以驱动的形式载入系统,为使用者提供了统一的开发和命令行接口;目前支持KVM、XEN、VMWare、LXC等众多虚拟机,并且提供了基于C的程序接口,也有Python、Perl、Java、Php等众多语言的支持包;

目前的大部分云管理平台和管理工具都基于libvirt;

virsh是libvirt自己提供的一个命令行工具;

Virtual Machine Manager

virt-manager是一个轻量级虚拟机管理程序,提供图形操作界面;

Virt Viewer

virt-viewer可以显示VNC接SPICE界面。

Virt Install

virt-install 一个创建新虚拟机的工具,主要是为了简化kvm命令。

Openstack && Cloudstack && OpenNebula

几个著名的云平台,都是以libvirt为基础管理虚拟机;

Openstack使用Python开发,目前活跃度最高,是一个以api为核心的平台,具备很好的扩展性;

Cloudstack使用Java开发,由Apache接手管理,安装使用比较方便;

OpenNebule活跃度稍差一些,前期程序主要由大量的shell构成;

[ 编辑 | 历史 ]
最近由“jilili”在“2014-05-06 17:45:35”修改