一、云计算概述

   云计算主要是一种按需付费的网络模式,这种模式提供可用的、便捷的、按需的网络访问,进入可配置的计算资源共享池(资源包括网络,服务器,存储,应用软件,服务),这些资源能够被快速提供,只需投入很少的管理工作,或与服务供应商进行很少的交互。分为三大层:IaaS(基础设施即服务,面向运维人员)、PaaS(平台即服务,面向开发人员),SaaS(软件即服务,面向终端用户)。

   虚拟化分类:服务器虚拟化、桌面虚拟化、应用虚拟化,私有云

1.1 云计算的特点和优势

1)云计算是一种使用模式

2)云计算必须通过网络访问

3)弹性计算,按需付费

1.2 在云计算之前的模式或技术

1)IDC托管

2)IDC租用

3)虚拟主机(卖空间的)

4)vps:虚拟专有主机,openvz超卖很坑人的,xen不支持超卖

1.3 相对于云计算,传统数据中心面临的问题

1)资源利用率低(大部分机器cpu所占比率低于15%)

2)资源分配不合理

举例:由于某个活动,上线各种服务器,但是并未达到实际效果,导致服务器资源浪费

3)很难实现真正的运维自动化

1.4图解云计算的三层服务

基础设施:计算,存储,网络服务
平台服务:对象存储,身份认证,运行环境,消息队列,数据库服务
应用平台:监控,内容,合作,通信,财务

云计算概述与KVM_第1张图片

二、云计算与虚拟化

2.1 公有云、私有云和混合云

  • 公有云(Public Cloud
        通常指第三方提供商为用户提供的能够使用的云,公有云一般可通过 Internet 使用,可能是免费或成本低廉的,公有云的核心属性是共享资源服务。这种云有许多实例,可在当今整个开放的公有网络中提供服务。例如:aws,阿里云,×××,百度云,腾讯云。    
        优点:价格低廉,使用方便

  • 私有云(Private     Clouds)
        是为一个客户单独使用而构建的,因而提供对数据、安全性和服务质量的最有效控制。该公司拥有基础设施,并可以控制在此基础设施上部署应用程序的方式。私有云可部署在企业数据中心的防火墙内,也可以将它们部署在一个安全的主机托管场所,私有云的核心属性是专有资源。
        优点:可控,数据安全(银行必然使用私有云

  • 混合云(Hybrid Cloud
        混合云融合了公有云和私有云,是近年来云计算的主要模式和发展方向。我们已经知道私企业主要是面向企业用户,出于安全考虑,企业更愿意将数据存放在私有云中,但是同时又希望可以获得公有云的计算资源,在这种情况下混合云被越来越多的采用,它将公有云和私有云进行混合和匹配,以获得最佳的效果,这种个性化的解决方案,达到了既省钱又安全的目的,例如在一次活动中,只需要暂时几台机器,在私有云存在的情况,考虑混合云的使用,是最合理化的。
        优点:集合的使用方式更完美,可扩展,更节省

2.2云计算的层次

云计算概述与KVM_第2张图片

云计算概述与KVM_第3张图片

  • SaaS
        提供给客户的服务是运营商运行在云计算基础设施上的应用程序,用户可以在各种设备上通过客户端界面访问,如浏览器。消费者不需要管理或控制任何云计算基础设施,包括网络、服务器、操作系统、存储等等;平时使用的邮件服务器,即属于SaaS服务。

  • PaaS
        提供给消费者的服务是把客户采用提供的开发语言和工具(例如Javapython, .Net等)开发的或收购的应用程序部署到供应商的云计算基础设施上去。客户不需要管理或控制底层的云基础设施,包括网络、服务器、操作系统、存储等,但客户能控制部署的应用程序,也可能控制运行应用程序的托管环境配置;更适合提供给开发人员使用,在这里也可以使用docker容器技术实现

  • IaaS
        提供给消费者的服务是对所有计算基础设施的利用,包括处理CPU、内存、存储、网络和其它基本的计算资源,用户能够部署和运行任意软件,包括操作系统和应用程序。消费者不管理或控制任何云计算基础设施,但能控制操作系统的选择、存储空间、部署的应用,也有可能获得有限制的网络组件(例如路由器,防火墙、负载均衡器等)的控制。更适合提供给运维人员使用

2.3 虚拟化的优势

虚拟化可以虚拟出来多个操作系统:每个操作系统之间是相互独立的,所以每个操作系统上所跑的应用自然是相互不影响的。在这里用一个经典的例子说明,一台物理机跑8个tomcat和8个虚拟机上各跑一个tomcat,跑8个tomcat的物理机,如果其中一个tomcat出问题(内存有问题,jvm有问题等),势必会影响到其他7个tomcat,但是在8个虚拟机上跑分别各跑一个tomcat,他们之间是互不影响的,由于虚拟化一层原因占用了一些资源,效果并没有直接一台物理机跑8个tomcat效果好,但是虚拟机的互相独立互不影响是更重要的,而且便于管理,每个tomcat实例都会起3个端口(8080:对外服务端口,8009:AJP端口,8005:关闭端口),使用虚拟机之后,就不会担心多个tomcat端口冲突的情况。
支持异构:linux系统可以虚拟化windows系统,方便不同场景系统的使用
支持快照功能和克隆等功能:快照功能在某个物理机不知运行什么,是否正在运行的情况下,如果是一台虚拟机就好办了,直接停了该虚拟机,只不过是占了一些磁盘空间而已。

2.4 虚拟化和云计算的简单总结

虚拟化是一种技术,云计算是通过虚拟化技术实现的一种通过网络访问获取资源,流量,交付的使用模式,两者并不能相互比较,虚拟化相当于实干家,而云计算是思想家。

三、虚拟化的分类

3.1 全虚拟化与半虚拟化

  • 全虚拟化
        又叫硬件辅助虚拟化技术,最初所使用的虚拟化技术就是全虚拟化(Full Virtualization)技术,它在虚拟机(VM)和硬件之间加了一个软件层–Hypervisor,或者叫做虚拟机管理程序(VMM)。hypervisor 可以划分为两大类。首先是类型 1,这种 hypervisor 是直接运行在物理硬件之上的。其次是类型 2,这种 hypervisor 运行在另一个操作系统(运行在物理硬件之上)中。类型 1 hypervisor 的一个例子是基于内核的虚拟机(KVM     —— 它本身是一个基于操作系统的 hypervisor)。类型 2 hypervisor     包括 QEMU WINE。因为运行在虚拟机上的操作系统通过Hypervisor来最终分享硬件,所以虚拟机发出的指令需经过Hypervisor捕获并处理。为此每个客户操作系统(Guest OS)所发出的指令都要被翻译成CPU能识别的指令格式,这里的客户操作系统即是运行的虚拟机,所以Hypervisor的工作负荷会很大,因此会占用一定的资源,所以在性能方面不如裸机。但是运行速度要快于硬件模拟。全虚拟化最大的优点就是运行在虚拟机上的操作系统没有经过任何修改,唯一的限制就是操作系统必须能够支持底层的硬件,不过目前的操作系统一般都能支持底层硬件,所以这个限制就变得微不足道了。

 

  • 半虚拟化
        半虚拟化技术是后来才出现的技术,半虚拟化技术英文是paravirtualization,也叫做准虚拟化技术,现在比较热门,它就是在全虚拟化的基础上,把客户操作系统进行了修改,增加了一个专门的API,这个API可以将客户操作系统发出的指令进行最优化,即不需要Hypervisor耗费一定的资源进行翻译操作,因此Hypervisor的工作负担变得非常的小,因此整体的性能也有很大的提高。不过缺点就是,要修改包含该API的操作系统,但是对于某些不含该API的操作系统(主要是windows)来说,就不行能用这种方法,Xen就是一个典型的半虚拟化的技术。

3.2服务器虚拟化,桌面虚拟化,应用虚拟化

  • 服务器虚拟化
        数量少的情况推荐使用ESXIXenServer
        数量大的情况推荐使用KVMRHEV(并不开源),oVirtOpenstackVmvare vshpere

  • 桌面虚拟化
        桌面虚拟化依赖于服务器虚拟化,在数据中心的服务器上进行服务器虚拟化,生成大量的独立的桌面操作系统(虚拟机或者虚拟桌面),同时根据专有的虚拟桌面协议发送给终端设备。用户终端通过以太网登陆到虚拟主机上,只需要记住用户名和密码及网关信息,即可随时随地的通过网络访问自己的桌面系统,从而实现单机多用户。多用于IP外包,呼叫中心,银行办公、移动桌面。

  • 应用虚拟化
        技术原理是基于应用/服务器计算A/S架构,采用类似虚拟终端的技术,把应用程序的人机交互逻辑(应用程序界面、键盘及鼠标的操作、音频输入输出、读卡器、打印输出等)与计算逻辑隔离开来。在用户访问一个服务器虚拟化后的应用时,用户计算机只需要把人机交互逻辑传送到服务器端,服务器端为用户开设独立的会话空间,应用程序的计算逻辑在这个会话空间中运行,把变化后的人机交互逻辑传送给客户端,并且在客户端相应设备展示出来,从而使用户获得如同运行本地应用程序一样的访问感受。
        3)硬件虚拟化和软件虚拟化
        参考:
        http://virtualization.ctocio.com.cn/38/11466538.shtm

四、虚拟化之KVM

4.1kvm的虚拟化特性

1)嵌入到linxu正式kernel(提高了兼容性)
2)代码级资源调用(提高性能)
3)虚拟机就是一个进程(内存易于管理)
4)直接支持NUMA技术(提高扩展性)
5)虽然被Redhat收购了,但是依然保持着开源发展模式,社区活跃
6)更好的商业支持及服务保障
7)Centos7较Centos6默认支持cpu热添加,内存的热添加,大页内存默认都是开启的

