首页 > 代码库 > KVM

KVM

KVM相关概念

全虚拟化(Full Virtualization)

全虚拟化也称为原始虚拟化技术,该模型使用虚拟机协调guest操作系统和原始硬件
VMM在guest操作系统和裸硬件之间用于工作协调,一些受保护指令必须由Hypervisor(虚拟机管理程序)来捕获处理。 全虚拟化的运行速度要快于硬件模拟,但是性能方面不如裸机,因为Hypervisor需要占用一些资源。
技术分享

半虚拟化(Para Virtualization)

 

半虚拟化是另一种类似于全虚拟化的技术,它使用Hypervisor分享存取底层的硬件,但是它的guest操作系统集成了虚拟化方面的代码。
该方法无需重新编译或引起陷阱,因为操作系统自身能够与虚拟进程进行很好的协作。 半虚拟化需要guest操作系统做一些修改,使guest操作系统意识到自己是处于虚拟化环境的,但是半虚拟化提供了与原操作系统相近的性能。
技术分享


 

 

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

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

是基于 Linux 内核的虚拟机(Kernel-based Virtual Machine)。
是第一个整合到 Linux 内核的虚拟化技术。
在 KVM 模型中,每一个虚拟机都是一个由 Linux 调度程序管理的标准进程,你可以在用户空间启动客户机操作系统。支持linux以外的其它系统。如windows。
一个普通的 Linux 进程有两种运行模式:内核和用户。 KVM 增加了第三种模式:客户模式(有自己的内核和用户模式)
技术分享
KVM,是一个开源的系统虚拟化模块,自Linux 2.6.20之后集成在Linux的各个主要发行版本中。它使 用Linux自身的调度器进行管理,所以相对于Xen,其核心源码很少。KVM目前已成为学术界的主流VMM 之一。KVM的虚拟化需要硬件支持(如Intel VT技术戒者AMD V技术)。是基于硬件的完全虚拟化。而 Xen早期则是基于软件模拟的Para-Virtualization,
结构包含两部分
1、设备驱动/dev/kvm
2、针对模拟PC硬件的用户控件组件

Intel VT技术
主要由三部分技术组成:VTx、VTd和VTc。其中,VTx是处理器技术,提供内存以及虚拟机的硬件隔离,所涉及的技术有页表管理以及地址空间的保护。VTd是处理有关芯片组的技术,它提供一些针对虚拟机的特殊应用,如支持某些特定的虚拟机应用跨过处理器I/O管理程序,直接调用I/O资源,从而提高效率,通过直接连接I/O带来近乎完美的I/O性能。VTc是针对网络提供的管理,它可以在一个物理网卡上,建立针对虚拟机的设备队列搜索。

EPT——降低虚拟内存访问的系统开销
EPT即Extended Page Tables(扩展页表)的缩写。CPU要通过主机物理地址来访问内存。如果只是一台物理服务器,这个物理地址就只为一个操作系统服务,但如果进行了虚拟化部署,有多个虚拟机时,就存在着稳定性的隐患。因为在进行VM Entry(虚拟机进入)与VM Exit(虚拟机退出)时(尤其是后者),都要对内存页进行修改。但物理内存是多个虚拟机共享的,因此不能让虚拟机直接访问物理地址,否则一个虚拟机出现内存错误,就会殃及整个物理服务器的运行。所以必须要采取虚拟地址,而EPT的作用就在于加速从虚拟机地址至主机物理地址的转换过程,节省传统软件处理方式的系统开销。

Xen虚拟化技术

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

QEMU

是一套由 Fabrice Bellard 所编写的以 GPL 许可证分发源码的模拟处理器,在 GNU/Linux 平 台上使用广泛。
QEMU具有高速度和跨平台的特性,QEMU能模拟至接近真实电脑的速度。
QEMU能模拟整个电脑系统,包括中央处理器及其他周边设备。

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 的关系。
技术分享
技术分享

 

安装kvm

#rpm -ivh http://mirrows.ustc.edu.cn/fedora/epel/6/x86_64/epel-release-6-8.noarch.rpm
或rpm -ivh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
#rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6
#yum install qemu-kvm qemu-kvm-tools virt-manager libvirt  
  qenu-kvm kvm是linux的一个模块,管理和创建完整的虚拟机需要相应的一些管理工具
  由于kvm是在qemu的基础上开发的,KVM 使用了 QEMU 的基于 x86 的部分,并稍加改造,形成可控制 KVM 内核模块的用户空间工具QEMU-KVM   qemu-kvm-tools kvm管理工具   virt-manager 图形化管理工具   libvirt 支持Linux下主流虚拟化工具的C函数库,旨在为包括Xen、kvm在内的各种虚拟化工具提供一套方便、可靠的编程接口
