kvm、libvirt、virsh、virt-manager、qemu、qemu-kvm、qemu-img、virt-install等等之间的关系

全虚拟化和半虚拟化。目前全虚拟化的产品有KVM、VMwerae、Qemu等


KVM:(Kernel-based Virtual Machine)基于内核的虚拟机
KVM是集成到Linux内核的Hypervisor,是X86架构且硬件支持虚拟化技术(Intel VT或AMD-V)的Linux的全虚拟化解决方案。它是Linux的一个很小的模块,利用Linux做大量的事,如任务调度、内存管理与硬件设备交互等。
从存在形式看, KVM是两个内核模块kvm.ko和kvm_intel.ko(对AMD处理器来说,就是kvm_amd.ko),这两个模块用来实现CPU的虚拟化。 如果要让用户在KVM上完成一个虚拟机相关的操作,显然需要用户空间的东西,同时还包括IO虚拟化,所以KVM的解决方案借鉴了QEMU的东西并做了一定的修改,形成了自己的KVM虚拟机工具集和IO虚拟化的支持,也就是所谓的qemu-kvm. (KVM is a fork of QEMU, namely qemu-kvm);

libvirt:libvirt是一个中间层专门用于管理虚拟化的函数库,将底层不同的虚拟化驱动如qemu+kvm, XEN等都用统一的接口封装。这样对用户而言,只需要知道libvirt的接口就能使用虚拟机,而不用关心底层的各种驱动的细节。virsh和virt-manager还有kimchi等软件都是调用libvirt来实现虚拟机的管理。用户通常是直接使用上面这三个软件的。

virsh和virt-manager:都是利用virsh库开发出来实现虚拟化管理的。

virsh:是管理虚拟机的

virt-install:是安装虚拟机的.其是qemu-kvm工具的人性化实现

qemu-img:是创建虚拟机的镜像文件的

qemu-kvm:也可以安装虚拟机但是没有virt-install这个友好。

qemu:是一个完整的可以单独运行的软件,它可以用来模拟机器,非常灵活和可移植。它主要通过一个特殊的'重编译器'将为特定处理器编写二进制代码转换为另一种。(也就是,在PPCmac上面运行MIPS代码,或者在X86 PC上运行ARM代码)

qemu-kvm:现在所说的虚拟化,一般都是指在CPU硬件支持基础之上的虚拟化技术。KVM也同hyper-V、Xen一样依赖此项技术。没有CPU硬件虚拟化的支持,KVM是无法工作的。
准 确来说,KVM是Linux的一个模块。可以用modprobe去加载KVM模块。加载了模块后,才能进一步通过其他工具创建虚拟机。但仅有KVM模块是 远远不够的,因为用户无法直接控制内核模块去作事情:还必须有一个用户空间的工具才行。这个用户空间的工具,开发者选择了已经成型的开源虚拟化软件 QEMU。说起来QEMU也是一个虚拟化软件。它的特点是可虚拟不同的CPU。比如说在x86的CPU上可虚拟一个Power的CPU,并可利用它编译出 可运行在Power上的程序。KVM使用了QEMU的一部分,并稍加改造,就成了可控制KVM的用户空间工具了。所以你会看到,官方提供的KVM下载有两 大部分三个文件,分别是KVM模块、QEMU工具以及二者的合集。也就是说,你可以只升级KVM模块,也可以只升级QEMU工具。这就是KVM和QEMU 的关系;

KVM:(Kernel-based Virtual Machine)基于内核的虚拟机

KVM是集成到Linux内核的Hypervisor,是X86架构且硬件支持虚拟化技术(Intel VT或AMD-V)的Linux的全虚拟化解决方案。它是Linux的一个很小的模块,利用Linux做大量的事,如任务调度、内存管理与硬件设备交互等。

从存在形式看, KVM是两个内核模块kvm.ko和kvm_intel.ko(对AMD处理器来说,就是kvm_amd.ko),这两个模块用来实现CPU的虚拟化。 如果要让用户在KVM上完成一个虚拟机相关的操作,显然需要用户空间的东西,同时还包括IO虚拟化,所以KVM的解决方案借鉴了QEMU的东西并做了一定的修改,形成了自己的KVM虚拟机工具集和IO虚拟化的支持,也就是所谓的qemu-kvm. (KVM is a fork of QEMU, namely qemu-kvm)