4.2 支持虚拟化的条件

inter的cpu:vmx
AMD的cpu:svm
本文使用的是vmvare,需要开启如下两个条件即可,如果是物理机,需要在bios里面设置,默认都是开启状态。

cpuinfo中可以查看具体的支持虚拟化的信息

[root@localhost ~]# grep -E"svm|vmx" /proc/cpuinfo

flags           : fpu vme de pse tsc msr pae mce cx8apic sep mtrr pge mca cmov pat pse36 clflush dts mmx fxsr sse sse2 ss syscallnx rdtscp lm constant_tsc arch_perfmon pebs bts nopl xtopology tsc_reliablenonstop_tsc aperfmperf pni pclmulqdq vmx ssse3 cx16 pcid sse4_1 sse4_2 x2apicpopcnt tsc_deadline_timer xsave avx hypervisor lahf_lm arat epb pln pts dthermtpr_shadow vnmi ept vpid tsc_adjust

4.3 kvm安装实战

安装kvm

[root@localhost~]# yum install qemu-kvm qemu-kvm-tools virt-manager libvirt virt-install –y

kvm: linux内核的一个模块,模块不需要安装,只需要加载
qemu:虚拟化软件,可以虚拟不同的CPU,支持异构(x86的架构可以虚拟化出不是x86架构的)
qemu-kvm:用户态管理kvm,网卡,声卡,PCI设备等都是qemu来管理的

创建一个虚拟磁盘,-f 指定格式,路径是/opt/CentOS-7.1-x86_64.raw,大小为10G

