云计算的基础是虚拟化。作为已经纳入Linux内核的虚拟化解决方案,KVM近年来发展迅猛,但学习曲线比较陡。
课程目录

在计算机中,虚拟化意味着创建设备或资源的虚拟版本,如服务器、存储设备、网络或者操作系统等
1.系统虚拟化
2.存储虚拟化
3.网络虚拟化
4.GPU虚拟化
5.软件虚拟化
6.硬件支持虚拟化
这种虚拟化通常表现为在单一系统上运行多个操作系统
这些操作系统同时运行,每个操作系统又是相互独立
虚拟化有三种实现方式:
1.纯软件仿真
2.虚拟化翻译
3.容器技术
通过模拟完整的硬件环境来虚拟化来宾平台
模拟X86、ARM、PowerPC等多种CPU
效率比较低
产品或方案
QEMU、Bochs、PearPC
多数的虚拟化采用虚拟机管理程序Hypervisor
Hypervisor是一个软件层或子系统
也称为VMM(Virtual Machine Monitor,虚拟机监控器)
允许多种操作系统在相同的物理系统中运行
控制硬件并向来宾操作系统提供访问底层硬件的途径
向来宾操作系统提供虚拟化的硬件


不需要对GuestOS操作系统软件的源代码做任何的修改,就可以运行在这样的VMM中
在全虚拟化的虚拟平台中,GuestOS并不知道自己是一台虚拟机,它会认为自己就是运行在计算机物理硬件设备上的HostOS。因为全虚拟化的VMM会将一个OS所能够操作的CPU、内存、外设等物理设备逻辑抽象成为虚拟CPU、虚拟内存、虚拟外设等虚拟设备后,再交由GuestOS来操作使用。这样的GuestOS会将底层硬件平台视为自己所有的,但是实际上,这些都是VMM为GuestOS制造了这种假象。
全虚拟化又分为:软件辅助的全虚拟化 & 硬件辅助的全虚拟化。
软件辅助虚拟化能够成功的将所有在GuestOS中执行的系统内核特权指令进行捕获、翻译,使之成为只能对GuestOS生效的虚拟特权指令。但是退一步来说,之所以需要这么做的前提是因为CPU并不能准确的去判断一个特权指令到底是由GuestOS发出的还是由HostOS发出的,这样也就无法针对一个正确的OS去将这一个特权指令执行。
直到后来CPU厂商们发布了能够判断特权指令归属的标准x86 CPU之后,迎来了硬件辅助全虚拟化。
硬件辅助全虚拟化主要使用了支持虚拟化功能的CPU进行支撑,CPU可以明确的分辨出来自GuestOS的特权指令,并针对GuestOS进行特权操作,而不会影响到HostOS。
需要对GuestOS的内核代码做一定的修改,才能够将GuestOS运行在半虚拟化的VMM中。
半虚拟化通过在GuestOS的源代码级别上修改特权指令来回避上述的虚拟化漏洞。
修改内核后的GuestOS也知道自己就是一台虚拟机。所以能够很好的对核心态指令和敏感指令进行识别和处理,但缺点在于GuestOS的镜像文件并不通用。
一种轻量级/操作系统虚拟化方式,由Linux内核支持
起源:chroot系统虚拟化方式,由Linux内核支持
优势:
更快的交付和部署
更高效率的虚拟化
更轻松的迁移和拓展
更简单的管理

裸机型与宿主型

Kernel Virtual Machine
硬件辅助的全虚拟化解决方案
以色列的创业公司Qumranet创建了KVM
早期的主要开发者Avi Kivity
2006年10月,在完成基本功能、动态迁移、主要的性能优化后,正式宣布了KVM的诞生
2007年2月发布的内核2.6.20中,开始正式包括了KVM
2008年9月,Redhat 1.7亿美收购
RHEL 5.4,在集成Xen的基础上,又将KVM添加进来
2011年11月,RHEL6使用KVM彻底替换了Xen
QEMU
QEMU是一个通用的开源的硬件模拟器,可以模拟多种硬件
QEMU-KVM从分支到与主干合并,QEMU成立KVM在用户空间的管理工具
初始化CPU硬件,打开虚拟化模式,以支持虚拟机的运行。
负责CPU、内存、中断、控制器、时钟
模拟网卡、显卡、存储控制器和硬盘
它提供统一API、守护进程libvirtd和一个默认命令行管理工具virsh

Qemu通过ioctl调用/dev/kvm接口,将有关CPU指令的部分交由KVM来做
Qemu还是模拟网卡、显卡、存储控制器和硬盘等,会影响这些设备的性能
通过pass through半虚拟化设备virtio_blk, virtio_net,提高设备性能


