zoukankan      html  css  js  c++  java
  • KVM虚拟化技术

    KVM虚拟化技术

    Qemu-kvm创建和管理虚拟机

    一.KVM简介

    KVM(名称来自英语:Kernel-basedVirtual Machine的缩写,即基于内核的虚拟机),是一种用于Linux内核中的虚拟化基础设施,可以将Linux内核转化为一个hypervisor。KVM在2007年2月被导入Linux 2.6.20核心中,以可加载核心模块的方式被移植到FreeBSD及illumos上。

    KVM在具备Intel VT或AMD-V功能的x86平台上运行。它也被移植到S/390,PowerPC与IA-64平台上。在Linux内核3.9版中,加入ARM架构的支持。

    关于KVM:

    1).KVM是开源软件,全称是kernel-based virtual machine(基于内核的虚拟机)。
    2).是x86架构且硬件支持虚拟化技术(如 intel VT 或 AMD-V)的Linux全虚拟化解决方案。
    3).它包含一个为处理器提供底层虚拟化 可加载的核心模块kvm.ko(kvm-intel.ko或kvm-AMD.ko)。
    4).KVM还需要一个经过修改的QEMU软件(qemu-kvm),作为虚拟机上层控制和界面。
    5).KVM能在不改变linux或windows镜像的情况下同时运行多个虚拟机,(它的意思是多个虚拟机使用同一镜像)并为每一个虚拟机配置个性化硬件环境(网卡、磁盘、图形适配器……)。
    6).在主流的Linux内核,如2.6.20以上的内核均已包含了KVM核心。

    KVM 与 vbox的区别:
    vbox 是由 qemu 改写而成,包含大量qemu 代码。

    1).可以使用于"不支持"虚拟化技术的cpu。
    2).值得说的一点:vbox 在图形方面比较好,能进行2D 3D加速;但cpu控制不理想(估计是因为图形支持的缘故);操作上有独立的图形界面,易于上手。

    kvm 是linux内核包含的东西,使用qemu作为上层管理(命令行)。

    1).要求cpu 必须支持虚拟化。
    2).性能:作为服务器很好,可是图形能力十分的差。即使放电影,图像也是像刷油漆一样,一层一层的。
    3).cpu使用率控制很好。
    4).控制上比较简洁,功能比较丰富:比如使用“无敌功能”所有更改指向内存,你的镜像永远保持干净。“母镜像”功能让你拥有n个独立快照点。还有很多参数。另外,kvm作为内核级的虚拟机,刚开始发展关注的公司比较多——但是还没有达到商业应用的水平。

    总体而言:在支持虚拟化的情况下,vbox 和 kvm 的性能差不多,主要是面向对象不同:kvm适用于服务器,vbox适用于桌面应用。

    qemu 全称Quick Emulator。是独立虚拟软件,能独立运行虚拟机(根本不需要kvm)。kqemu是该软件的加速软件。kvm并不需要qemu进行虚拟处理,只是需要它的上层管理界面进行虚拟机控制。虚拟机依旧是由kvm驱动。所以,大家不要把概念弄错了,盲目的安装qemu和kqemu。qemu使用模拟器

    KVM内存管理
    KVM继承了Linux系统管理内存的诸多特性,比如,分配给虚拟使用的内存可以被交换至交换空间、能够使用大内存页以实现更好的性能,以及对NUMA的支持能够让虚拟机高效访问更大的内存空间等。
    KVM基于Intel的EPT(ExtendedPage Table)或AMD的RVI(Rapid Virtualization Indexing)技术可以支持更新的内存虚拟功能,这可以降低CPU的占用率,并提供较好的吞吐量。
    此外,KVM还借助于KSM(Kernel Same-pageMerging)这个内核特性实现了内存页面共享。KSM通过扫描每个虚拟机的内存查找各虚拟机间相同的内存页,并将这些内存页合并为一个被各相关虚拟机共享的单独页面。在某虚拟机试图修改此页面中的数据时,KSM会重新为其提供一个新的页面副本。实践中,运行于同一台物理主机上的具有相同GuestOS的虚拟机之间出现相同内存页面的概率是很的,比如共享库、内核或其它内存对象等都有可能表现为相同的内存页,因此,KSM技术可以降低内存占用进而提高整体性能。

    相关连接:
    KVM的官方地址:http://www.linux-kvm.org/page/Main_Page
    KVM的Howto文档:http://www.linux-kvm.org/page/HOWTO
    Kqemu源码地址:http://sourceforge.net/projects/kqemu/
    Qemu下载地址:http://wiki.qemu.org/Main_Page

    二.KVM虚拟化平台构建

    1.安装准备
    查看你的硬件是否支持虚拟化。命令:

    #egrep '(vmx|svm)' /proc/cpuinfo

    enter description here
     
    vmx.png

    注意:要有 vmx 或 svm 的标识才行。总的说来,AMD在虚拟化方面作得更好一些。

    2.安装KVM
    由于Linux内核已经将KVM收录了,在安装系统时已经加入了KVM,我们只需要在命令行模式下启用KVM即可:
    启用KVM模块

    modprobe kvm

    功能区分intel/amd的启用:

    1. modpobe kvm-intel 
    2. lsmod |grep kvm 
    3. kvm_intel 55496
    4. kvm 337772 1 kvm_intel 

    3.KVM虚拟机创建和管理所依赖的组件介绍
    KVM虚拟机的创建依赖qemu-kvm:
    虽然kvm的技术已经相当成熟而且可以对很多东西进行隔离,但是在某些方面还是无法虚拟出真实的机器。比如对网卡的虚拟,那这个时候就需要另外的技术来做补充,而qemu-kvm则是这样一种技术。它补充了kvm技术的不足,而且在性能上对kvm进行了优化。

    我们还可以使用virt-manager,virt-viewer来管理虚拟机;

    我们在创建和管理KVM虚拟机时还需要libvirt这个重要的组件:

    它是一系列提供出来的库函数,用以其他技术调用,来管理机器上的虚拟机。包括各种虚拟机技术,kvm、xen与lxc等,都可以调用libvirt提供的api对虚拟机进行管理。有这么多的虚拟机技术,它为何能提供这么多的管理功能那。是因为它的设计理念,它是面向驱动的架构设计。对任何一种虚拟机技术都开发设计相对于该技术的驱动。这样不同虚拟机技术就可以使用不同驱动,而且相互直接不会影响,方便扩展。而且libvirt提供了多种语言的编程接口,可以直接通过编程,调用libvirt提供的对外接口实现对虚拟机的操作。如今流行的云计算中的IaaS是与该库联系相当密切的。通过下图可以看出它的架构设计思想。

    enter description here
     
    kvm.jpg
    1. 从该图可以看出,在libvirtapi之上会有很多个driver,对于每一种虚拟机技术都会有一种driver,用来充当该虚拟机技术与libvirt之间的包装接口。如此设计就可以避免libvirt需要设计各种针对不同虚拟机技术的接口,它主要关注底层的实现,提供对外接口调用,而不同的虚拟机技术通过调用libvirt提供的接口来完成自己所需要的功能。 

    4.安装KVM所需组件

    yum源提供了,直接安装:

    1. yum install -y qemu-kvm libvirt virt-manager 

    安装完成后启动libvirtd服务:

    1. [root@luckyall network-scripts]# service libvirtd start 
    2. Starting libvirtd daemon: libvirtd: relocation error: libvirtd: symbol dm_task_get_info_with_deferred_remove, version Base not defined in file libdevmapper.so.1.02 with link time reference 
    3. [FAILED] 
    4. [root@luckyall network-scripts]# Starting libvirtd daemon: libvirtd: relocation error: libvirtd: symbol dm_task_get_info_with_deferred_remove, version Base not defined in file libdevmapper.so.1.02 with link time reference 

    既然有个报错。百度下发现需要升级下组件

    1. [root@luckyall network-scripts]# yum -y upgrade device-mapper-libs 

    然后重新启动libvirtd发现已经正常

    enter description here
     
    ifconfig.png

    使用网桥管理命令查看:

    1. [root@luckyall ~]# brctl show 
    2. bridge name bridge id STP enabled interfaces 
    3. virbr0 8000.5254008a9355 yes virbr0-nic 

    像VMware Workstation中我们需要创建物理桥接设备,可以使用virsh创建桥设备关联网卡到桥接设备上:
    需要将NetworkManager服务关闭,开机启动也关闭:

    1. chkconfig NetworkManager off 
    2. service NetworkManager stop 

    然后在创建桥接设备及关联网卡到桥接设备上:

    1. virsh iface-bridge eth0 br0 
    enter description here
     
    br0.png

    查看桥接设备:

    enter description here
     
    brctrshow.png

    至此,我们的虚拟化平台就构建完毕,下面就开始在KVM虚拟化平台上创建和管理虚拟机,我们先使用qemu-kvm来创建和管理虚拟机。

    三、使用qemu-kvm管理KVM虚拟机

    1.Qemu-kvm介绍
    Qemu是一个广泛使用的开源计算机仿真器和虚拟机。当作为仿真器时,可以在一种架构(如PC机)下运行另一种架构(如ARM)下的操作系统和程序。而通过动态转化,其可以获得很高的运行效率。当作为一个虚拟机时,qemu可以通过直接使用真机的系统资源,让虚拟系统能够获得接近于物理机的性能表现。qemu支持xen或者kvm模式下的虚拟化。当用kvm时,qemu可以虚拟x86、服务器和嵌入式powerpc,以及s390的系统。

    QEMU 当运行与主机架构相同的目标架构时可以使用KVM。例如,当在一个x86兼容处理器上运行 qemu-system-x86 时,可以利用 KVM 加速——为宿主机和客户机提供更好的性能。

    Qemu有如下几个部分组成:

    处理器模拟器(x86、PowerPC和Sparc);
    仿真设备(显卡、网卡、硬盘、鼠标等);
    用于将仿真设备连接至主机设备(真实设备)的通用设备;
    模拟机的描述信息;
    调试器;
    与模拟器交互的用户接口;

    基于libvirt的工具如virt-manager和virt-install提供了非常便捷的虚拟机管理接口,但它们事实上上经二次开发后又封装了qemu-kvm的工具。因此,直接使用qemu-kvm命令也能够完成此前的任务。

    2.Qemu-kvm的使用帮助

    在RHEL6/CentOS6上,qemu-kvm位于/usr/libexec目录中。由于此目录不属于PATH环境变量,故无法直接使用,这样也阻止了可以直接使用qemu作为创建并管理虚拟机。如若想使用qemu虚拟机,可以通过将/usr/libexec/qemu-kvm链接为/usr/bin/qemu实现。

    1. ln -sv /usr/libexec/qemu-kvm /usr/bin/qemu-kvm 

    qemu-kvm命令使用格式为“qemu-kvm [options] [disk_image]”,其选项非常多,不过,大致可分为如下几类。

    标准选项;
    USB选项;
    显示选项;
    i386平台专用选项;
    网络选项;
    字符设备选项;
    蓝牙相关选项;
    Linux系统引导专用选项;
    调试/专家模式选项;
    PowerPC专用选项;
    Sparc32专用选项;

    qemu-kvm的标准选项
    qemu-kvm的标准选项主要涉及指定主机类型、CPU模式、NUMA、软驱设备、光驱设备及硬件设备等。

    1. -name name:设定虚拟机名称; 
    2. -M machine:指定要模拟的主机类型,如Standard PC、ISA-only PC或Intel-Mac等,可以使用“qemu-kvm -M ?”获取所支持的所有类型; 
    3. -m megs:设定虚拟机的RAM大小; 
    4. -cpu model:设定CPU模型,如coreduo、qemu64等,可以使用“qemu-kvm -cpu ?”获取所支持的所有模型; 
    5. -smp n[,cores=cores][,threads=threads][,sockets=sockets][,maxcpus=maxcpus]:设定模拟的SMP架构中CPU的个数等、每个CPU的核心数及CPU的socket数目等;PC机上最多可以模拟255颗CPU;maxcpus用于指定热插入的CPU个数上限; 
    6. -numa opts:指定模拟多节点的numa设备; 
    7. -fda file 
    8. -fdb file:使用指定文件(file)作为软盘镜像,file为/dev/fd0表示使用物理软驱; 
    9. -hda file 
    10. -hdb file 
    11. -hdc file 
    12. -hdd file:使用指定file作为硬盘镜像; 
    13. -cdrom file:使用指定file作为CD-ROM镜像,需要注意的是-cdrom和-hdc不能同时使用;将file指定为/dev/cdrom可以直接使用物理光驱; 
    14. -drive option[,option[,option[,...]]]:定义一个硬盘设备;可用子选项有很多。 
    15. file=/path/to/somefile:硬件映像文件路径; 
    16. if=interface:指定硬盘设备所连接的接口类型,即控制器类型,如ide、scsi、sd、mtd、floppy、pflash及virtio等; 
    17. index=index:设定同一种控制器类型中不同设备的索引号,即标识号; 
    18. media=media:定义介质类型为硬盘(disk)还是光盘(cdrom); 
    19. snapshot=snapshot:指定当前硬盘设备是否支持快照功能:on或off; 
    20. cache=cache:定义如何使用物理机缓存来访问块数据,其可用值有none、writeback、unsafe和writethrough四个; 
    21. format=format:指定映像文件的格式,具体格式可参见qemu-img命令; 
    22. -boot [order=drives][,once=drives][,menu=on|off]:定义启动设备的引导次序,每种设备使用一个字符表示;不同的架构所支持的设备及其表示字符不尽相同,在x86 PC架构上,a、b表示软驱、c表示第一块硬盘,d表示第一个光驱设备,n-p表示网络适配器;默认为硬盘设备; 
    23. -boot order=dc,once=d 

    qemu-kvm的显示选项
    显示选项用于定义虚拟机启动后的显示接口相关类型及属性等。

    1. -nographic:默认情况下,qemu使用SDL来显示VGA输出;而此选项用于禁止图形接口,此时,qemu类似一个简单的命令行程序,其仿真串口设备将被重定向到控制台; 
    2. -curses:禁止图形接口,并使用curses/ncurses作为交互接口; 
    3. -alt-grab:使用Ctrl+Alt+Shift组合键释放鼠标; 
    4. -ctrl-grab:使用右Ctrl键释放鼠标; 
    5. -sdl:启用SDL; 
    6. -spice option[,option[,...]]:启用spice远程桌面协议;其有许多子选项,具体请参照qemu-kvm的手册; 
    7. -vga type:指定要仿真的VGA接口类型,常见类型有: 
    8. cirrus:Cirrus Logic GD5446显示卡; 
    9. std:带有Bochs VBI扩展的标准VGA显示卡; 
    10. vmware:VMWare SVGA-II兼容的显示适配器; 
    11. qxl:QXL半虚拟化显示卡;与VGA兼容;在Guest中安装qxl驱动后能以很好的方式工作,在使用spice协议时推荐使用此类型; 
    12. none:禁用VGA卡; 
    13. -vnc display[,option[,option[,...]]]:默认情况下,qemu使用SDL显示VGA输出;使用-vnc选项,可以让qemu监听在VNC上,并将VGA输出重定向至VNC会话;使用此选项时,必须使用-k选项指定键盘布局类型;其有许多子选项,具体请参照qemu-kvm的手册; 

    i386平台专用选项

    1. -no-acpi:禁用ACPI功能,GuestOS与ACPI出现兼容问题时使用此选项; 
    2. -balloon none:禁用balloon设备; 
    3. -balloon virtio[,addr=addr]:启用virtio balloon设备; 

    网络属性相关选项
    网络属性相关选项用于定义网络设备接口类型及其相关的各属性等信息。这里只介绍nic、tap和user三种类型网络接口的属性,其它类型请参照qemu-kvm手册。

    1. -net nic[,vlan=n][,macaddr=mac][,model=type][,name=name][,addr=addr][,vectors=v]:创建一个新的网卡设备并连接至vlan n中;PC架构上默认的NIC为e1000,macaddr用于为其指定MAC地址,name用于指定一个在监控时显示的网上设备名称;emu可以模拟多个类型的网卡设备,如virtio、i82551、i82557b、i82559er、ne2k_isa、pcnet、rtl8139、e1000、smc91c111、lance及mcf_fec等;不过,不同平台架构上,其支持的类型可能只包含前述列表的一部分,可以使用“qemu-kvm -net nic,model=?”来获取当前平台支持的类型; 
    2. -net tap[,vlan=n][,name=name][,fd=h][,ifname=name][,script=file][,downscript=dfile]:通过物理机的TAP网络接口连接至vlan n中,使用script=file指定的脚本(默认为/etc/qemu-ifup)来配置当前网络接口,并使用downscript=file指定的脚本(默认为/etc/qemu-ifdown)来撤消接口配置;使用script=no和downscript=no可分别用来禁止执行脚本; 
    3. -net user[,option][,option][,...]:在用户模式配置网络栈,其不依赖于管理权限;有效选项有: 
    4. vlan=n:连接至vlan n,默认n=0; 
    5. name=name:指定接口的显示名称,常用于监控模式中; 
    6. net=addr[/mask]:设定GuestOS可见的IP网络,掩码可选,默认为10.0.2.0/8; 
    7. host=addr:指定GuestOS中看到的物理机的IP地址,默认为指定网络中的第二个,即x.x.x.2; 
    8. dhcpstart=addr:指定DHCP服务地址池中16个地址的起始IP,默认为第16个至第31个,即x.x.x.16-x.x.x.31; 
    9. dns=addr:指定GuestOS可见的dns服务器地址;默认为GuestOS网络中的第三个地址,即x.x.x.3; 

    3.使用qemu-kvm安装虚拟机Guest OS

    测试安装windows 2003
    1)下载系统镜像文件,我这里有个windows 2003系统,我们来试着安装。
    创建虚拟机的磁盘文件存放目录:

    1. [root@luckyall ~]# mkdir /kvm/images -pv 
    2. mkdir: created directory `/kvm' 
    3. mkdir: created directory `/kvm/images' 

    创建虚拟磁盘文件:

    1. [root@luckyall images]# qemu-img create -o preallocation=metadata -f qcow2 /kvm/images/win2003.qcow2 10G 
    2. Formatting '/kvm/images/win2003.qcow2', fmt=qcow2 size=10737418240 encryption=off cluster_size=65536 preallocation='metadata'  
    3. [root@luckyall images]# ll -h /kvm/images/ 
    4. total 1.8M 
    5. -rw-r--r--. 1 root root 11G Dec 19 23:46 win2003.qcow2 

    2)在kvm平台安装vnc-server和tigervnc这个vncviewer

    此处不做介绍
    参考我的博客:http://blog.sina.com.cn/s/blog_6e470cb00102wazp.html

    1. [root@luckyall ~]# qemu-kvm -cpu host -smp 1 -name win2003 -m 512 -drive file=/kvm/images/win2003.qcow2,if=ide,format=qcow2 -drive file=/root/Downloads/win2003.iso,media=cdrom -boot dc -usbdevice tablet 
    2. VNC server running on `::1:5900' 

    我们到图形界面上进行连接:
    #vncviewer :5900

    enter description here
     
  • 相关阅读:
    【C#】枚举和字符串以及数字之间的互相转换
    MySQL中int(M)和tinyint(M)数值类型中M值的意义
    C# 将数组拼接为字符串 string.Join 的使用
    MySQL-locate()函数
    C# 4.0 dynamic用法,并且与 var, object的区别
    Go语言 go get 找不到 google.golang.org/protobuf/encoding/prototext 解决办法
    Go语言 中逗号ok模式
    MySQL数据库面试题(2020最新版)
    .Net Core 3.0开源可视化设计CMS内容管理系统建站系统
    SQL Server 全文搜索/全文索引
  • 原文地址:https://www.cnblogs.com/ronghui/p/9231478.html
Copyright © 2011-2022 走看看