KVM虚拟化
虚拟化技术
-
虚拟化技术就是对资源的抽象,如虚拟机,虚拟内存等
-
虚拟化(Virtualization)技术最早出现在 20 世纪 60 年代的 IBM 大型机系统,在70年代的 System370 系列中逐渐流行起来,这些机器通过一种叫**虚拟机监控器(Virtual Machine Monitor,VMM)**的程序在物理硬件之上生成许多可以运行独立操作系统软件的虚拟机(Virtual Machine)实例
-
VMM虚拟机监控器也叫做Hypervisor,就是为了虚拟化而引入的一个软件层。它向下掌控实际的物理资源,向上呈现出N份逻辑资源。
-
虚拟机监控器运行的实际物理环境,称为宿主机;其上虚拟出来的逻辑主机,称为客户机。
-
分类
-
从资源提供角度分
- 平台虚拟化:把CPU,内存,外设等作为资源提供给虚拟机使用。在同一个X86平台上面,可以虚拟多个X86平台,每个平台可以运行自己完全独立的操作系统。如QEMU,KVM,VMware等所管理的虚拟机
- 操作系统虚拟化:如果把操作系统及其提供的系统调用作为资源,那虚拟化就表现为操作系统虚拟化,例如Linux容器虚拟化技术就是在同一个Linux操作系统之上,虚拟出多个同样的操作系统,每个应用程序认为自己运行在一个独立的OS。如LXC或Docker等所管理的容器
-
从虚拟化实现方式分
- Type I:虚拟机直接运行在系统硬件上,被称为裸机型,没有所谓的宿主机操作系统。他们直接控制硬件资源以及客户机。这种方案的性能处于主机虚拟化与操作系统虚拟化之间。如xen和vmware ESX
- Type II:虚拟机运行在传统操作系统上,同样创建的是硬件全仿真实例,被称为**托管(宿主)**型。Hypervisor构建出一整套虚拟硬件平台,使用者根据需要安装新的操作系统和应用软件,底层和上层的操作系统可以完全无关化。简单的说这类VMM通常就是宿主机操作系统上的一个应用程序,像其他应用程序一样受宿主机操作系统的管理,通常抽象为进程。如VMware workstation、KVM。主机虚拟化中VM的应用程序调用硬件资源时需要经过:VM内核->Hypervisor->主机内核,相对来说,性能是几种虚拟化技术中最差的
-
-
Hypervisor管理工具的对比
工具 | 厂商 | 主CPU | 目标CPU | 主系统 | 目标系统 |
---|---|---|---|---|---|
qemu | Febrice,Bellard | Inter,AMD,ARM | x86/x86-64/ARM | Windows,Linux,Mac OS | Linux |
kvm | Red Hat | Inter/AMD | x86/x86-64 | Linux | Windows/Linux |
Xen | 剑桥大学,Inter/AMD | Inter/AMD | x86/x86-64 | Windows/Linux/Solaris | Windows/Linux |
Hyper-V | 微软 | Inter/AMD | x86/x86-64 | Windows | Windows/Linux |
VMware ESXi Server | VMware | Inter/AMD | x86/x86-64 | 裸机安装 | Windows/Linux |
Oracle VM | Oracle | Inter/AMD | x86/x86-64 | 裸机安装 | Windows/Linux |
KVM架构
KVM内核模块
- 它属于标准Linux内核的一部分,是一个专门提供虚拟化功能的模块,主要负责CPU和内存的虚拟化
- 本质上,KVM是管理虚拟硬件设备的驱动,该驱动使用字符设备**/dev/kvm**(由KVM本身创建)作为管理接口,主要负责vCPU的创建,虚拟内存的分配,vCPU寄存器的读写以及vCPU的运行
QEMU
-
QEMU是用户态工具,可以为客户机提供设备模拟的功能,包括模拟BIOS、数据总线、磁盘、网卡、显卡、声卡、键盘、鼠标等。
-
我们知道KVM只负责CPU和内存的虚拟化,加载了它以后,用户就可以进一步通过工具创建虚拟机(KVM提供接口),但仅有KVM还是不够的,用户无法直接控制内核去做事情(KVM只提供接口,怎么创建虚拟机,分配vCPU等并不在它上面进行),还必须有个运行在用户空间的工具才行,KVM的开发者选择了比较成熟的开源虚拟化软件QEMU来作为这个工具,并对其进行了修改,最后形成了QEMU-KVM。
-
在QEMU-KVM中,KVM运行在内核空间,QEMU运行在用户空间,实际模拟创建,管理各种虚拟硬件,QEMU将KVM整合了进来,通过/ioctl 调用 /dev/kvm,从而将CPU指令的部分交给内核模块来做,KVM实现了CPU和内存的虚拟化,但kvm不能虚拟其他硬件设备,因此qemu还有模拟IO设备(磁盘,网卡,显卡等)的作用,KVM加上QEMU后就是完整意义上的服务器虚拟化。但是,由于qemu模拟io设备效率不高的原因,现在常常采用半虚拟化的virtio方式来虚拟IO设备。
-
KVM负责提供对cpu,内存的虚拟
-
QEMU负责除CPU和内存外的其他设备的虚拟以及对各种虚拟设备的创建与调用
libvirt
- libvirt是一套免费、开源的支持Linux下主流虚拟化管理程序的C函数库,其旨在为包括KVM在内的各种虚拟化管理程序提供一套方便、可靠的编程接口。 当前主流Linux平台上默认的虚拟化管理工具virt-manager,virsh等都是基于libvirt开发。
- libvirt是一个针对各种虚拟化平台的虚拟机管理的API库。一些常用的虚拟机管理工具如virsh(类似vim编辑器),virt-install,virt-manager等和云计算框架平台(如OpenStack,OpenNebula,Eucalyptus等)都在底层使用libvirt提供的应用程序接口。
- libvirt主要由三个部分组成:API库,一个守护进程 libvirtd 和一个默认命令行管理工具 virsh。
总结
- QEMU是一个独立的虚拟化解决方案,并不依赖KVM(它本身自己可以做CPU和内存的模拟,只不过效率较低)。而KVM是另一套虚拟化解决方案,对CPU进行虚拟效率较高(采用了硬件辅助虚拟化),但本身不提供其他设备的虚拟化,借用了QEMU的代码进行了定制,所以KVM方案一定要依赖QEMU。即使后来RedHat后来开发了libvirt,也只能简单的认为libvirt是个虚拟机管理工具,仍然需要通过用户空间QEMU来与KVM进行交互。
KVM虚拟机部署
环境准备
- Linux主机需要安装图形化桌面
最小化——>图形
yum groupinstall -y “GNOME 桌面”
重启
startx临时开启终端(不推荐)
systemctl set-default graphical.targer
[root@server1 ~]# systemctl get-default
graphical.target
-
注意合理分配CPU,内存,磁盘空间等
-
确保开启硬件辅助虚拟化
[root@server5 ~]# lscpu|grep '虚拟化'
虚拟化: VT-x
虚拟化类型: 完全
- 查看CPU支持的功能(vmx:INTEL的虚拟化功能|svm:AMD的虚拟化功能)
[root@server5 ~]# 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 mmx fxsr sse sse2 ss ht syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon nopl xtopology tsc_reliable nonstop_tsc eagerfpu pni pclmulqdq vmx ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm 3dnowprefetch invpcid_single ssbd ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi ept vpid fsgsbase tsc_adjust bmi1 avx2 smep bmi2 invpcid rdseed adx smap clflushopt xsaveopt xsavec xgetbv1 arat pku ospke md_clear spec_ctrl intel_stibp flush_l1d arch_capabilities
安装kvm
清理干净KVM相关的预装环境
[root@server5 ~]# yum remove `rpm -qa |egrep 'qemu|virt|kvm'`
[root@server5 ~]# rm -rf /var/lib/libvirt/
[root@server5 ~]# rm -rf /etc/libvirt/
查看分组
[root@server5 ~]# yum grouplist
安装kvm分组(可译为虚拟化的包都会被安装)
[root@server5 ~]# yum install *qemu* *virt* librbd1-devel -y
开启libvirt
[root@server5 ~]# systemctl start libvirtd
[root@server5 ~]# systemctl enable libvirtd
[root@server5 ~]# systemctl status libvirtd
[root@server5 ~]# virsh list --all
Id 名称 状态
----------------------------------------------------
确保kvm模块已被加载
[root@server5 ~]# lsmod |grep kvm
kvm_intel 188740 0
kvm 637515 1 kvm_intel
irqbypass 13503 1 kvm
设置防火墙规则
[root@server5 ~]# systemctl start firewalld.service
[root@server5 ~]# systemctl enable firewalld.service
[root@server5 ~]# firewall-cmd --zone=public --add-masquerade --permanent
success
[root@server5 ~]# firewall-cmd --zone=public --add-masquerade
success
[root@server5 ~]# firewall-cmd --zone=public --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: ens33
sources:
services: dhcpv6-client ssh
ports:
protocols:
masquerade: yes
forward-ports:
source-ports:
icmp-blocks:
rich rules:
Guest OS安装
图形化安装
- 调出虚拟系统管理器
[root@server5 ~]# virt-manager
- 上传系统镜像
[root@server5 ~]# rz
[root@server5 ~]# ls
anaconda-ks.cfg 公共 视频 文档 音乐
CentOS-7-x86_64-Minimal-2009.iso 模板 图片 下载 桌面
- 使用镜像安装
- 自定义配置(配置完成后点击:左上角开始安装)
- 安装过程中可以参考CentOS7的安装
命令行安装
- 帮助信息
[root@server5 ~]# virt-install --help
# 仅保留常用选型
usage: virt-install --name NAME --memory MB STORAGE INSTALL [options]
选项:
-h, --help show this help message and exit
-n NAME, --name NAME 客户机实例名称
--memory MEMORY Configure guest memory allocation. Ex:
--memory 1024 (in MiB)
--memory 512