云计算与KVM虚拟化

高级架构师体系-云计算
运维社区-赵班长
openstack企业私有云实战

老男孩-带你走进虚拟化世界之KVM
http://blog.oldboyedu.com/kvm/

惨绿少年-KVM虚拟化技术
http://www.cnblogs.com/clsn/p/8366251.html

一、云计算与KVM虚拟化
1.云计算概述
(1)在云计算之前的模式或技术
用户的需求,浅层次的和深层次的。
传统数据中心面临的问题?
IDC托管:买台机器-放到IDC-安装系统-部署应用-买个域名-绑定上去-对外访问
ICP备案-ICP证-文网文(一般找代理交钱办理)
IDC租用:市场乱。
虚拟主机:卖空间的,做个人站长,无安全可言。
VPS:虚拟专有主机,openvz超卖很坑人的,xen不支持超卖。买国外的很流行,带宽便宜。

(2)传统数据中心面临的问题:资源利用率低,资源分配不合理,自动化能力差。初始成本高。
相对于云计算,传统数据中心面临的问题:
a.资源利用率低(大部分机器cpu所占比率低于15%)。
b.资源分配不合理。
举例:由于某个活动,上线各种服务器,但是并未达到实际效果,导致服务器资源浪费。
c.很难实现真正的运维自动化。
所以,云计算火了~
例:直播平台全是公有云的服务(转码,解码,推流),开发成本低。

(3)云计算:基于互联网的资源服务的增加使用和交付的模式。
即云计算是一种按使用量付费的模式,这种模式提供可用的、便捷的、按需的网络访问, 进入可配置的计算资源共享池(资源包括网络,服务器,存储,应用软件,服务),这些资源能够被快速提供,只需投入很少的管理工作,或与服务供应商进行很少的交互。
特点:
a.一种模式;b.通过网络使用;c.三大功能:弹性计算,按需付费,快速扩展。
不用关心太多,都有云计算提供商提供。
资源:服务器,网络,存储,应用软件,数据库等服务。

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

公有云(Public Cloud):通常指第三方提供商为用户提供的能够使用的云,公有云一般可通过 Internet 使用,可能是免费或成本低廉的,公有云的核心属性是共享资源服务。这种云有许多实例,可在当今整个开放的公有网络中提供服务。例如:aws,阿里云,青云,百度云,腾讯云。
优点:价格低廉,使用方便。
缺点:数据放在别人那,技术层面上有风险。
私有云(PrivateClouds):是为一个客户单独使用而构建的,因而提供对数据、安全性和服务质量的最有效控制。该公司拥有基础设施,并可以控制在此基础设施上部署应用程序的方式。私有云可部署在企业数据中心的防火墙内,也可以将它们部署在一个安全的主机托管场所,私有云的核心属性是专有资源。
优点:可控,数据安全(银行必然使用私有云)。
缺点:自己在自己的服务器上搭建,有局限。
混合云(Hybrid Cloud):混合云融合了公有云和私有云,是近年来云计算的主要模式和发展方向。我们已经知道私企业主要是面向企业用户,出于安全考虑,企业更愿意将数据存放在私有云中,但是同时又希望可以获得公有云的计算资源,在这种情况下混合云被越来越多的采用,它将公有云和私有云进行混合和匹配,以获得最佳的效果,这种个性化的解决方案,达到了既省钱又安全的目的,例如在一次活动中,只需要暂时几台机器,在私有云存在的情况,考虑混合云的使用,是最合理化的。
优点:集合的使用方式更完美,可扩展,更节省。

2.云计算分层
  

  
SaaS:提供给客户的服务是运营商运行在云计算基础设施上的应用程序,用户可以在各种设备上通过客户端界面访问,如浏览器。消费者不需要管理或控制任何云计算基础设施,包括网络、服务器、操作系统、存储等等;平时使用的邮件服务器,即属于SaaS服务。
PaaS:提供给消费者的服务是把客户采用提供的开发语言和工具(例如Java,python, .Net等)开发的或收购的应用程序部署到供应商的云计算基础设施上去。客户不需要管理或控制底层的云基础设施,包括网络、服务器、操作系统、存储等,但客户能控制部署的应用程序,也可能控制运行应用程序的托管环境配置;更适合提供给开发人员使用,在这里也可以使用docker容器技术实现。
IaaS:提供给消费者的服务是对所有计算基础设施的利用,包括处理CPU、内存、存储、网络和其它基本的计算资源,用户能够部署和运行任意软件,包括操作系统和应用程序。消费者不管理或控制任何云计算基础设施,但能控制操作系统的选择、存储空间、部署的应用,也有可能获得有限制的网络组件(例如路由器,防火墙、负载均衡器等)的控制。更适合提供给运维人员使用。

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