Xen

Xen是第一类运行再裸机上的虚拟化管理程序(Hypervisor)。它支持全虚拟化和半虚拟化,Xen支持hypervisor和虚拟机互相通讯,而且提供在所有Linux版本上的免费产品,包括Red Hat Enterprise Linux和SUSE Linux Enterprise Server。Xen最重要的优势在于半虚拟化,此外未经修改的操作系统也可以直接在xen上运行(如Windows),能让虚拟机有效运行而不需要仿真,因此虚拟机能感知到hypervisor,而不需要模拟虚拟硬件,从而能实现高性能。 QEMU is used by Xen.

QEMU

QEMU是一套由Fabrice Bellard所编写的模拟处理器的自由软件。它与Bochs,PearPC近似,但其具有某些后两者所不具备的特性,如高速度及跨平台的特性,qemu可以虚拟出不同架构的虚拟机,如在x86平台上可以虚拟出power机器kqemu为qemu的加速器经由kqemu这个开源的加速器,QEMU能模拟至接近真实电脑的速度。

QEMU本身可以不依赖于KVM,但是如果有 KVM的存在并且硬件(处理器)支持比如Intel VT功能,那么QEMU在对处理器虚拟化这一块可以利用KVM提供的功能来提升性能。


KVM和QEMU的关系

准确来说,KVM是Linux kernel的一个模块。可以用命令modprobe去加载KVM模块。加载了模块后,才能进一步通过其他工具创建虚拟机。但仅有KVM模块是 远远不够的,因为用户无法直接控制内核模块去作事情,你还必须有一个运行在用户空间的工具才行。这个用户空间的工具,kvm开发者选择了已经成型的开源虚拟化软件 QEMU。说起来QEMU也是一个虚拟化软件。它的特点是可虚拟不同的CPU。比如说在x86的CPU上可虚拟一个Power的CPU,并可利用它编译出可运行在Power上的程序。KVM使用了QEMU的一部分,并稍加改造,就成了可控制KVM的用户空间工具了。所以你会看到,官方提供的KVM下载有两大部分(qemu和kvm)三个文件(KVM模块、QEMU工具以及二者的合集)。也就是说,你可以只升级KVM模块,也可以只升级QEMU工具。这就是KVM和QEMU 的关系。

QEMU是个独立的虚拟化解决方案,从这个角度它并不依赖KVM。 而KVM是另一套虚拟化解决方案,不过因为这个方案实际上只实现了内核中对处理器(Intel VT, AMD SVM)虚拟化特性的支持,换言之,它缺乏设备虚拟化以及相应的用户空间管理虚拟机的工具,所以它借用了QEMU的代码并加以精简,连同KVM一起构成了另一个独立的虚拟化解决方案,不妨称之为:KVM+QEMU. 

KVM用户空间虚拟机管理工具有kvm, kvm-img, kvm-nbd ,kvm-ok 和kvm_stat,实际上kvm就是一个指向qemu-system-x86_64的符号链接,kvm-img则是指向qemu-img的符号链接。从适用的范围来讲, QEMU虚拟化方案除了支持x86架构外,还支持其他很多架构,比如qemu-system-m68k,qemu-system-mips64, qemu-system-ppc64, qemu-system-arm等等。但是目前提到KVM,一般指x86上基于Intel VT和AMD SVM的解决方案,虽然目前将KVM移植到ARM, PPC的工作正在进行中。

当然由于redhat已经开始支持KVM,它认为KVM+QEMU'的方案中用户空间虚拟机管理工具不太好使,或者通用性不强,所以redhat想了一个libvirt出来,一个用来管理虚拟机的API库,不只针对KVM,也可以管理Xen等方案下的虚拟机。