=========================使用图形化管理工具方法
# yum groupinstall "X Window System"
# yum groupinstall Desktop
#virt-manager          
=========================使用图形化管理工具方法

kvm管理  cpu0 disabled perfctr wrmsr: 0xc1 data 0xabcd搞不定

#增加主机hosts解析
#/etc/init.d/libvirtd start 
#chkconfig libvirtd on
#lsmod | grep kvm                     #查看模块是否加载安装
kvm_intel              55624  0 
kvm                   341551  1 kvm_intel

接下来创建2个实践虚拟机 创建一个分区,挂载/kvmdata,用于放置虚拟机镜像盘 #qemu-img create -f raw /kvmdata/CentOS-6.7test1.raw 7G #qemu-img create -f raw /kvmdata/CentOS-6.7test2.raw 7G Formatting ‘/kvmdata/CentOS-6.7test1.raw‘, fmt=raw size=7516192768 #file /kvmdata/CentOS-6.7test1.raw /kvmdata/CentOS-6.7test1.raw: data #qemu-img info /kvmdata/CentOS-6.7test1.raw image: /kvmdata/CentOS-6.7test1.raw file format: raw virtual size: 7.0G (7516192768 bytes) disk size: 0 # dd if=/dev/cdrom of=/kvmdata/CentOS-6.7-x86_64.iso #virt-install --virt-type kvm --name CentOS-6.7-x86_64_test1 --ram 512 --cdrom=/kvmdata/CentOS-6.7-x86_64.iso
--disk path=/kvmdata/CentOS-6.7test1.raw --network network=default --graphics vnc,listen=0.0.0.0 --noautoconsole --os-type=linux --os-variant=rhel6 #virt-install --virt-type kvm --name CentOS-6.7-x86_64_test2 --ram 512 --cdrom=/kvmdata/CentOS-6.7-x86_64.iso
--disk path=/kvmdata/CentOS-6.7test2.raw --network network=default --graphics vnc,listen=0.0.0.0 --noautoconsole --os-type=linux --os-variant=rhel6 Starting install... Creating domain... | 0 B 00:01 Domain installation still in progress. You can reconnect to the console to complete the installation process.
# netstat -tlnup | grep 590
tcp        0      0 0.0.0.0:5900                0.0.0.0:*                   LISTEN      12575/qemu-kvm      
tcp        0      0 0.0.0.0:5901                0.0.0.0:*                   LISTEN      12709/qemu-kvm 

==》之后可以通过VNC连接,进行操作系统安装(略)
===================================================================== vnc无法远程连接的问题 vnc-options expert-colourlevel 改为 full 即可。
编辑xml文件支持vnc连接方法
<graphics type=vnc port=-1 autoport=yes listen=0.0.0.0> <listen type=address address=0.0.0.0/> </graphics>
===================================================================
虚拟机的xml文件
# ls -l /etc/libvirt/qemu  #virsh edit通过此命令修改xml文件
-rw------- 1 root root 3077 Apr  4 05:10 CentOS-6.7-x86_64_test1.xml
-rw------- 1 root root 3077 Apr  4 05:11 CentOS-6.7-x86_64_test2.xml
drwx------ 3 root root 4096 Apr  4 03:23 networks
===============根据xml文件,重建虚拟机的方法 cp CentOS-6.7-x86_64_test.xml /opt/CentOS-6.7-x86_64_test.xml virsh undefine CentOS-6.7-x86_64_test virsh define /opt/CentOS-6.7-x86_64_test.xml ===============根据xml文件,重建虚拟机的方法 # virsh list (显示运行的vm) 或 virsh list --all(显示所有) #virsh --help 重要命令参数   dumpxml   reboot   shutdown   start   suspend   undefined define [root@test93 opt]# virsh start CentOS-6.7-x86_64_test Domain CentOS-6.7-x86_64_test started [root@test93 opt]# virsh list --all Id Name State 2 CentOS-6.7-x86_64_test running yum install virt-top 监控kvm (zabbix agent更好) 优化项,默认开启,实现4k内存合并 [root@test93 qemu]# cat /sys/kernel/mm/transparent_hugepage/enabled [always] madvise never [root@test93 qemu]# ps aux | grep ksm 定期会对页面合并,相同内容的内存合并 root 34 0.0 0.0 0 0 ? SN 13:50 0:00 [ksmd]


# virsh list                             
 Id    Name                           State
----------------------------------------------------


# brctl show #kvm创建的网桥设备 # brctl show bridge name bridge id STP enabled interfaces virbr0 8000.525400c58f2d yes virbr0-nic # ifconfig | tail -8 # ifconfig | tail -8 virbr0 Link encap:Ethernet HWaddr 52:54:00:C5:8F:2D inet addr:192.168.122.1 Bcast:192.168.122.255 Mask:255.255.255.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:0 (0.0 b) TX bytes:0 (0.0 b)

 

KVM