虚拟化技术:可以将物理计算机虚拟成多个逻辑计算机,例:vmware workstation。彼此独立,互不影响。
  
云计算使用到了虚拟化(被包含)的技术,仅此而已。有替代技术。
总结:虚拟化是一种技术,云计算是通过虚拟化技术实现的一种通过网络访问获取资源,流量,交付的使用模式,两者并不能相互比较,虚拟化相当于实干家,而云计算是思想家。

  
全虚拟化:又叫硬件辅助虚拟化技术,最初所使用的虚拟化技术就是全虚拟化(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就是一个典型的半虚拟化的技术。

KVM属于全虚拟化,硬件层面帮你实现虚拟化的隔离。但半虚拟化性能好。
一般做磁盘IO和网络IO的优化。

使用场景:服务器虚拟化(关注)、桌面虚拟化(呼叫中心,银行外包,教学等使用)、应用虚拟化(应用通过浏览器交付)Xenapp ICA。
服务器虚拟化:数量少的情况推荐使用ESXI,XenServer
数量大的情况推荐使用KVM,RHEV(并不开源),oVirt,Openstack,Vmvare vshpere
桌面虚拟化:桌面虚拟化依赖于服务器虚拟化,在数据中心的服务器上进行服务器虚拟化,生成大量的独立的桌面操作系统(虚拟机或者虚拟桌面),同时根据专有的虚拟桌面协议发送给终端设备。用户终端通过以太网登陆到虚拟主机上,只需要记住用户名和密码及网关信息,即可随时随地的通过网络访问自己的桌面系统,从而实现单机多用户。多用于IP外包,呼叫中心,银行办公、移动桌面。
应用虚拟化:技术原理是基于应用/服务器计算A/S架构,采用类似虚拟终端的技术,把应用程序的人机交互逻辑(应用程序界面、键盘及鼠标的操作、音频输入输出、读卡器、打印输出等)与计算逻辑隔离开来。在用户访问一个服务器虚拟化后的应用时,用户计算机只需要把人机交互逻辑传送到服务器端,服务器端为用户开设独立的会话空间,应用程序的计算逻辑在这个会话空间中运行,把变化后的人机交互逻辑传送给客户端,并且在客户端相应设备展示出来,从而使用户获得如同运行本地应用程序一样的访问感受。
硬件虚拟化和软件虚拟化
参考:
http://virtualization.ctocio.com.cn/38/11466538.shtm

4.虚拟化之KVM简介
(1)就一台机器想做虚拟化,首选ESSI。
https://www.vmware.com/cn.html
https://www.vmware.com/cn/products/vsphere.html
https://my.vmware.com/cn/web/vmware/evalcenter?p=free-esxi6 VMware vSphere Hypervisor 6.5下载
  
QEMU 软件模拟器
KVM和QEMU合作。
(2)kvm的虚拟化特性:
1)嵌入到linux正式kernel(提高了兼容性)
2)代码级资源调用(提高性能)
3)虚拟机就是一个进程(内存易于管理)
4)直接支持NUMA技术(提高扩展性)
5)虽然被Redhat收购了,但是依然保持着开源发展模式,社区活跃
6)更好的商业支持及服务保障
7)Centos7较Centos6默认支持cpu热添加,内存的热添加,大页内存默认都是开启的
(3)支持虚拟化的条件:
inter的cpu:vmx
AMD的cpu:svm
本文使用的是vmware,需要开启如下两个条件即可,如果是物理机,需要在bios里面设置,默认都是开启状态。

在cpuinfo中可以查看具体的支持虚拟化的信息:
[root@linux-node01 ~]# grep -E "svm|vmx" /proc/cpuinfo
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts mmx fxsr sse sse2 ss syscall nx rdtscp lm constant_tsc arch_perfmon pebs bts nopl xtopology tsc_reliable nonstop_tsc aperfmperf pni pclmulqdq vmx ssse3 cx16 pcid sse4_1 sse4_2 x2apic popcnt tsc_deadline_timer aes xsave avx hypervisor lahf_lm epb tpr_shadow vnmi ept vpid tsc_adjust dtherm ida arat pln pts