kvm-qemu可执行程序像普通Qemu一样:分配RAM,加载代码,不同于重新编译或者调用callingKQemu,它创建了一个线程(这个很重要);这个线程调用KVM内核模块去切换到用户模式,并且去执行VM代码。当遇到一个特权指令,它从新切换会KVM内核模块,该内核模块在需要的时候,像Qemu线程发信号去处理大部分的硬件仿真。
这个体系结构一个比较巧妙的一个地方就是客户代码被模拟在一个posix线程,这允许你使用通常Linux工具管理。如果你需要一个有2或者4核的虚拟机,kvm-qemu创建2或者4个线程,每个线程调用KVM内核模块并开始执行。并发性(若果你有足够多的真实核)或者调度(如果你不管)是被通用的Linux调度器,这个使得KVM代码量十分的小。
qemu-img: qemu-img 命​令​行​工​具​是​ Xen 和​ KVM 用​来​格​式​化​各​种​文​件​系​统​的​,可​使​用​ qemu-img 格​式​化​虚​拟​客​户​端​映​像​、​附​加​存​储​设​备​以​及​网​络​存​储​,​qemu-img 选​项​及​用​法​如​下​http://blog.csdn.net/bravezhe/article/details/8461386

virt-install:virt-install是rpm包python-virtinst里的一个工具 -- 其实就是一个python写的脚本 。其是qemu-kvm工具的人性化实现。可以利用该工具在终端下创建KVM guest主机。

[root@kvmtest ~]# rpm -qf /usr/bin/virt-install
python-virtinst-0.600.0-15.el6.noarch

一、virt-install vs qemu-kvm创建guest主机

1、virt-install创建guest主机

$ virt-install --connect qemu:///system
   --name kvmnode1
   --ram 512
   --file /nfs/vms/kvmnode1.disk1
   --file /nfs/vms/kvmnode1.disk2
   --network=bridge:br0
   --accelerate
     -s 18
   --pxe
     -d
   --noautoconsole
   --mac=54:52:00:53:20:15
   --nographics
   --nonsparse

2、qemu-kvm 创建guest主机

$ /usr/bin/qemu-kvm -M pc
   -m 1024
   -smp 1
   -name kvmnode1
   -monitor stdio
   -boot n
   -drive file=/nfs/vms/kvmnode1,if=ide,index=0
   -net nic,macaddr=54:52:00:53:20:00,vlan=0
   -net tap,script=no,vlan=0,ifname=tap0
   -serial stdio
   -nographic
   -incoming tcp:0:4444

注:以上参考了matty 的blog  。不过在centos里qemu-kvm 命令位于/usr/libexec/qemu-kvm 。

二、virt-install常用参数

  • -n --name= 客户端虚拟机名称
  • -r --ram= 客户端虚拟机分配的内存
  • -u --uuid= 客户端UUID 默认不写时,系统会自动生成
  • --vcpus= 客户端的vcpu个数
  • -v --hvm 全虚拟化
  • -p --paravirt 半虚拟化
  • -l --location=localdir 安装源,有本地、nfs、http、ftp几种,多用于ks网络安装
  • --vnc 使用vnc ,另有--vnclient=监听的IP  --vncport =VNC监听的端口
  • -c --cdrom= 光驱 安装途径
  • --disk= 使用不同选项作为磁盘使用安装介质
  • -w NETWORK, --network=NETWORK 连接客户机到主机网络 
  • -s --file-size= 使用磁盘映像的大小 单位为GB
  • -f --file= 作为磁盘映像使用的文件
  • --cpuset=设置哪个物理CPU能够被虚拟机使用
  • --os-type=OS_TYPE 针对一类操作系统优化虚拟机配置(例如:‘linux’,‘windows’)
  • --os-variant=OS_VARIANT 针对特定操作系统变体(例如’rhel6’, ’winxp’,'win2k3')进一步优化虚拟机配置
  • --host-device=HOSTDEV 附加一个物理主机设备到客户机。HOSTDEV是随着libvirt使用的一个节点设备名(具体设备如’virsh nodedev-list’的显示的结果)
  • --accelerate KVM或KQEMU内核加速,这个选项是推荐最好加上。如果KVM和KQEMU都支持,KVM加速器优先使用。
  • -x EXTRA, --extra-args=EXTRA 当执行从"--location"选项指定位置的客户机安装时,附加内核命令行参数到安装程序
  • --nographics "virt-install" 将默认使用--vnc选项,使用nographics指定没有控制台被分配给客户机

以上参考virt-install man页中文翻译 。

