openstack项目【day23】:KVM介绍
阅读目录
- 什么是kvm
- 为何要用kvm
- kvm的功能
- 常见虚拟化模式
- KVM架构
- KVM工具集合
一 什么是kvm
KVM 全称 Kernel-Based Virtual Machine。也就是说 KVM 是基于 Linux 内核实现的,这就使得linux内核本身就相当于一个Hypervisor。
Hypervisor即vmm,主要功能就是用来控制生成vm,并管理多个vm的运行,不同的vm中可以安装不同的操作系统,这些操作系统共用一台硬件主机,
因为直接使用linux内核的调度器进行管理,所以比xen的代码少很多
二 为何要用kvm
虚拟化是云计算的基础之一,而无论是在部署,还是在研发、测试方面,kvm都是排在第一位的Hypervisor(即vmm)。
kvm以高性能,可扩展性、高安全性,以及低成本而深受用户喜爱,这一切也与他基于linux内核实现有关。
三 kvm的功能
kvm用一个个进程来运行虚拟机。
最主要的功能:
- 基于kvm,可以执行热迁移,将一个运行的虚拟机从一个运行vm从一台物理机移动到另外一台物理主机,而vm里的运行不受影响(几台部署kvm虚拟化的物理机共享一个存储,存储内存放虚拟机的xml文件,这样在另外一台主机启一个虚拟机的进程是很快的,然后关联上待迁移主机的xml文件,就实现了热迁移);
- 可以保存当前虚拟机的运行状态到硬盘,然后可以重新启动虚拟机,这是虚拟机的运行状态和之前一样。
其余功能:
- 支持CPU 和 memory 超分(Overcommit)
- 支持半虚拟化I/O (virtio)
- 支持热插拔 (cpu,块设备、网络设备等)
- 支持对称多处理(Symmetric Multi-Processing,缩写为 SMP )
- 支持 PCI 设备直接分配和 单根I/O 虚拟化 (SR-IOV)
- 支持 内核同页合并 (KSM )
- 支持 NUMA (Non-Uniform Memory Access,非一致存储访问结构 )
四 常见虚拟化模式
按照Hypervisor的实现方式和位置不同,常见的形式分两种
1. 全虚拟化
物理机上首先安装常规的操作系统( Redhat、Ubuntu 和 Centos等),然后在操作系统上安装kvm,kvm即Hypervisor,它会 作为 OS 上的一个程序模块运行,并对管理虚拟机进行管理。除此之外:VirtualBox 和 VMWare Workstation 都属于这个类型。
2. 半虚拟化
Hypervisor 直接安装在物理机上,多个虚拟机在 Hypervisor 上运行。Hypervisor 实现方式一般是一个特殊定制的 Linux 系统。Xen 和 VMWare 的 ESXi 都属于这个类型。
五 KVM架构
openstack可以兼容很多虚拟化解决方案,其中最主要的就是针对x86平台的kvm。
KVM 全称 Kernel-Based Virtual Machine。也就是说 KVM 是基于 Linux 内核实现的,这就使得linux内核本身就相当于一个Hypervisor。
具体的:
基于kvm创建的vm就是一个普通的linux进程,由linux内核调度程序进行调度,vm因此可以使用linux内核已有的功能。vm的执行本质就是vm中cpu的执行,因此vm的每个cpu就是普通的linux进程。
KVM有一个内核模块叫 kvm.ko,只提供 CPU 和内存的虚拟化,而针对于IO及其他硬件设备(网络及存储等)的虚拟化,则是交给qemu实现,qemu运行在用户态通过/dev/kvm接口设置一个客户机虚拟机服务器的地址空间,向kvm提供模拟的I/O,并且将它的视频显示映射回宿主的显示屏。
其实qemu本身就是一种虚拟化技术,它与kvm的区别如下
1. 上图的左侧:完全基于Qemu纯软件(不包含操作系统内核)实现的虚拟化。kqemu是通过kqemu模块实现内核态的加速,在用户态的qemu通过访问/dev/kqemu设备文件接口调用改进加速。不过,此类模式主要针对Guest os与Host os属于统一cpu架构(比如都是x86的架构)。一个明显的缺点是性能低下。
2. 上图的右侧:qemu+kvm实现的虚拟化(即qemu-kvm)。具体的,KVM并不能算是一个完整的虚拟化解决方案,kvm只是Linux标准内核加载了一个据说有几万行代码的模块kvm.ko。也就是说KVM仅可以在VT技术的基础上,提供虚拟的处理器和虚拟内存,至于IO硬件的模仿都交给qemu去做。
创建虚拟机流程
- 标准的Linux内核中加入KVM的模块kvm.ko变身成为一个VMM(VMM Virtual MachineMonitor)
- 在原有的用户模式(工作在ring3)和内核模式(工作在ring0)两种模式的基础上增加了新的客户模式。客户模式存在的特权级别与ring0-3正交。(也就是说客户模式也存在4个特权级别)
- 用户创建虚拟机,通过调用用户模式的qemu程序,qemu与kvm提供的libkvm库为接口,传递创建指令。
- 打开/dev/kvm文件并获得文件描述符fd后,通过ioctl指令写入KVM_CREATE_KVM,即可创建一个虚拟机,并返回一个fd_vm的虚拟机文件描述符。
- 获得fd_vm后,通过ioctl调用KVM_CREATE_VCPU指令,可以对fd_vm所对应的虚拟机创建vCPU,并对vCPU做初始化操作。
- 然后通过KVM_RUN指令对fd_vcpus操作,启动运行虚拟机。
总结:
- Guest OS(此处vm1的linux os):客户机系统,包括CPU(vCPU)、内存、驱动(Console、网卡、I/O 设备驱动等),被 KVM 置于一种受限制的 CPU 模式下运行。
- KVM:运行在内核空间,提供CPU 和内存的虚级化,以及客户机的 I/O 拦截。Guest 的 I/O 被 KVM 拦截后,交给 QEMU 处理。
- QEMU:修改过的为 KVM 虚机使用的 QEMU 代码,运行在用户空间,提供硬件 I/O 虚拟化,通过 IOCTL /dev/kvm 设备和 KVM 交互。
KVM 是实现拦截虚机的 I/O 请求的原理:
QEMU-KVM:
其实 QEMU 原本不是 KVM 的一部分,它自己就是一个纯软件实现的虚拟化系统,所以其性能低下。但是,QEMU 代码中包含整套的虚拟机实现,包括处理器虚拟化,内存虚拟化,以及 KVM需要使用到的虚拟设备模拟(网卡、显卡、存储控制器和硬盘等)。
为了简化代码,KVM 在 QEMU 的基础上做了修改。VM 运行期间,QEMU 会通过 KVM 模块提供的系统调用进入内核,由 KVM 负责将虚拟机置于处理的特殊模式运行。遇到虚机进行 I/O 操作,KVM 会从上次的系统调用出口处返回 QEMU,由 QEMU 来负责解析和模拟这些设备。
从 QEMU 的角度看,也可以说是 QEMU 使用了 KVM 模块的虚拟化功能,为自己的虚机提供了硬件虚拟化加速。除此以外,虚机的配置和创建、虚机运行说依赖的虚拟设备、虚机运行时的用户环境和交互,以及一些虚机的特定技术比如动态迁移,都是 QEMU 自己实现的。
KVM:
KVM 内核模块在运行时按需加载进入内核空间运行。KVM 本身不执行任何设备模拟,需要 QEMU 通过 /dev/kvm 接口设置一个 GUEST OS 的地址空间,向它提供模拟的 I/O 设备,并将它的视频显示映射回宿主机的显示屏。它是KVM 虚机的核心部分,其主要功能是初始化 CPU 硬件,打开虚拟化模式,然后将虚拟客户机运行在虚拟机模式下,并对虚机的运行提供一定的支持。以在 Intel 上运行为例,KVM 模块被加载的时候,它:
- 首先初始化内部的数据结构;
- 做好准备后,KVM 模块检测当前的 CPU,然后打开 CPU 控制及存取 CR4 的虚拟化模式开关,并通过执行 VMXON 指令将宿主操作系统置于虚拟化模式的根模式;
- 最后,KVM 模块创建特殊设备文件 /dev/kvm 并等待来自用户空间的指令。
四 KVM工具集合
Libvirt:简单说就是 KVM 的管理工具。并且Libvirt 除了能管理 KVM 这种 Hypervisor,还能同时管理 vmware,XEN,Hyper-v, LXC,QEMU 等多种Hypervisor。
Libvirt 本质就是一组API,通常部署完libvirt后,都会包含 3 样东西:一个API 库,一个后台守护进程libvirtd和一个命令行工具virsh。
- API 库使得其他人可以开发基于 Libvirt 的高级工具,比如 virt-manager,这是个图形化管理KVM的常用工具。;
- libvirtd是服务程序,接收和处理 API 请求;
- virsh :基于 libvirt 的 命令行的常用工具 (CLI)。
一:libvirt实现在一台物理机上同时跑多个虚拟机监控程序vmm
libvirt期初是专门为Xen设计的一种管理API,后来被扩展为可支持多个VMM,libvirt以一组API的形式存在,负责与每个vmm通信,完成API请求
左图是没有引入libvirt时,一台机器只能运行一个Hypervisor/vmm,右图是引入了libvirt时,一台机器可以同时运行多个Hypervisor/vmm,此时需要注意的是,libvirt把物理主机称作节点,将来宾操作系统(guest os)称为域Domain,而libvirt及其应用程序在宿主机Domain 0中运行
二 libvirtd提供从远程应用程序访问本地域的方式
三 libvrt api与相关驱动程序的层次结构。
libvirt 已经为表 1 所列举出来的的虚拟机监控程序实现了驱动程序。随着新的虚拟机监控程序在开源社区出现,其他驱动程序无疑也将可用。
四 libvirt主要功能总结
- Domain(虚拟机)管理:启动、停止、暂停、保存、恢复和迁移。支持多种涉笔类型的热插拔,如磁盘、网卡、内存和cpu。
- 远程访问支持:见图2,只要在一台主机上运行libvirtd守护进程,所有的libvirt功能就都可以访问和使用。支持多种网络远程传播,使用最简单的SSH,不需要额外的配置工作,比如example.com物理机运行了libvirtd,而且允许SSH访问,下面命令就可以在远程的主机上使用virsh命令:virsh -connect qemu+ssh://root@example.com/system
- 存储管理:任何运行了libvirtd的主机都可以用来管理不同类型的存储,如创建不同格式的文件映像(qcow2,vmdk,raw等),挂接NFS共享、列出现有的LVM卷组、创建新的LVM卷组和逻辑卷、对未处理过的磁盘设备分区、挂在iSCSI共享等等,因为libvirt可以远程工作,所有这些都可以通过远程主机来使用。
- 网络接口管理:任何运行了libvirtd的主机都可用来管理物理和逻辑的网络接口,可以列出现有的接口、配置参数、桥接、VLAN和关联设备等,也可以创建新的网络接口。
- 虚拟NAT和基于路由的网络:任何运行了libvirtd的主机都可以用来管理和创建虚拟网络。libvirt虚拟网络使用防火墙规则作为路由器,让虚拟机可以透明访问主机的网络。
ps:libvirt使用 C 语言编写,可以由 Python,Ruby, Perl, PHP, Java 等语言调用,OpenStack 底层也使用 libvirt。更详细猛击这里
除此之外还包含下列工具:
virt-v2v:虚机格式迁移工具
virt-* 工具:包括 virt-install(创建KVM虚机的命令行工具),virt-viewer(连接到虚机屏幕的工具),virt-clone(虚机克隆工具),virt-top 等
sVirt:安全工具
转载于:https://www.cnblogs.com/luoahong/p/7204677.html
openstack项目【day23】:KVM介绍相关推荐
- 初识openstack之0——虚拟化及Xen和KVM介绍
一.CPU虚拟化 1.CPU的工作机制 随着云计算的兴起,虚拟化作为云计算的组成部分也火了一把,但虚拟化并不是什么新技术,早在上世纪60年代虚拟化技术就已经出现.X86的CPU架构有4个保护环,分为: ...
- 世民谈云计算:KVM 介绍
http://www.cnblogs.com/sammyliu/p/4543110.html KVM 介绍(1):简介及安装 学习 KVM 的系列文章: (1)介绍和安装 (2)CPU 和 内存虚拟化 ...
- KVM 介绍(6):Nova 通过 libvirt 管理 QEMU/KVM 虚机 [Nova Libvirt QEMU/KVM Domain]
KVM 介绍(6):Nova 通过 libvirt 管理 QEMU/KVM 虚机 [Nova Libvirt QEMU/KVM Domain] 学习 KVM 的系列文章: (1)介绍和安装 (2)CP ...
- KVM 介绍(8):使用 libvirt 迁移 QEMU/KVM 虚机和 Nova 虚机 [Nova Libvirt QEMU/KVM Live Migration]...
学习 KVM 的系列文章: (1)介绍和安装 (2)CPU 和 内存虚拟化 (3)I/O QEMU 全虚拟化和准虚拟化(Para-virtulizaiton) (4)I/O PCI/PCIe设备直接分 ...
- Openstack各种部署工具介绍
原文地址: http://www.aboutyun.com/forum.php?ctid=3&mod=viewthread&tid=7476 Openstack各种部署工具介绍 问题导 ...
- “睡眠猴子”团队项目及成员介绍
"睡眠猴子"团队项目及成员介绍 咳咳--软件工程这门课最终还是来到了团队开发的部分,我们宿舍三只经过一下午的讨论和需求分析决定做一款名叫"睡眠猴子"的安卓版手机 ...
- iOS 9应用开发教程之创建iOS 9项目与模拟器介绍
iOS 9应用开发教程之创建iOS 9项目与模拟器介绍 编写第一个iOS 9应用 本节将以一个iOS 9应用程序为例,为开发者讲解如何使用Xcode 7.0去创建项目,以及iOS模拟器的一些功能.编辑 ...
- 2020-12-14 Python PyCharm新建项目自动添加介绍和utf-8编码
Python PyCharm新建项目自动添加介绍和utf-8编码 你是不是觉得每次新建项目都要写一次# coding:utf-8,感觉特烦人 呐!懒(fu)人(li)教程来啦,先看效果图吧 如图进入设 ...
- Java-GUI编程实战之管理系统 Day3【学生管理系统GUI设计、学生管理系统增删改查、项目MVC结构介绍、Java技能图谱】
视频.课件.源码[链接:https://pan.baidu.com/s/13ffqGDzH-DZib6-MFViW3Q 提取码:zjxs] Java-GUI编程实战之管理系统 Day1[项目开发流程. ...
- openstack及组件简要介绍
openstack及组件简要介绍 为什要用云? 一.简单的说就是对资源更加合理的分配,使用,比如硬件的数量,带宽等等这些,因为你不能机器买来不需要了再卖掉(当然也可以),带宽跟机房签合同得来一年的,中 ...
最新文章
- c++ 按键暂停继续 程序_CNC操作面板讲解,看看这些按键是什么意思
- android连接ecs sql server_MySQL 执行 SQL 语句的过程解析
- JS函数方法Call Apply Bind运用
- python windows开发_windows 下 python 开发是一种什么样的体验?
- twisted系列教程十一 — 一个twisted 的服务端
- 【Java】开源工具 Hutool 不糊涂
- php抛出和捕获异常,关于php:捕获和重新抛出异常的最佳实践是什么?
- java零碎要点---大型软件部署方案,磁盘阵列,raid提升硬盘性能,解决由于集群带来的文件共享问题
- 用一套键鼠控制两台主机
- 神州炫龙蓝天刷bios教程(百分百成功/不成功下面留言)
- Java原生实现多线程下载Tim
- R语言plot函数参数合集
- grab显示连接不上服务器,grab软件使用方法 grab打车软件
- DeepFaceLab坑之ffmpeg
- 华为手机怎么使用新系统鸿蒙,华为手机鸿蒙系统如何退回EMU
- 跑实验_word2vector词向量实现_基于搜狗新闻预料+维基百科
- java启动项目出现The Tomcat connector configured to listen on port 7014 failed to start. The port may alrea
- ZBrush自带笔刷的特性你都知道哪些?
- 计算机专业-世界大学学术排名,QS排名,U.S.NEWS排名
- Windbg调试学习
热门文章
- 在云环境上使用SLF4J对Java程序进行日志记录
- Json字符串转对象,使用ObjectMapper方式报错:no String-argument constructor/factory method
- mysql服务器_windows mysql服务器
- python的linux电脑上图标不见了怎么办_电脑桌面及桌面图标消失不见怎么找回?
- centos一键清理磁盘空间_docker越来越大,心慌,清理一波吧
- dw字体红色阴影_DW网页制作,傻瓜级教学来了!
- c语言顺序查找算法,c语言实现排序和查找所有算法
- 全国计算机等级考试 备考,全国计算机等级考试经验:如何调整备考心态
- matlab转向语句,MATLAB控制语句
- android 通知栏按钮,android 通知栏添加按钮点击效果