[root@localhost ~]# qemu-

qemu-img qemu-io   qemu-nbd

[root@localhost ~]# qemu-img create -f raw/opt/CentOS-7-x86_64-Minimal-1511.raw 10G

Formatting'/opt/CentOS-7-x86_64-Minimal-1511.raw', fmt=raw size=10737418240

显示内核中kvm的状态

[root@localhost ~]# lsmod|grep kvm

kvm_intel             162153  0

kvm                   525259  1 kvm_intel

 

启动libvirt,查看状态,关键字:active

[root@localhost ~]# systemctl enablelibvirtd.service

[root@localhost ~]# systemctl startlibvirtd.service

[root@localhost ~]# systemctl statuslibvirtd.service

libvirtd.service - Virtualization daemon

  Loaded: loaded (/usr/lib/systemd/system/libvirtd.service; enabled;vendor preset: enabled)

  Active: active (running) since Sat 2016-11-19 07:39:58 CST; 4s ago

    Docs: man:libvirtd(8)

          http://libvirt.org

 MainPID: 3051 (libvirtd)

  CGroup: /system.slice/libvirtd.service

          ├─3051 /usr/sbin/libvirtd

          ├─3152 /sbin/dnsmasq --conf-file=/var/lib/libvirt/dnsmasq/default....

          └─3154 /sbin/dnsmasq --conf-file=/var/lib/libvirt/dnsmasq/default....

 

Nov 19 07:39:58 localhost.localdomainsystemd[1]: Started Virtualization daemon.

Nov 19 07:40:00 localhost.localdomaindnsmasq[3152]: started, version 2.66 ca...

Nov 19 07:40:00 localhost.localdomaindnsmasq[3152]: compile time options: IP...

Nov 19 07:40:00 localhost.localdomaindnsmasq-dhcp[3152]: DHCP, IP range 192....

Nov 19 07:40:00 localhost.localdomain dnsmasq[3152]:reading /etc/resolv.conf

Nov 19 07:40:00 localhost.localdomaindnsmasq[3152]: using nameserver 61.178....

Nov 19 07:40:00 localhost.localdomaindnsmasq[3152]: using nameserver 202.100...

Nov 19 07:40:00 localhost.localdomaindnsmasq[3152]: read /etc/hosts - 2 addr...

Nov 19 07:40:00 localhost.localdomaindnsmasq[3152]: read /var/lib/libvirt/dn...

Nov 19 07:40:00 localhost.localdomaindnsmasq-dhcp[3152]: read /var/lib/libvi...

Hint: Some lines were ellipsized, use -l toshow in full.

 

4.4 开始装一台虚拟机

vmvare上挂载一个镜像

云计算概述与KVM_第4张图片

导入到宿主机中,当然时间可能较长

[root@localhost ~]# dd if=/dev/cdromof=/opt/CentOS-7-x86_64-Minimal-1511.iso

1234944+0 records in

1234944+0 records out

632291328 bytes (632 MB) copied, 39.0131 s,16.2 MB/s

[root@localhost ~]# ls /opt/

CentOS-7-x86_64-Minimal-1511.iso  CentOS-7-x86_64-Minimal-1511.raw

  • 使用命令创建一台虚拟机    
        首先学virt-install命令,在这里使用- -help查看,并且只学习重要的,其他的稍后会有提供
        virt-install –help
        -n(Name):指定虚拟机的名称
        –memory(–raw):指定内存大小
        –cpu:指定cpu的核数(默认为1)
        –cdrom:指定镜像
        –disk:指定磁盘路径(即上文创建的虚拟磁盘)
        –virt-type:指定虚拟机类型(kvm,qemu,xen)
        –network:指定网络类型

  • 执行创建虚拟机命令

[root@localhost ~]# virt-install --help

usage:virt-install --name NAME --ram RAM STORAGE INSTALL [options]

Createa new virtual machine from specified install media.

optionalarguments:

  -h, --help            show this help message and exit

  --version             show program's version number andexit

  --connect URI         Connect to hypervisor with libvirt URI

GeneralOptions:

  -n NAME, --name NAME  Name of the guest instance

  --memory MEMORY       Configure guest memory allocation. Ex:

                        --memory 1024 (in MiB)

                        --memory512,maxmemory=1024

  --vcpus VCPUS         Number of vcpus to configure for yourguest. Ex:

                        --vcpus 5

                        --vcpus5,maxcpus=10,cpuset=1-4,6,8

                        --vcpussockets=2,cores=4,threads=2,

  --cpu CPU             CPU model and features. Ex:

                        --cpu coreduo,+x2apic

                        --cpu host

  --metadata METADATA   Configure guest metadata. Ex:

                        --metadataname=foo,title="My pretty title",uuid=...

                        --metadatadescription="My nice long description"

 