三、几个安装示例

示例1:

# qemu-img create -f qcow2 /data/centos-6.4.qcow2 10G
# virt-install --virt-type kvm --name centos-6.4 --ram 1024
--cdrom=/data/CentOS-6.4-x86_64-netinstall.iso
--disk path=/data/centos-6.4.qcow2,size=10,format=qcow2
--network network=default
--graphics vnc,listen=0.0.0.0 --noautoconsole
--os-type=linux --os-variant=rhel6

以上第一部创建guest镜像文件可以省略,virt-install在安装时带有创建过程 。不过还是建议按上面的步骤操作,因为如果两部合并,执行virt-install的时间比分开会略长 。对于--os-variant后面可以跟的值可以通过如下命令查看:

[root@kvmtest ~]# virt-install --os-variant list
win7                 : Microsoft Windows 7
vista                : Microsoft Windows Vista
winxp64              : Microsoft Windows XP (x86_64)
winxp                : Microsoft Windows XP
win2k                : Microsoft Windows 2000
win2k8               : Microsoft Windows Server 2008
win2k3               : Microsoft Windows Server 2003
openbsd4             : OpenBSD 4.x
freebsd8             : FreeBSD 8.x
freebsd7             : FreeBSD 7.x
…………………………省略………………………………

对于vnc后对应的display号码可以通过下面的方法查看:

# virsh vncdisplay centos-6.4
:1

以上示例参看openstack doc页面 。

示例2:

给guest主机划分物理机分区

lvcreate -L20G -n host.demo.com kvm-storage

下载镜像并loop到本地:

wget http://mirrors.manchester.icecolo.com/centos/5.5/isos/x86_64/CentOS-5.5-x86_64-bin-1of8.iso
mkdir /mnt/centos55
mount -o loop CentOS-5.5-x86_64-bin-1of8.iso /mnt/centos55/

通过location本地安装,并通过console管理:

virt-install
-n host.demo.com
-r 512
--vcpus=1
--os-variant=rhel5.4
--accelerate
--nographics
-v
-l /mnt/centos55/
-w bridge:br1
--disk path=/dev/kvm-storage/host.demo.com
-x "console=ttyS0"

管理时可以通过

#查看guest id、name 及状态
virsh list --all
#通过console连接查看
virsh console idname
#连接完成后会要求输入用户名和密码

以上页面参考另一个叫matt的blog (matt这名字在国外是不是很流行?

示例3:

virt-install --hvm --virt-type=kvm
--location=http://192.168.0.254/centos6/64 --name centos6.4
--ram 4096 --vcpus=2 --disk path=/dev/vg_vm/centos6.4
-w bridge:virbr0
-x "ks=http://192.168.0.130/ks/centos6.4.ks
ip=192.168.122.10 netmask=255.255.255.0 dns=192.168.122.1 gateway=192.168.122.1
console=tty0 console=ttyS0,115200n8"

由于通过console或vnc进行安装时,和普通物理机上安装一样,需要做各种各样的选择和设置 。而安装时可能通过kickstart配置文件,直接完在安装 。





安装KVM


1、确认当前cpu支持虚拟化 cat /proc/cpuinfo

2、yum -y install qemu-kvm libvirt virt-install bridge-utils

3、lsmod | grep kvm 

可以modprobe kvm ,kvm-intel,kvm-amd    modinfo kvm 

4、开启虚拟化服务:systemctl start libvirtd

5、配置网桥:

#vim ifcfg-enP1p3s0
#HWADDR="00:08:D2:ED:FA:A4"
  TYPE="Ethernet"
BOOTPROTO="none"
DEVICE=enP1p3s0
ONBOOT=yes
  BRIDGE=br0 
###################################
#vim ifcfg-br0
DEVICE=br0
TYPE=Bridge
     IPADDR=192.168.80.79
NETMASK=255.255.255.0
GATEWAY=192.168.80.1
ONBOOT=yes
     BOOTPROTO=none
DELAY=0

    6、关闭防火墙,systemctl stop firewalld.service

7、selinux防火墙关闭

setenforce 0
     sed -i 's/=enforcing/=disabled/g' /etc/selinux/config


8、可以通过VNC来远程桌面访问

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