http://www.linux-kvm.org/page/Management_Tools
示例∶
功能强大,是Redhat 虚拟化管理平台RHEV的开源版本。
virt-manager的Web模式的替代品
分开源版本和商业版本
单一hypervisor
KVM
单一hypervisor
KVM
单一或多个hypervisor
容器(LXC, Parallels, Docker)
KVM
多种Hypervisor
KVM和 vCenter/ESXi
Stop Trying to Reinvent the Wheel,不要重复造轮子
国产虚拟化解决方案重点在虚拟化的管理与桌面协议
Hypervisor/VMM选择(按汉语拼音排序):
H3: KVM
红山∶Xen
华为∶Xen → KVM→Xen
浪潮∶Xen
普华∶KVM
锐捷∶KVM
深信服∶ KVM
….其他KVM居多
https://access.redhat.com/documentation
Virtualization Getting Started Guide
Virtualization Deployment and Administration Guide
Virtualization Tuning and Optimization Guide
Virtualization Security Guide
提供了KVM的详细信息 ,以及大量信息来源和相关站点的链接
提供了有关该API、所支持的虚拟化抽象及其使用的XML格式的详细信息
需求:要创建虚拟机,就需要给他提供一个虚拟的磁盘,我们就在/opt目录下创建一个10G大小的raw格式的虚拟磁盘CentOS-7-x86_64.raw命令格式:qemu-imgcreate-f磁盘格式磁盘名称磁盘大小qemu-imgcreate-f磁盘格式-o?1.创建磁盘qemu-imgcreate-fraw/opt/CentOS-7-x86_64.raw10G执行效果#ls/opt/CentOS-7-x86_64.raw2.安装虚拟机使用virt-install命令,基于我们提供的系统镜像和虚拟磁盘来创建一个虚拟机,另外在创建虚拟机之前,提前打开vnc客户端,在创建虚拟机的时候,通过vnc
基础版云数据库RDS的产品系列包括基础版、高可用版、集群版、三节点企业版,本文介绍基础版实例的相关信息。RDS基础版实例也称为单机版实例,只有单个数据库节点,计算与存储分离,性价比超高。说明RDS基础版实例只有一个数据库节点,没有备节点作为热备份,因此当该节点意外宕机或者执行重启实例、变更配置、版本升级等任务时,会出现较长时间的不可用。如果业务对数据库的可用性要求较高,不建议使用基础版实例,可选择其他系列(如高可用版),部分基础版实例也支持升级为高可用版。基础版与高可用版的对比拓扑图如下所示。优势 性能由于不提供备节点,主节点不会因为实时的数据库复制而产生额外的性能开销,因此基础版的性能相对于
我的Rails应用程序中安装了carrierwave。但是,当用户上传多页pdf时,我只希望应用程序获取文档中的第一页并将其转换为jpeg。这可能吗?用什么命令?这是我的uploader。#encoding:utf-8classImageUploader[200,300]##defscale(width,height)##dosomething#end#Createdifferentversionsofyouruploadedfiles:version:thumbdoprocess:resize_to_fill=>[150,210]process:convert=>:jpgdefful
有没有办法跳过CSV文件的第一行,让第二行作为标题?我有一个CSV文件,第一行是日期,第二行是标题,所以我需要能够在遍历它时跳过第一行。我尝试使用slice但它会将CSV转换为数组,我真的很想将其读取为CSV,以便我可以利用header。 最佳答案 根据您的数据,您可以使用另一种方法和skip_lines-option此示例跳过所有以#开头的行require'csv'CSV.parse(DATA.read,:col_sep=>';',:headers=>true,:skip_lines=>/^#/#Markcomments!)do|
我的任务是从数组中选择最高和最低的数字。我想我很清楚我想做什么,但只是努力以正确的格式访问信息以满足通过标准。defhigh_and_low(numbers)array=numbers.split("").map!{|x|x.to_i}array.sort!{|a,b|ba}putsarray[0,-1]end数字可能看起来像"80917234100",要通过,我需要输出"9234"。我正在尝试putsarray.first.last,但一直无法弄明白。 最佳答案 有Array#minmax完全满足您需要的方法:array=[80,
或者好像我必须自己写方法?(保持DHA不变):ruby-1.9.2-p180:001>s='omega-3(DHA)'=>"omega-3(DHA)"ruby-1.9.2-p180:002>s.capitalize=>"Omega-3(dha)"ruby-1.9.2-p180:003>s.titleize=>"Omega3(Dha)"ruby-1.9.2-p180:005>s[0].upcase+s[1..-1]=>"Omega-3(DHA)" 最佳答案 如果我的回答只是垃圾,我深表歉意(我不做ruby)。但我相信我已经为您找到了答
我有这个字符串:auteur="comtedeFlandreetHainaut,Baudouin,Jacques,Thierry"我想删除第一个逗号之前的所有内容,即在这种情况下保留“Baudouin,Jacques,Thierry”试过这个:nom=auteur.gsub(/.*,/,'')但这会删除最后一个逗号之前的每个逗号,只保留“Thierry”。 最佳答案 auteur.partition(",").last#=>"Baudouin,Jacques,Thierry" 关于rub
我有一个以时间戳为键的哈希。hash={"2016-05-31T22:30:58+02:00"=>{"path"=>"/","method"=>"GET"},"2016-05-31T22:31:23+02:00"=>{"path"=>"/tour","method"=>"GET"},"2016-05-31T22:31:05+02:00"=>{"path"=>"/contact_us","method"=>"GET"}}我订购了这个系列并得到了第一双这样的:hash.sort_by{|k,_|k}.first.first但是我该如何删除它呢?删除方法requiresyou知道key的准确
我有一个字符串数组,我需要从中提取第一个单词,将它们转换为整数并获得它们的总和。示例:["5Apple","5Orange","15Grapes"]预期输出=>25我的尝试:["5","5","15"].map(&:to_i).sum 最佳答案 我从你的问题中找到了答案。["5Apple","5Orange","15Grapes"].map(&:to_i).sum在数组中,如果存在任何整数可转换值,那么它将自动转换为整数。 关于arrays-字符串数组中字符串第一部分的总和,我们在Sta
在我看来,我正在尝试显示一个对象表,这是我的代码:CategoriesCBB's">然而这是抛出一个错误说:can'tconvertCapabilityBuildingBlockintoArray关系是正确的,错误来self尝试在此处减去数组的第一个对象的行:有什么方法可以忽略数组中的第一个对象来遍历数组吗?谢谢 最佳答案 尝试使用Array.drop-http://www.ruby-doc.org/core/classes/Array.html#M000294 关于ruby-on-ra