5.创建KVM虚拟机
安装kvm:
[root@linux-node01 ~]# yum install -y qemu-kvm qemu-kvm-tools libvirt //virt-manager
kvm: linux内核的一个模块,模块不需要安装,只需要加载
qemu:虚拟化软件,可以虚拟不同的CPU,支持异构(x86的架构可以虚拟化出不是x86架构的)
qemu-kvm:用户态管理kvm,网卡,声卡,PCI设备等都是qemu来管理的
启动libvirt:
[root@linux-node01 ~]# systemctl start libvirtd
设置开机自启动:
[root@linux-node01 ~]# systemctl enable libvirtd  

[root@linux-node01 ~]# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 10.0.0.80 netmask 255.0.0.0 broadcast 10.255.255.255
inet6 fe80::3ca:a1b6:4e4c:3e4d prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:49:6f:95 txqueuelen 1000 (Ethernet)
RX packets 43932 bytes 61469728 (58.6 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 19513 bytes 1774917 (1.6 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1 (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 overruns 0 carrier 0 collisions 0

virbr0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
inet 192.168.122.1 netmask 255.255.255.0 broadcast 192.168.122.255
ether 52:54:00:52:e6:6e txqueuelen 1000 (Ethernet)
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 overruns 0 carrier 0 collisions 0

//自动创建了virbr0的桥接网卡,默认192.168.122.1

[root@linux-node01 ~]# ps aux|grep dns //有dhcp功能,自动分配IP
nobody 9008 0.0 0.0 15604 872 ? S 01:47 0:00 /usr/sbin/dnsmasq --conf-file=/var/lib/libvirt/dnsmasq/default.conf --leasefile-ro --dhcp-script=/usr/libexec/libvirt_leaseshelper
root 9009 0.0 0.0 15576 192 ? S 01:47 0:00 /usr/sbin/dnsmasq --conf-file=/var/lib/libvirt/dnsmasq/default.conf --leasefile-ro --dhcp-script=/usr/libexec/libvirt_leaseshelper
root 9087 0.0 0.0 112660 968 pts/1 S+ 01:50 0:00 grep --color=auto dns

  

tightvnc下载:
https://www.tightvnc.com/
https://www.tightvnc.com/download.php

[root@linux-node01 ~]# ll /opt/
total 4415488
-rw-r--r--. 1 root root 4521459712 Feb 25 02:40 CentOS-7-x86_64.iso
[root@linux-node01 ~]# whereis qemu-img
qemu-img: /usr/bin/qemu-img /usr/share/man/man1/qemu-img.1.gz
[root@linux-node01 ~]# rpm -qf /usr/bin/qemu-img
qemu-img-1.5.3-141.el7_4.6.x86_64

创建虚拟机镜像(创建一个虚拟磁盘,-f 指定格式,路径是/opt/CentOS-7.1-x86_64.raw,大小为10G):
[root@linux-node01 ~]# qemu-img create -f raw /opt/CentOS-7-x86_64.raw 10G
Formatting '/opt/CentOS-7-x86_64.raw', fmt=raw size=10737418240
[root@linux-node01 ~]# ll /opt/
total 4415488
-rw-r--r--. 1 root root 4521459712 Feb 25 02:40 CentOS-7-x86_64.iso
-rw-r--r--. 1 root root 10737418240 Feb 25 02:47 CentOS-7-x86_64.raw
显示内核中kvm的状态:
[root@linux-node01 ~]# lsmod |grep kvm
kvm_intel 170086 0
kvm 566340 1 kvm_intel
irqbypass 13503 1 kvm
将CentOS-7-x86_64.iso导入到宿主机中,当然时间可能较长:
[root@linux-node01 ~]# dd if=/dev/cdrom of=/opt/CentOS-7-x86_64.iso

使用命令创建一台虚拟机:
首先学virt-install命令,在这里使用–help查看,并且只学习重要的,其他的稍后会有提供
virt-install –help
—n(Name):指定虚拟机的名称
–memory(–raw):指定内存大小
–cpu:指定cpu的核数(默认为1)
–cdrom:指定镜像
–disk:指定磁盘路径(即上文创建的虚拟磁盘)
–virt-type:指定虚拟机类型(kvm,qemu,xen)
–network:指定网络类型
[root@linux-node01 ~]# yum install -y virt-install
[root@linux-node01 ~]# virt-install --help
[root@linux-node01 ~]# virt-install --virt-type kvm --name CentOS-7-x86_64 --ram 2048 \
> --cdrom=/opt/CentOS-7-x86_64.iso --disk path=/opt/CentOS-7-x86_64.raw \
> --network network=default --graphics vnc,listen=0.0.0.0 --noautoconsole
或者:
[root@linux-node01 ~]# virt-install --virt-type kvm --name CentOS-7-x86_64 --ram 2048 --cdrom=/opt/CentOS-7-x86_64.iso --disk path=/opt/CentOS-7-x86_64.raw --network network=default --graphics vnc,listen=0.0.0.0 --noautoconsole
Starting install...
Domain installation still in progress. You can reconnect to
the console to complete the installation process.

[root@linux-node01 ~]# netstat -lntup
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:5900 0.0.0.0:* LISTEN 9746/qemu-kvm
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 1/systemd
tcp 0 0 192.168.122.1:53 0.0.0.0:* LISTEN 9008/dnsmasq
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 850/sshd
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 1083/master
tcp6 0 0 :::111 :::* LISTEN 1/systemd
tcp6 0 0 :::22 :::* LISTEN 850/sshd
tcp6 0 0 ::1:25 :::* LISTEN 1083/master
udp 0 0 192.168.122.1:53 0.0.0.0:* 9008/dnsmasq
udp 0 0 0.0.0.0:67 0.0.0.0:* 9008/dnsmasq
udp 0 0 127.0.0.1:323 0.0.0.0:* 517/chronyd
udp6 0 0 ::1:323 :::* 517/chronyd
[root@linux-node01 ~]# virsh list --all
Id Name State
----------------------------------------------------
3 CentOS-7-x86_64 running

[root@linux-node01 ~]# virsh list --all
Id Name State
----------------------------------------------------
1 CentOS-7-x86_64-1 running
- CentOS-7-x86_64 shut off
[root@linux-node01 ~]# virsh shutdown CentOS-7-x86_64-1
[root@linux-node01 ~]# virsh undefine CentOS-7-x86_64-1
[root@linux-node01 ~]# virsh undefine CentOS-7-x86_64
[root@linux-node01 ~]# virsh list --all
Id Name State
----------------------------------------------------

[root@linux-node01 ~]# yum install -y virt-manager
[root@linux-node01 ~]# ps -aux|grep kvm
root 473 0.0 0.0 0 0 ? S< 04:50 0:00 [kvm-irqfd-clean]
qemu 1585 16.8 84.6 2536224 1580516 ? Sl 05:02 5:19 /usr/libexec/qemu-kvm -name CentOS-7-x86_64-1 -S -machine pc-i440fx
......
说明:10.0.0.80虚拟机做物理机,则刚才启动的一个或若干虚拟机可看成是宿主机操作系统上是一个进程,该进程属于qemu用户的,qemu-kvm启动的,帮我们加了许多参数,当做进程的话则可以被CPU调度,可以像管理进程一样管理它,享受进程般的优势。

6.virt管理KVM虚拟机
虚拟机基本操作学习:
生成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@linux-node01 ~]# systemctl stop libvirtd
[root@linux-node01 ~]# virsh list
error: failed to connect to the hypervisor
error: Failed to connect socket to '/var/run/libvirt/libvirt-sock': No such file or directory

[root@linux-node01 ~]# systemctl start libvirtd
[root@linux-node01 ~]# virsh list
Id Name State
----------------------------------------------------
3 CentOS-7-x86_64 running
说明:KVM相当于管理这些虚拟机的工具而已,并不影响这些虚拟机工作。

[root@linux-node01 ~]# cd /etc/libvirt/
[root@linux-node01 libvirt]# ls
libvirt-admin.conf libvirtd.conf nwfilter qemu.conf storage virtlogd.conf
libvirt.conf lxc.conf qemu qemu-lockd.conf virtlockd.conf
[root@linux-node01 libvirt]# cd qemu
[root@linux-node01 qemu]# ls
CentOS-7-x86_64.xml networks
KVM虚拟机通过该xml文件定义:
[root@linux-node01 qemu]# cat CentOS-7-x86_64.xml

备份:
[root@linux-node01 qemu]# virsh dumpxml CentOS-7-x86_64 > CentOS-7-x86_64_backup.xml
[root@linux-node01 qemu]# ll
total 12
-rw-r--r--. 1 root root 5087 Feb 25 07:10 CentOS-7-x86_64_backup.xml
-rw-------. 1 root root 3858 Feb 25 05:53 CentOS-7-x86_64.xml
drwx------. 3 root root 42 Feb 25 01:47 networks

删除某个虚拟机:
[root@linux-node01 qemu]# virsh undefine CentOS-7-x86_64
[root@linux-node01 qemu]# virsh shutdown CentOS-7-x86_64
[root@linux-node01 qemu]# virsh list
Id Name State
----------------------------------------------------

[root@linux-node01 qemu]# ll
total 8
-rw-r--r--. 1 root root 5087 Feb 25 07:10 CentOS-7-x86_64_backup.xml
drwx------. 3 root root 42 Feb 25 01:47 networks

恢复:
[root@linux-node01 qemu]# virsh define CentOS-7-x86_64_backup.xml
Domain CentOS-7-x86_64 defined from CentOS-7-x86_64_backup.xml
[root@linux-node01 qemu]# ll
total 16
-rw-r--r--. 1 root root 5087 Feb 25 07:10 CentOS-7-x86_64_backup.xml
-rw-------. 1 root root 4203 Feb 25 07:15 CentOS-7-x86_64.xml
drwx------. 3 root root 42 Feb 25 01:47 networks
[root@linux-node01 qemu]# virsh list --all
Id Name State
----------------------------------------------------
- CentOS-7-x86_64 shut off

启动该虚拟机:
[root@linux-node01 qemu]# virsh start CentOS-7-x86_64
Domain CentOS-7-x86_64 started

[root@linux-node01 qemu]# virsh list --all
Id Name State
----------------------------------------------------
4 CentOS-7-x86_64 running

挂起和恢复:
[root@linux-node01 qemu]# virsh suspend CentOS-7-x86_64
Domain CentOS-7-x86_64 suspended

[root@linux-node01 qemu]# virsh list --all
Id Name State
----------------------------------------------------
4 CentOS-7-x86_64 paused

[root@linux-node01 qemu]# virsh resume CentOS-7-x86_64
Domain CentOS-7-x86_64 resumed

[root@linux-node01 qemu]# virsh list --all
Id Name State
----------------------------------------------------
4 CentOS-7-x86_64 running

7.CPU和内存动态扩容
(1)编辑kvm的xml文件,更改虚拟机CPU配置:
[root@linux-node01 qemu]# virt-install --help|grep cpu
--vcpus VCPUS Number of vcpus to configure for your guest. Ex:
--vcpus 5
--vcpus 5,maxcpus=10,cpuset=1-4,6,8
--vcpus sockets=2,cores=4,threads=2,
--cpu CPU CPU model and features. Ex:
--cpu coreduo,+x2apic
--cpu host
[root@linux-node01 qemu]# head /etc/libvirt/qemu/CentOS-7-x86_64.xml
<!--
WARNING: THIS IS AN AUTO-GENERATED FILE. CHANGES TO IT ARE LIKELY TO BE
OVERWRITTEN AND LOST. Changes to this xml configuration should be made using:
virsh edit CentOS-7-x86_64
or other application using the libvirt API.
-->

<domain type='kvm'>
<name>CentOS-7-x86_64</name>

[root@linux-node01 qemu]# cp /etc/libvirt/qemu/CentOS-7-x86_64.xml{,.bak}

配置虚拟机的cpu,两种方式(启动的时候指定核数,更改xml):
第一种方法:为了实现cpu的热添加,就需要更改cpu的最大值,当然热添加的个数不能超过最大值
[root@linux-node01 qemu]# virsh edit CentOS-7-x86_64
13 <vcpu placement='static'>1</vcpu>
改成:
13 <vcpu placement='auto' current="1">4</vcpu> //当前为1,自动扩容,最大为4
登录虚拟机上,查看cpu信息,确认cpu的个数,下面开始进行cpu热添加:
[root@linux-node01 qemu]# virsh setvcpus CentOS-7-x86_64 2 --live
error: invalid argument: requested vcpus is greater than max allowable vcpus for the live domain: 2 > 1
kvm版本较高,并不需要echo “1”到/sys/devices/system/cpu/cpu1/online 进行激活,自动可以激活:
[root@linux-node01 qemu]# cat /sys/devices/system/cpu/cpu0/online //工作
1
再到虚拟机中查看cpu信息。
说明:cpu的热添加(cpu只支持热添加,不支持热减少);需要物理机CPU核数允许。
需要重启:
[root@linux-node01 qemu]# virsh shutdown CentOS-7-x86_64
[root@linux-node01 qemu]# virsh start CentOS-7-x86_64
第二种方法:安装的时候指定 virt-install –vcpus 5 –vcpus 5,maxcpus=10,cpuset=1-4,6,8 –vcpus sockets=2,cores=4,thread=2

(2)编辑kvm的xml文件,更改虚拟机内存配置
内存的设置拥有一个“气球(balloon)机制”,可以增大减少,但是也要设置一个最大值,默认并没有设置最大值,也可以在安装的时候指定,这里不再重复此方法。
[root@linux-node01 qemu]# vim CentOS-7-x86_64.xml
[root@linux-node01 qemu]# virsh --help|grep monitor
qemu-monitor-command QEMU Monitor Command
qemu-monitor-event QEMU Monitor Events
Domain Monitoring (help keyword 'monitor')
法一:创建时定义内存,修改内存或查看:
11 <memory unit='KiB'>2097152</memory> //把最大内存改为2G
12 <currentMemory unit='KiB'>2097152</currentMemory> //当前内存为2G
重启虚拟机并查看当前状态的内存使用情况:
[root@linux-node01 qemu]# virsh qemu-monitor-command CentOS-7-x86_64 --hmp --cmd info balloon
balloon: actual=604

法二:对内存进行热添加并查看:
[root@linux-node01 qemu]# virsh qemu-monitor-command CentOS-7-x86_64 --hmp --cmd balloon 512 //
重启虚拟机并查看当前状态的内存使用情况:
[root@linux-node01 qemu]# virsh qemu-monitor-command CentOS-7-x86_64 --hmp --cmd info balloon
balloon: actual=604

8.KVM磁盘和网络管理
(1)
[root@linux-node01 qemu]# qemu-img info /opt/CentOS-7-x86_64.raw
image: /opt/CentOS-7-x86_64.raw
file format: raw
virtual size: 10G (10737418240 bytes)
disk size: 0

raw与qcow2转化:
[root@linux-node01 opt]# qemu-img convert -f raw -O qcow2 CentOS-7-x86_64.raw test.qcow2
[root@linux-node01 opt]# ll
total 4415684
-rw-r--r--. 1 qemu qemu 4521459712 Feb 25 02:40 CentOS-7-x86_64.iso
-rw-r--r--. 1 qemu qemu 10737418240 Feb 25 02:47 CentOS-7-x86_64.raw
-rw-r--r--. 1 root root 197120 Feb 25 08:32 test.qcow2
[root@linux-node01 opt]# qemu-img info test.qcow2
image: test.qcow2
file format: qcow2
virtual size: 10G (10737418240 bytes)
disk size: 196K
cluster_size: 65536
Format specific information:
compat: 1.1
lazy refcounts: false
基本数据单元是cluster(每个cluster包含一些大小为512字节的扇区)。
更改虚拟机中存储,硬盘设置(不建议在生产环境使用硬盘的扩大收缩模式,很容易产生故障):
[root@linux-node01 ~]# qemu-img --help |grep -i "formats:"
Supported formats: vvfat vpc vmdk vhdx vdi ssh sheepdog rbd raw host_cdrom host_floppy host_device file qed qcow2 qcow parallels nbd iscsi gluster dmg tftp ftps ftp https http cloop bochs blkverify blkdebug

从结果看出,kvm支持很多种硬盘格式。
qemu使用的镜像文件:raw(全镜像格式)和qcow2(稀疏格式),这俩是qemu(KVM)虚拟机使用的磁盘文件格式。
a.全镜像格式(典型代表raw格式),其特点:设置多大就是多大,写入速度快,方便的转换为其他格式,性能最优,但是占用空间大
b.稀疏模式(典型代表qcow2格式),其特点:支持压缩,快照,镜像,更小的存储空间(即用多少占多少)
硬盘格式都可以通过qemu-img管理,详情qemu-img –help


(2)编辑kvm的xml文件,更改虚拟机网桥连接配置
默认情况是NAT情况,但是在生产情况,使用更多的是桥接模式,更改虚拟机为网桥模式,原理图如下,网桥的基本原理就是创建一个桥接接口br0,在物理网卡和虚拟网络接口之间传递数据。

  
修改eth0(这里Centos7的eth0在装机的时候就指定,不需要特意指定了)
[root@linux-node01 ~]# brctl show
bridge name bridge id STP enabled interfaces
virbr0 8000.52540052e66e yes virbr0-nic
vnet0
[root@linux-node01 ~]# ifconfig
[root@linux-node01 ~]# iptables -t nat -vnl

a.添加一个网桥(网卡br0)并查看:
[root@linux-node01 ~]# brctl show
bridge name bridge id STP enabled interfaces
virbr0 8000.52540052e66e yes virbr0-nic
[root@linux-node01 ~]# brctl addbr br0 //1
[root@linux-node01 ~]# brctl show
bridge name bridge id STP enabled interfaces
br0 8000.000000000000 no
virbr0 8000.52540052e66e yes virbr0-nic
vnet0
b.把eth0加入网桥,使用桥接模式,给br设置ip,添加路由网关,关闭防火墙:
[root@linux-node01 ~]# brctl addif br0 eth0 //2.断了,连不上了!
  
将网卡桥接到了eth0

ip addr del dev eth0 10.0.0.80/24 //3
ifconfig br0 10.0.0.80/24 up //4

[d:\~]$
Connecting to 10.0.0.80:22...
Connection established.
To escape to local shell, press 'Ctrl+Alt+]'.
Last login: Sun Feb 25 08:47:59 2018
[root@linux-node01 ~]# ping www.baidu.com
^C
[root@linux-node01 ~]# ip ro li
default via 10.0.0.254 dev eth0 proto static metric 100
10.0.0.0/24 dev br0 proto kernel scope link src 10.0.0.80
10.0.0.0/8 dev eth0 proto kernel scope link src 10.0.0.80 metric 100
192.168.122.0/24 dev virbr0 proto kernel scope link src 192.168.122.1
出不去,没网关没路由。
[root@linux-node01 ~]# route add default gw 10.0.0.2 //5,总结成脚本!
[root@linux-node01 ~]# ping www.baidu.com
^C //应该通了!!!!
小结成一步就好:
[root@linux-node01 ~]# brctl addif br0 eth0 && ip addr del dev eth0 10.0.0.80/24 && ifconfig br0 10.0.0.80/24 up && route add default gw 10.0.0.2 && iptables -F

c.编辑虚拟机的网络配置使用br0网桥模式:
[root@linux-node01 ~]# virsh edit CentOS-7-x86_64
<interface type='network'>
改成: <interface type='bridge'>
<source network='default'/>
改成: <source bridge='br0'/>

d.重启虚拟机,网桥模式生效,此时使用crt便可以链接到所创建的虚拟机了,在vmvare机器上使用ifconfig查看详情:
[root@linux-node01 ~]# virsh shutdown CentOS-7-x86_64
[root@linux-node01 ~]# virsh start CentOS-7-x86_64
[root@linux-node01 ~]# virsh list --all
Id Name State
----------------------------------------------------
5 CentOS-7-x86_64 running

[root@chuck ~]# ifconfig 
br0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 10.0.0.123 netmask 255.255.255.0 broadcast 10.0.0.255
inet6 fe80::20c:29ff:fe67:5a43 prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:67:5a:43 txqueuelen 0 (Ethernet)
RX packets 5178 bytes 278872 (272.3 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 7599 bytes 862371 (842.1 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet6 fe80::20c:29ff:fe67:5a43 prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:67:5a:43 txqueuelen 1000 (Ethernet)
RX packets 13641 bytes 973732 (950.9 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 21843 bytes 2417546 (2.3 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 0 (Local Loopback)
RX packets 10 bytes 1044 (1.0 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 10 bytes 1044 (1.0 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
virbr0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
inet 192.168.122.1 netmask 255.255.255.0 broadcast 192.168.122.255
ether 52:54:00:fc:d1:d1 txqueuelen 0 (Ethernet)
RX packets 97 bytes 8122 (7.9 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 36 bytes 5157 (5.0 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
vnet0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet6 fe80::fc54:ff:fe99:1b4e prefixlen 64 scopeid 0x20<link>
ether fe:54:00:99:1b:4e txqueuelen 500 (Ethernet)
RX packets 42 bytes 7295 (7.1 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 45 bytes 4919 (4.8 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

9.KVM的优化

posted @ 2018-02-25 23:57  bkycrmn  阅读(570)  评论(1)    收藏  举报