InstallationMethod Options:

  --cdrom CDROM         CD-ROM installation media

  -l LOCATION, --location LOCATION

                        Installation source(eg, nfs:host:/path,

                        http://host/path,ftp://host/path)

  --pxe                 Boot from the network usingthe PXE protocol

  --import              Build guest around an existingdisk p_w_picpath

  --livecd              Treat the CD-ROM media as a LiveCD

  -x EXTRA_ARGS, --extra-args EXTRA_ARGS

                        Additional arguments topass to the install kernel

                        booted from --location

  --initrd-inject INITRD_INJECT

                        Add given file to rootof initrd from --location

  --os-variant DISTRO_VARIANT

                        The OS variant beinginstalled guests, e.g.

                        'fedora18', 'rhel6','winxp', etc.

  --boot BOOT           Configure guest boot settings. Ex:

                        --boot hd,cdrom,menu=on

                        --boot init=/sbin/init(for containers)

  --idmap IDMAP         Enable user namespace for LXCcontainer. Ex:

                        --idmapuid_start=0,uid_target=1000,uid_count=10

 

DeviceOptions:

  --disk DISK           Specify storage with variousoptions. Ex.

                        --disk size=10 (new10GiB p_w_picpath in default location)

                        --disk/my/existing/disk,cache=none

                        --diskdevice=cdrom,bus=scsi

                        --disk=?

  -w NETWORK, --network NETWORK

                        Configure a guestnetwork interface. Ex:

                        --network bridge=mybr0

                        --networknetwork=my_libvirt_virtual_net

                        --networknetwork=mynet,model=virtio,mac=00:11...

                        --network none

                        --network help

  --graphics GRAPHICS   Configure guest display settings. Ex:

                        --graphics vnc

                        --graphicsspice,port=5901,tlsport=5902

                        --graphics none

                        --graphicsvnc,password=foobar,port=5910,keymap=ja

  --controller CONTROLLER

                        Configure a guestcontroller device. Ex:

                        --controllertype=usb,model=ich9-ehci1

  --input INPUT         Configure a guest input device. Ex:

                        --input tablet

                        --inputkeyboard,bus=usb

  --serial SERIAL       Configure a guest serial device

  --parallel PARALLEL   Configure a guest parallel device

  --channel CHANNEL     Configure a guest communication channel

  --console CONSOLE     Configure a text console connectionbetween the guest

                        and host

  --hostdev HOSTDEV     Configure physical USB/PCI/etc hostdevices to be

                        shared with the guest

  --filesystem FILESYSTEM

                        Pass host directory tothe guest. Ex:

                        --filesystem/my/source/dir,/dir/in/guest

                        --filesystemtemplate_name,/,type=template

  --sound [SOUND]       Configure guest sound device emulation

  --watchdog WATCHDOG   Configure a guest watchdog device

  --video VIDEO         Configure guest video hardware.

  --smartcard SMARTCARD

                        Configure a guestsmartcard device. Ex:

                        --smartcardmode=passthrough

  --redirdev REDIRDEV   Configure a guest redirection device. Ex:

                        --redirdevusb,type=tcp,server=192.168.1.1:4000

  --memballoon MEMBALLOON

                        Configure a guestmemballoon device. Ex:

                        --memballoonmodel=virtio

  --tpm TPM             Configure a guest TPM device. Ex:

                        --tpm /dev/tpm

  --rng RNG             Configure a guest RNG device. Ex:

                        --rng /dev/random

  --panic PANIC         Configure a guest panic device. Ex:

                        --panic default

 

GuestConfiguration Options:

  --security SECURITY   Set domain security driver configuration.

  --numatune NUMATUNE   Tune NUMA policy for the domain process.

  --memtune MEMTUNE     Tune memory policy for the domain process.

  --blkiotune BLKIOTUNE

                        Tune blkio policy forthe domain process.

  --memorybacking MEMORYBACKING

                        Set memory backing policyfor the domain process. Ex:

                        --memorybackinghugepages=on

  --features FEATURES   Set domain XML. Ex:

                        --features acpi=off

                        --featuresapic=on,eoi=on

  --clock CLOCK         Set domain XML. Ex:

                        --clockoffset=localtime,rtc_tickpolicy=catchup

  --pm PM               Configure VM power managementfeatures

  --events EVENTS       Configure VM lifecycle management policy

  --resource RESOURCE   Configure VM resource partitioning (cgroups)

 

VirtualizationPlatform Options:

  -v, --hvm             This guest should be a fullyvirtualized guest

  -p, --paravirt        This guest should be a paravirtualizedguest

  --container           This guest should be a containerguest

  --virt-type HV_TYPE   Hypervisor name to use (kvm, qemu, xen, ...)

  --arch ARCH           The CPU architecture to simulate

  --machine MACHINE     The machine type to emulate

 

MiscellaneousOptions:

  --autostart           Have domain autostart on host bootup.

  --wait WAIT           Minutes to wait for install tocomplete.

  --noautoconsole       Don't automatically try to connect tothe guest

                        console

  --noreboot            Don't boot guest after completinginstall.

  --print-xml [XMLONLY]

                        Print the generateddomain XML rather than create the

                        guest.

  --dry-run             Run through install process, butdo not create devices

                        or define the guest.

  --check CHECK         Enable or disable validation checks.Example:

                        --check path_in_use=off

                        --check all=off

  -q, --quiet           Suppress non-error output

[root@localhost ~]# virt

virt-clone          virtlockd           virt-what

virt-host-validate  virt-manager        virt-xml

virt-install        virt-pki-validate   virt-xml-validate

[root@localhost ~]# virt-install --nameCentOS-7-x86_64-Minimal-1511 --virt-type kvm --ram 1024--cdrom=/opt/CentOS-7-x86_64-Minimal-1511.iso --diskpath=/opt/CentOS-7-x86_64-Minimal-1511.raw --network network=default --graphicsvnc,listen=0.0.0.0 --noautoconsole

 

Starting install...

Creating domain...                                       |   0 B     00:01    

Domain installation still in progress. Youcan reconnect to

the console to complete the installationprocess.

4.5 虚拟机基本操作学习

生成kvm虚拟机:virt-install
查看在运行的虚拟机:virsh list
查看所有虚拟机:virsh list –all
查看kvm虚拟机配置文件:virsh dumpxml name
启动kvm虚拟机:virsh start name
正常关机:virsh shutdown name
非正常关机(相当于物理机直接拔掉电源):virsh destroy name
删除:virsh undefine name(彻底删除,找不回来了,如果想找回来,需要备份/etc/libvirt/qemu的xml文件)
根据配置文件定义虚拟机:virsh define file-name.xml
挂起,终止:virsh suspend name
恢复挂起状态:virsh resumed name

启动刚才创建的虚拟机

[root@localhost ~]# virsh startCentOS-7-x86_64-Minimal-1511

[root@localhost ~]# ps -ef|grep kvm  //kvm就是一个进程

root        686     2  0 19:50 ?        00:00:00 [kvm-irqfd-clean]

qemu       2353     1 91 19:55 ?        00:24:08/usr/libexec/qemu-kvm -name CentOS-7-x86_64-Minimal-1511 -S -machinepc-i440fx-rhel7.0.0,accel=kvm,usb=off -cpu Nehalem -m 1024 -realtime mlock=off-smp 1,sockets=1,cores=1,threads=1 -uuid cf30a98a-143c-4bca-bf61-f27b8799061b-no-user-config -nodefaults -chardevsocket,id=charmonitor,path=/var/lib/libvirt/qemu/domain-CentOS-7-x86_64-Minimal-1511/monitor.sock,server,nowait-mon chardev=charmonitor,id=monitor,mode=control -rtc base=utc,driftfix=slew-global kvm-pit.lost_tick_policy=discard -no-hpet -no-reboot -globalPIIX4_PM.disable_s3=1 -global PIIX4_PM.disable_s4=1 -boot strict=on -deviceich9-usb-ehci1,id=usb,bus=pci.0,addr=0x5.0x7 -deviceich9-usb-uhci1,masterbus=usb.0,firstport=0,bus=pci.0,multifunction=on,addr=0x5-device ich9-usb-uhci2,masterbus=usb.0,firstport=2,bus=pci.0,addr=0x5.0x1-device ich9-usb-uhci3,masterbus=usb.0,firstport=4,bus=pci.0,addr=0x5.0x2-device virtio-serial-pci,id=virtio-serial0,bus=pci.0,addr=0x4 -drivefile=/opt/CentOS-7-x86_64-Minimal-1511.raw,if=none,id=drive-virtio-disk0,format=raw-devicevirtio-blk-pci,scsi=off,bus=pci.0,addr=0x6,drive=drive-virtio-disk0,id=virtio-disk0,bootindex=2-drivefile=/opt/CentOS-7-x86_64-Minimal-1511.iso,if=none,id=drive-ide0-0-0,readonly=on,format=raw-device ide-cd,bus=ide.0,unit=0,drive=drive-ide0-0-0,id=ide0-0-0,bootindex=1-netdev tap,fd=23,id=hostnet0,vhost=on,vhostfd=24 -devicevirtio-net-pci,netdev=hostnet0,id=net0,mac=52:54:00:f0:c7:f8,bus=pci.0,addr=0x3-chardev pty,id=charserial0 -device isa-serial,chardev=charserial0,id=serial0-chardevsocket,id=charchannel0,path=/var/lib/libvirt/qemu/channel/target/domain-CentOS-7-x86_64-Minimal-1511/org.qemu.guest_agent.0,server,nowait-devicevirtserialport,bus=virtio-serial0.0,nr=1,chardev=charchannel0,id=channel0,name=org.qemu.guest_agent.0-device usb-tablet,id=input0 -vnc 0.0.0.0:0 -vga cirrus -devicevirtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x7 -msg timestamp=on

root       2411     2  0 19:55 ?        00:00:00 [kvm-pit/2353]

root       2782  2265  0 20:21 pts/0    00:00:00 grep --color=auto kvm

4.6 编辑kvm的xml文件,更改虚拟机CPU配置

  • 配置虚拟机的cpu,两种方式(启动的时候指定核数,更改xml

  • 第一种方法:为了实现cpu的热添加,就需要更改cpu的最大值,当然热添加的个数不能超过最大值

[root@localhost ~]# ll /etc/libvirt/qemu

total 8

-rw-------. 1 root root 3938 Nov 19 19:55CentOS-7-x86_64-Minimal-1511.xml  //kvm虚拟机配置文件

drwx------. 3 root root 4096 Nov 19 07:39networks

[root@localhost ~]# virsh edit CentOS-7-x86_64-Minimal-1511

 当前为1,自动扩容,最大为4

  • 重启虚拟机

[root@localhost ~]# virsh shutdown CentOS-7-x86_64-Minimal-1511

DomainCentOS-7-x86_64-Minimal-1511 is being shutdown

[root@localhost ~]# virsh start CentOS-7-x86_64-Minimal-1511

DomainCentOS-7-x86_64-Minimal-1511 started
  • 登录虚拟机上,查看cpu信息,确认cpu的个数,下面开始进行cpu热添加
    云计算概述与KVM_第5张图片 

  • cpu的热添加(cpu只支持热添加,不支持热减少)

[root@localhost ~]# virsh setvcpus CentOS-7-x86_64-Minimal-1511 2 --live

再到虚拟机中查看cpu信息
云计算概述与KVM_第6张图片

  • kvm版本较高,并不需要echo “1”到/sys/devices/system/cpu/cpu1/online 进行激活,自动可以激活。

[root@chuck ~]# cat/sys/devices/system/cpu/cpu1/online

1

  • 第二种方法:安装的时候指定
        virt-install –vcpus 5 –vcpus 5,maxcpus=10,cpuset=1-4,6,8 –vcpus     sockets=2,cores=4,thread=2

4.7 编辑kvm的xml文件,更改虚拟机内存配置

  • 内存的设置拥有一个气球(balloon)机制,可以增大减少,但是也要设置一个最大值,默认并没有设置最大值,也可以在安装的时候指定,这里不再重复此方法

[root@localhost ~]# virsh edit CentOS-7-x86_64-Minimal-1511

4194304  //把最大内存改为4G

1048576  //当前内存为1G

重启虚拟机并查看当前状态的内存使用情况

[root@localhost ~]# virsh qemu-monitor-command CentOS-7-x86_64-Minimal-1511--hmp --cmd info balloon

balloon: actual=1024

 

对内存进行热添加并查看

[root@localhost ~]# virsh qemu-monitor-commandCentOS-7-x86_64-Minimal-1511 --hmp --cmd balloon 2000

[root@localhost ~]# virsh qemu-monitor-commandCentOS-7-x86_64-Minimal-1511 --hmp --cmd info balloon

balloon: actual=2260

 

更改虚拟机中存储,硬盘设置(不建议在生产环境使用硬盘的扩大收缩模式,很容易产生故障)

[root@localhost ~]# qemu-img --help |grep -i "formats:"

Supported formats: vvfat vpc vmdk vhdx vdi ssh sheepdog rbd rawhost_cdrom host_floppy host_device file qed qcow2 qcow parallels nbd iscsigluster dmg tftp ftps ftp https http cloop bochs blkverify blkdebug

  • 从结果看出,kvm支持很多种硬盘格式
        硬盘格式总体上分为两种:1为全镜像格式,2为稀疏格式
        全镜像格式(典型代表raw格式),其特点:设置多大就是多大,写入速度快,方便的转换为其他格式,性能最优,但是占用空间大
        稀疏模式(典型代表qcow2格式),其特点:支持压缩,快照,镜像,更小的存储空间(即用多少占多少)
        硬盘格式都可以通过qemu-img管理,详情qemu-img     –help

4.8 编辑kvm的xml文件,更改虚拟机网桥连接配置

  • 默认情况是NAT情况,但是在生产情况,使用更多的是桥接模式,更改虚拟机为网桥模式,原理图如下,网桥的基本原理就是创建一个桥接接口br0,在物理网卡和虚拟网络接口之间传递数据

云计算概述与KVM_第7张图片

  修改eth0(这里Centos7的eth0在装机的时候就指定,不需要特意指定了)

·  添加一个网桥并查看

[root@localhost ~]# brctl show //查看网桥            

bridge name     bridge id               STP enabled     interfaces

virbr0         8000.5254007c0675       yes             virbr0-nic

                                                       vnet0

[root@localhost ~]# brctl addbr br0 //添加网桥

[root@localhost ~]# brctl show

bridge name     bridge id               STP enabled     interfaces

br0            8000.000000000000       no

virbr0         8000.5254007c0675       yes             virbr0-nic

                                                       vnet0

eth0加入网桥,使用桥接模式,给br设置ip,添加路由网关,关闭防火墙

[root@localhost ~]# ifconfig

eth0:flags=4163  mtu 1500

       inet 192.168.8.113  netmask255.255.255.0  broadcast 192.168.8.255

       inet6 fe80::20c:29ff:fe3f:2a6d prefixlen 64  scopeid0x20

       ether 00:0c:29:3f:2a:6d txqueuelen 1000  (Ethernet)

       RX packets 25918  bytes 2063267(1.9 MiB)

       RX errors 0  dropped 0  overruns 0 frame 0

       TX packets 33036  bytes 5049008(4.8 MiB)

       TX errors 0  dropped 0 overruns0  carrier 0  collisions 0

lo: flags=73  mtu 65536

       inet 127.0.0.1  netmask 255.0.0.0

       inet6 ::1  prefixlen 128  scopeid 0x10

       loop  txqueuelen 0  (Local Loopback)

       RX packets 0  bytes 0 (0.0 B)

       RX errors 0  dropped 0  overruns 0 frame 0

       TX packets 0  bytes 0 (0.0 B)

       TX errors 0  dropped 0 overruns0  carrier 0  collisions 0

virbr0:flags=4163  mtu 1500

       inet 192.168.122.1  netmask255.255.255.0  broadcast 192.168.122.255

       ether 52:54:00:7c:06:75 txqueuelen 0  (Ethernet)

       RX packets 28  bytes 1204 (1.1KiB)

       RX errors 0  dropped 0  overruns 0 frame 0

       TX packets 0  bytes 0 (0.0 B)

       TX errors 0  dropped 0 overruns0  carrier 0  collisions 0

vnet0:flags=4163  mtu 1500

       inet6 fe80::fc54:ff:fef0:c7f8 prefixlen 64  scopeid0x20

       ether fe:54:00:f0:c7:f8 txqueuelen 500  (Ethernet)

       RX packets 28  bytes 1596 (1.5KiB)

       RX errors 0  dropped 0  overruns 0 frame 0

       TX packets 1132  bytes 59096 (57.7KiB)

       TX errors 0  dropped 0 overruns0  carrier 0  collisions 0

[root@localhost ~]# brctl addif bro eth0  //eth0加入网桥,注意!此时网络会断掉

[root@localhost ~]# brctl addif br0 eth0 && ip addr del deveth0 192.168.8.113/24 && ifconfig br0 192.168.8.113/24 up &&route add default gw 192.168.8.2 && iptables –F  //用此命令网络不会终断

 

编辑虚拟机的网络配置使用br0网桥模式

[root@localhost ~]# virsh edit CentOS-7.1-x86_64

 

 

  • 重启虚拟机,网桥模式生效,此时使用crt便可以链接到所创建的虚拟机了,在vmvare机器上使用ifconfig查看详情

[root@localhost ~]# ifconfig

br0:flags=4163  mtu 1500

       inet 192.168.8.113  netmask255.255.255.0  broadcast 192.168.8.255

       inet6 fe80::20c:29ff:fe3f:2a6d prefixlen 64  scopeid0x20

       ether 00:0c:29:3f:2a:6d txqueuelen 0  (Ethernet)

       RX packets 44  bytes 5895 (5.7KiB)

       RX errors 0  dropped 0  overruns 0 frame 0

       TX packets 47  bytes 5434 (5.3KiB)

       TX errors 0  dropped 0 overruns0  carrier 0  collisions 0

eth0:flags=4163  mtu 1500

       inet6 fe80::20c:29ff:fe3f:2a6d prefixlen 64  scopeid0x20

       ether 00:0c:29:3f:2a:6d txqueuelen 1000  (Ethernet)

       RX packets 26325  bytes 2108762(2.0 MiB)

        RX errors 0 dropped 0  overruns 0  frame 0

       TX packets 33358  bytes 5095692(4.8 MiB)

       TX errors 0  dropped 0 overruns0  carrier 0  collisions 0

lo: flags=73  mtu 65536

       inet 127.0.0.1  netmask 255.0.0.0

        inet6 ::1 prefixlen 128  scopeid0x10

       loop  txqueuelen 0  (Local Loopback)

       RX packets 8  bytes 800 (800.0 B)

       RX errors 0  dropped 0  overruns 0 frame 0

       TX packets 8  bytes 800 (800.0 B)

       TX errors 0  dropped 0 overruns0  carrier 0  collisions 0

virbr0:flags=4163  mtu 1500

       inet 192.168.122.1  netmask255.255.255.0  broadcast 192.168.122.255

       ether 52:54:00:7c:06:75 txqueuelen 0  (Ethernet)

       RX packets 28  bytes 1204 (1.1KiB)

       RX errors 0  dropped 0  overruns 0 frame 0

       TX packets 0  bytes 0 (0.0 B)

       TX errors 0  dropped 0 overruns0  carrier 0  collisions 0

vnet0:flags=4163  mtu 1500

       inet6 fe80::fc54:ff:fef0:c7f8 prefixlen 64  scopeid0x20

       ether fe:54:00:f0:c7:f8 txqueuelen 500  (Ethernet)

       RX packets 28  bytes 1596 (1.5KiB)

       RX errors 0  dropped 0  overruns 0 frame 0

       TX packets 1248  bytes 65128 (63.6KiB)

       TX errors 0  dropped 0 overruns0  carrier 0  collisions 0

删除虚拟机,删除前先关闭虚拟机,不要轻易的删除,因为删除后无法恢复

[root@localhost ~]# virsh undefine CentOS-7-x86_64-Minimal-1511 //彻底删除虚拟机

如果想删除后,再恢复所删除的虚拟机,在删除前可以先备份虚拟机的.xml文件,然后再通过.xml文件重建虚拟机就可以。

导出虚拟机(.xml)

[root@localhost ~]# virsh--help|grep dump

   dump                          dump the core of a domain to a file for analysis

   dumpxml                       domain information in XML

   save-p_w_picpath-dumpxml            saved state domain information in XML

   iface-dumpxml                 interface information in XML

   nwfilter-dumpxml              network filter information in XML

   net-dumpxml                   network information in XML

   nodedev-dumpxml               node device details in XML

   secret-dumpxml                secret attributes in XML

   snapshot-dumpxml              Dump XML for a domain snapshot

   pool-dumpxml                  pool information in XML

   vol-dumpxml                    volinformation in XML

关闭虚拟机: //也可以用kill -9来关闭(相当于拔掉电源)

[root@localhost ~]# virsh --help|grepdestroy

   destroy                       destroy (stop) a domain

   iface-destroy                 destroy a physical host interface (disable it / "if-down")

   net-destroy                    destroy (stop) a network

   nodedev-destroy               destroy (stop) a device on the node

   pool-destroy                  destroy (stop) a pool

 

五、KVM的优化

5.1 cpu的优化

  • intercpu的运行级别,按权限级别高低Ring3->Ring2->Ring1->Ring0,Ring2Ring1暂时没什么卵用)Ring3为用户态,Ring0为内核态

云计算概述与KVM_第8张图片

·  Ring3的用户态是没有权限管理硬件的,需要切换到内核态Ring0,这样的切换(系统调用)称之为上下文切换,物理机到虚拟机多次的上下文切换,势必会导致性能出现问题。对于全虚拟化,inter实现了技术VT-x,在cpu硬件上实现了加速转换,CentOS7默认是不需要开启的。

·  cpu的缓存绑定cpu的优化

[root@localhost ~]# lscpu|grep cache

L1d cache:             32K

L1i cache:             32K

L2 cache:              256K

L3 cache:              3072K

L1 L2 L3 三级缓存和CPU绑定
L1是静态缓存,造价高,L2L3是动态缓存,通过脉冲的方式写入01,造价较低。cache解决了cpu处理快,内存处理慢的问题,类似于memcaced和数据库。如果cpu调度器把进程随便调度到其他cpu上,而不是当前L1L2,L3的缓存cpu上,缓存就不生效了,就会产生miss,为了减少cache miss,需要把KVM进程绑定到固定的cpu上,可以使用taskset把某一个进程绑定(cpu亲和力绑定,可以提高20%的性能)在某一个cpu上,例如:taskset -cp 1 257181指的是cpu1,也可以绑定到多个cpu上,25718是指的pid.
cpu绑定的优点:提高性能,20%以上
cpu绑定的缺点:不方便迁移,灵活性差

5.2内存的优化

  • 内存寻址:宿主机虚拟内存     -> 宿主机物理内存
        虚拟机的虚拟内存 -> 虚拟机的物理内存
        以前VMM通过采用影子列表解决内存转换的问题,影子页表是一种比较成熟的纯软件的内存虚拟化方式,但影子页表固有的局限性,影响了VMM的性能,例如,客户机中有多个CPU,多个虚拟CPU之间同步页面数据将导致影子页表更新次数幅度增加,测试页表将带来异常严重的性能损失。如下图为影子页表的原理图

云计算概述与KVM_第9张图片

在此之际,Inter在最新的Core I7系列处理器上集成了EPT技术(对应AMD的为RVI技术),以硬件辅助的方式完成客户物理内存到机器物理内存的转换,完成内存虚拟化,并以有效的方式弥补了影子页表的缺陷,该技术默认是开启的,如下图为EPT技术的原理

云计算概述与KVM_第10张图片

KSM内存合并
宿主机上默认会开启ksmd进程,该进程作为内核中的守护进程存在,它定期执行页面扫描,识别副本页面并合并副本,释放这些页面以供它用,CentOS7默认是开启的

[root@localhost ~]# ps aux|grep ksmd|grep -vgrep

root       297  0.0  0.0     0     0 ?        SN  21:45   0:00 [ksmd]

大页内存,CentOS7默认开启的

[root@localhost ~]# cat/sys/kernel/mm/transparent_hugepage/enabled

[always] madvise never

[root@localhost ~]# ps aux |grepkhugepage|grep -v grep

root       298  0.4  0.0     0     0 ?        SN  21:45   0:26 [khugepaged]

Linux平台默认的内存页面大小都是4KHugePage进程会将默认的的每个内存页面可以调整为2M

5.3 磁盘IO的优化

  • IO调度算法,也叫电梯算法,详情请看http://www.unixhot.com/article/4
        ① Noop Scheduler
    :简单的FIFO队列,最简单的调度算法,由于会产生读IO的阻塞,一般使用在SSD硬盘,此时不需要调度,IO效果非常好
        ② Anticipatory IO Scheduler(as scheduler)适合大数据顺序顺序存储的文件服务器,如ftp server和web server,不适合数据库环境,DB服务器不要使用这种算法。
        ③ Deadline Schedler:按照截止时间的调度算法,为了防止出现读取被饿死的现象,按照截止时间进行调整,默认的是读期限短于写期限,就不会产生饿死的状况,一般应用在数据库
        ④ Complete Fair Queueing Schedule:完全公平的排队的IO调度算法,保证每个进程相对特别公平的使用IO

  • 查看本机Centos7默认所支持的调度算法

[root@localhost ~]# dmesg|grep -i"scheduler"

[  16.298583] io scheduler noop registered

[  16.298587] io scheduler deadline registered (default)

[  16.298804] io scheduler cfq registered

临时更改某个磁盘的IO调度算法,将deadling模式改为cfq模式

[root@localhost ~]# cat/sys/block/sda/queue/scheduler

noop [deadline] cfq

[root@localhost ~]# echo cfq>/sys/block/sda/queue/scheduler

[root@localhost ~]# cat/sys/block/sda/queue/scheduler

noop deadline [cfq]

使更改的IO调度算法永久生效,需要更改内核参数

5.4 cache的优化

关于write through和write back,默认write through即可

  • Write-back
        在这种策略下,当数据被写到raid卡的cache中,控制器就向IO调度器返回了写操作完成信号; 双刃剑,它虽然带来了IO性能的提升,但是随之而来的风险:因为cacheROM,假设服务器突然断电,则cache中的数据可能丢失; 为了解决这个问题,raid卡加加装一块锂电池(BBU),即当服务器断电时,能把cache中的数据刷到磁盘上;同样的道理,BBU又成为一个风险点,因为锂电池需要保证始终有足够的电量来保证能将cache中的数据写到磁盘上,raid卡会加入一个BBU的管理策略,learn     cycle(充放电周期,一般有30/90天,让电池充放电一次,持续约6小时),那么这6小时又称为一个风险点;所以raid卡又会增加一个策略:No WB     when bad bbu,即当BBU坏掉,或者BBU正在充放电时,禁用write-back,此时Write policy就会变成:write-through

云计算概述与KVM_第11张图片

 

Write through
只有当数据被写到物理磁盘中,控制器才向IO调度器返回了写操作完成信号;这种策略以牺牲IO性能,来保证数据安全性,淘宝这边的策略:因为Write-Throughio性能无法满足业务的需求,所以我们这边会采用另一个模式:WB when bad bbu,即不管bbu状态是否正常,我们都会采用write-back,那数据安全怎么办?服务器异常断电的情况,在我们这边概率极低;即便很不幸的我们IDC局部断电了,我们也有主备模式来保证数据的相对安全;我们会监控BBU的状态,一旦发生了BBU failed,我们将会安排停机更换。

云计算概述与KVM_第12张图片

六、创建虚拟机镜像

6.1 虚拟磁盘及镜像

由于在一开始创建了虚拟磁盘,并命名为CentOS-7-x86_64-Minimal-1511.raw,这就是虚拟机的镜像喽。

[root@localhost ~]# ll /opt

total 1936076

-rw-r--r--. 1 qemu qemu  632291328 Nov 19 19:52CentOS-7-x86_64-Minimal-1511.iso

-rw-r--r--. 1 qemu qemu 5368709120 Nov 2000:19 CentOS-7-x86_64-Minimal-1511.raw

6.2 镜像制作原则

  • 分区的时候,只分一个/根分区,并不需要swap分区,由于虚拟机的磁盘性能就不好,如果设置了swap分区,当swap工作的时候,性能会更差。例如阿里云主机,就没有交换分区。

  • 镜像制作需要删除网卡(eth0)中的UUID,如果有udev/etc/udev/rules.d/70-persistent-ipoib.rules)的规则也要删除

  • 关闭selinux,关闭iptables

  • 安装基础软件的包:net-tools     lrzsz screen tree vim wget

本文部分内容参考老男孩教育博客: http://blog.oldboyedu.com