KVM虚拟化技术之使用Qemu-kvm创建和管理虚拟机

.KVM 简介

KVM (名称来自英语: Kernel-basedVirtual Machine 的缩写,即基于内核的虚拟机) , 是一种用于Linux内核中的虚拟化基础设施,可以将Linux内核转化为一个hypervisor。KVM在2007年2月被导入Linux 2.6.20核心中,以可加载核心模块的方式被移植到FreeBSD及illumos上。

KVM在具备Intel VT或AMD-V功能的x86平台上运行。它也被移植到S/390,PowerPC与IA-64平台上。在Linux内核3.9版中,加入ARM架构的支持。

关于KVM:

1).KVM是开源软件,全称是kernel-based virtual machine(基于内核的虚拟机)。
2).是x86架构且硬件支持虚拟化技术(如 intel VT 或 AMD-V)的Linux全虚拟化解决方案。 3).它包含一个为处理器提供底层虚拟化 可加载的核心模块kvm.ko(kvm-intel.ko或kvm-AMD.ko)。 4).KVM还需要一个经过修改的QEMU软件(qemu-kvm),作为虚拟机上层控制和界面。 5).KVM能在不改变linux或windows镜像的情况下同时运行多个虚拟机,(它的意思是多个虚拟机使用同一镜像)并为每一个虚拟机配置个性化硬件环境(网卡、磁盘、图形适配器……)。 6).在主流的Linux内核,如2.6.20以上的内核均已包含了KVM核心。

――――摘自 WIKI 百科

KVM   vbox 的区别

vbox  是由  qemu  改写而成,包含大量 qemu  代码。

1).可以使用于"不支持"虚拟化技术的cpu。
2).值得说的一点:vbox 在图形方面比较好,能进行2D 3D加速;但cpu控制不理想(估计是因为图形支持的缘故);操作上有独立的图形界面,易于上手。

kvm  linux 内核包含的东西,使用 qemu 作为上层管理(命令行)。  

1).要求cpu 必须支持虚拟化。
2).性能:作为服务器很好,可是图形能力十分的差。即使放电影,图像也是像刷油漆一样,一层一层的。
3).cpu使用率控制很好。
4).控制上比较简洁,功能比较丰富:比如使用“无敌功能”所有更改指向内存,你的镜像永远保持干净。“母镜像”功能让你拥有n个独立快照点。还有很多参数。另外,kvm作为内核级的虚拟机,刚开始发展关注的公司比较多――但是还没有达到商业应用的水平。

总体而言: 在支持虚拟化的情况下, vbox  和  kvm  的性能差不多,主要是面向对象不同: kvm 适用于服务器, vbox 适用于桌面应用。

qemu  全称 Quick Emulator 是独立虚拟软件,能独立运行虚拟机(根本不需要 kvm )。 kqemu 是该软件的加速软件。 kvm 并不需要 qemu 进行虚拟处理,只是需要它的上层管理界面进行虚拟机控制。虚拟机依旧是由 kvm 驱动。所以,大家不要把概念弄错了,盲目的安装 qemu 和 kqemu 。 qemu 使用模拟器

KVM 内存管理

KVM 继承了 Linux 系统管理内存的诸多特性,比如,分配给虚拟使用的内存可以被交换至交换空间、能够使用大内存页以实现更好的性能,以及对 NUMA 的支持能够让虚拟机高效访问更大的内存空间等。

KVM 基于 Intel 的 EPT ( ExtendedPage Table )或 AMD 的 RVI ( Rapid Virtualization Indexing )技术可以支持更新的内存虚拟功能,这可以降低 CPU 的占用率,并提供较好的吞吐量。  

此外, KVM 还借助于 KSM Kernel Same-pageMerging )这个内核特性实现了内存页面共享 。 KSM 通过扫描每个虚拟机的内存查找各虚拟机间相同的内存页,并将这些内存页合并为一个被各相关虚拟机共享的单独页面。在某虚拟机试图修改此页面中的数据时, KSM 会重新为其提供一个新的页面副本。实践中,运行于同一台物理主机上的具有相同 GuestOS 的虚拟机之间出现相同内存页面的概率是很的,比如共享库、内核或其它内存对象等都有可能表现为相同的内存页,因此, KSM 技术可以降低内存占用进而提高整体性能。

相关连接:

KVM 的官方地址: http://www.linux-kvm.org/page/Main_Page

KVM 的 Howto 文档: http://www.linux-kvm.org/page/HOWTO

Kqemu 源码地址: http://sourceforge.net/projects/kqemu/

Qemu 下载地址: http://wiki.qemu.org/Main_Page

.KVM 虚拟化平台构建

1. 安装准备

查看你的硬件是否支持虚拟化。命令:

#egrep '(vmx|svm)' /proc/cpuinfo

注意:

1 ) . 要有  vmx  或  svm  的标识才行。总的说来, AMD 在虚拟化方面作得更好一些。

2 ) . 我用的是虚拟机,我使用了 VBOX ,发现其不支持硬件虚拟化,启动虚拟机后执行查看命令无法发现上述的选项;所以我就换成了 VMware Workstation 10 ,并在虚拟机的设置中打开了 CPU 设置中的虚拟化引擎,选择了 Intel VT-x/EPT 或 AMD-V/RVI(V) 这个选项;具体设置如下图:

2. 安装 KVM

由于 Linux 内核已经将 KVM 收录了,在安装系统时已经加入了 KVM ,我们只需要在命令行模式下启用 KVM 即可:

启用 KVM 模块

#modprobe kvm

功能区分 intel/amd 的启用:

#modprobe kvm-intel
# lsmod |grep kvm
kvm_intel              55496  0
kvm                   337772 1 kvm_intel

3.KVM 虚拟机创建和管理所依赖的组件介绍

KVM 虚拟机的创建依赖 qemu-kvm

虽然 kvm 的技术已经相当成熟而且可以对很多东西进行隔离,但是在某些方面还是无法虚拟出真实的机器。比如对网卡的虚拟,那这个时候就需要另外的技术来做补充,而 qemu-kvm 则是这样一种技术。它补充了 kvm 技术的不足,而且在性能上对 kvm 进行了优化。

我们还可以使用 virt-manager virt-viewer 来管理虚拟机;

我们在创建和管理 KVM 虚拟机时还需要 libvirt 这个重要的组件:

它是一系列提供出来的库函数,用以其他技术调用,来管理机器上的虚拟机。包括各种虚拟机技术, kvm 、 xen 与 lxc 等,都可以调用 libvirt 提供的 api 对虚拟机进行管理。有这么多的虚拟机技术,它为何能提供这么多的管理功能那。是因为它的设计理念,它是面向驱动的架构设计。对任何一种虚拟机技术都开发设计相对于该技术的驱动。这样不同虚拟机技术就可以使用不同驱动,而且相互直接不会影响,方便扩展。而且 libvirt 提供了多种语言的编程接口,可以直接通过编程,调用 libvirt 提供的对外接口实现对虚拟机的操作。如今流行的云计算中的 IaaS 是与该库联系相当密切的。通过下图可以看出它的架构设计思想。

从该图可以看出,在 libvirtapi 之上会有很多个 driver ,对于每一种虚拟机技术都会有一种 driver ,用来充当该虚拟机技术与 libvirt 之间的包装接口。如此设计就可以避免 libvirt 需要设计各种针对不同虚拟机技术的接口,它主要关注底层的实现,提供对外接口调用,而不同的虚拟机技术通过调用 libvirt 提供的接口来完成自己所需要的功能。

4. 安装 KVM 所需组件

yum 源提供了,直接安装:

#yum install -y qemu-kvm libvirt virt-manager

安装完成后启动 libvirtd 服务:

#service libvirtd start

会自动启动一个桥设备,这相当于 VMware Workstation 中的 host-only 仅主机的网络设备;

# ifconfig
eth0     Link encap:Ethernet  HWaddr00:0C:29:3E:63:26 inet addr:172.16.31.7 Bcast:172.16.255.255 Mask:255.255.0.0 inet6 addr: fe80::20c:29ff:fe3e:6326/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:25460 errors:0 dropped:0overruns:0 frame:0 TX packets:9728 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:35156437 (33.5 MiB) TXbytes:800196 (781.4 KiB) lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 inet6 addr: ::1/128 Scope:Host UP LOOPBACK RUNNING MTU:65536 Metric:1 RX packets:12 errors:0 dropped:0 overruns:0 frame:0 TX packets:12 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:1024 (1024.0 b) TXbytes:1024 (1024.0 b) virbr0 Link encap:Ethernet HWaddr52:54:00:30:54:41 inet addr:192.168.122.1 Bcast:192.168.122.255 Mask:255.255.255.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:0 (0.0 b) TX bytes:0(0.0 b) 

使用网桥管理命令查看:

# brctl show
bridge name     bridge id               STP enabled     interfaces
virbr0          8000.525400305441       yes             virbr0-nic

像 VMware Workstation 中我们需要创建物理桥接设备,可以使用 virsh 创建桥设备关联网卡到桥接设备上:

需要将 NetworkManager 服务关闭,开机启动也关闭:

# chkconfig NetworkManager off
# service NetworkManager stop

然后在创建桥接设备及关联网卡到桥接设备上:

# virsh iface-bridge eth0 br0

查看桥接设备及其他网络设备运行情况:

# ifconfig
br0      Link encap:Ethernet  HWaddr00:0C:29:3E:63:26 inet addr:172.16.31.7 Bcast:172.16.255.255 Mask:255.255.0.0 inet6 addr: fe80::20c:29ff:fe3e:6326/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:76 errors:0 dropped:0 overruns:0 frame:0 TX packets:60 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:9781 (9.5 KiB) TXbytes:8957 (8.7 KiB) eth0 Link encap:Ethernet HWaddr00:0C:29:3E:63:26 inet6 addr: fe80::20c:29ff:fe3e:6326/64 Scope:Link UP BROADCAST RUNNINGMULTICAST MTU:1500 Metric:1 RX packets:176 errors:0 dropped:0 overruns:0 frame:0 TX packets:97 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:26793 (26.1 KiB) TXbytes:11385 (11.1 KiB) lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 inet6 addr: ::1/128 Scope:Host UP LOOPBACK RUNNING MTU:65536 Metric:1 RX packets:4 errors:0 dropped:0 overruns:0 frame:0 TX packets:4 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:344 (344.0 b) TXbytes:344 (344.0 b) virbr0 Link encap:Ethernet HWaddr52:54:00:30:54:41 inet addr:192.168.122.1 Bcast:192.168.122.255 Mask:255.255.255.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:0 (0.0 b) TX bytes:0(0.0 

转载于:https://www.cnblogs.com/memphise/articles/6759043.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/429373.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python 如何在一个for循环中遍历两个列表

是我在看《笨方法学python》过程中发现有一行代码看不懂——“ for sentence in snippet, phrase:”,所以研究了半天,感觉挺有收获的。所以就放在博客上分享给大家了。 直入主题: 为了不耽误大家时间,如果知道以下为两段代码为什么…

画王八java代码参数_java画乌龟源代码-郭遥航.doc

java画乌龟源代码-郭遥航.doc /*JAVA基本功小练习用java语言描述小王八用鼠标可以拖动小乌龟进行移动选中乌龟时可以显示小乌龟的腹面*/importjava.awt.*;importjavax.swing.*;importjava.awt.event.MouseMotionListener;importjava.awt.event.MouseListener;importjava.awt.ev…

java服务注册中心有哪些_Spring Cloud服务注册中心简述

概念当一个大型系统拥有很多服务时,往往需要一个服务注册中心来管理这些服务,它可以提供如下功能:登记每个服务提供的功能检测每个服务是否可用,不可用的服务剔除服务间互相调用时,通过服务注册中心很容易找到目标服务…

JavaScript原生对象及扩展

来源于 https://segmentfault.com/a/1190000002634958 内置对象与原生对象 内置(Build-in)对象与原生(Naitve)对象的区别在于:前者总是在引擎初始化阶段就被创建好的对象,是后者的一个子集;而后…

实例化Java对象_Java面向对象基础之对象实例化

1、实例化对象的过程可以分为两部分,例如下面代码:Person per new Person();该代码分为两部分:第一,声明对象:Personper,这部分是在栈内存中声明的,与数组一样,数组名称及时保存在占内存之中,只是开闭了真内存,对象是…

HTTP 错误 404.2 - Not Found 由于 Web 服务器上的“ISAPI 和 CGI 限制”列表设置,无法提供您请求的页面 详细错误:HTTP 错误...

错误摘要 HTTP 错误 404.2 - Not Found 由于 Web 服务器上的“ISAPI 和 CGI 限制”列表设置,无法提供您请求的页面。 详细错误信息 模块IsapiModule通知ExecuteRequestHandler处理程序ExtensionlessUrlHandler-ISAPI-4.0_32bit错误代码0x800704ec请求的 URLhttp://:…

vue value key

转载于:https://www.cnblogs.com/lily2021/p/6772817.html

go的timer定时器实现

示例如下: package mainimport ("fmt""time" )func testTimer1() {go func() {fmt.Println("test timer1")}()}func testTimer2() {go func() {fmt.Println(time.Now().String())}() }func timer1() {timer1 : time.NewTicker(1 * ti…

JavaSE简单实现多线程聊天

1.1 主程序入口 在主程序入口处,通过设置MyWindow的第一个参数,如果为true则为服务器,如果为false,则为客户端,当然也可以设置第二个参数,区分客户端和服务器的窗口标题。 public class JavaMain {public s…

php聊天功能逻辑原理,@xxx提及用户,这种功能的实现原理是怎样的?

122014-12-13 22:05:54 08:00 1在牛客网 http://www.nowcoder.com 用户在我们网站提交的评论,我们会进行敏感词过滤,其算法是基于有限状态机DFA过滤的。 我觉得可以用敏感词过滤的方法来查找的用户ID。 (用户ID就是好多敏感词), 具体的代码…

T7-Dropout 解决 overfitting 过拟合

Dropout 解决 overfitting 相对于过拟合(overfitting,或称:过度学习)是指,使用过多参数,以致太适应训练数据而非一般情况;另一种常见的现象是使用太少参数,以致于不适应当前的训练数…

从零开始构建一个的asp.net Core 项目(一)

最近突发奇想,想从零开始构建一个Core的MVC项目,于是开始了构建过程。 首先我们添加一个空的CORE下的MVC项目,创建完成之后我们运行一下(Ctrl F5)。我们会在页面上看到“Hello World!”。 既然是从零开始构建的项目&am…

201521123014 《Java程序设计》第11周学习总结

201521123014 《Java程序设计》第11周学习总结 1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多线程相关内容。 2. 书面作业 Q1 互斥访问与同步访问 完成题集4-4(互斥访问)与4-5(同步访问) 1.1 除了使用synchronized修饰方法实现互斥同步…

FineReport实现java报表统计图表的效果图

Java报表-ERP图表联动 Java报表-多维坐标轴图 Java报表-静态图表 Java报表-时间坐标轴 Java报表-图表报表动态交互 Java报表-图表热点链接 Java报表-图表缩放 Java报表-地图-广州市商场销售分析 Java报表-地图-全国商场销售分析 Java报表-地图-商场柜台销售分析 Java报表-图表分…

Mysql 性能优化20个原则(2)

5. 在Join表的时候使用相当类型的例,并将其索引 如果你的应用程序有很多 JOIN 查询,你应该确认两个表中Join的字段是被建过索引的。这样,MySQL内部会启动为你优化Join的SQL语句的机制。 而且,这些被用来Join的字段,应该…

linux命令帮助怎么看,Linux命令帮助

Linux命令帮助教程在Linux man命令详解概述man 命令,它是 Manual pages 的缩写,它是 Linux 系统中在线软件文档的一种普遍的形式,其内容包括计算机程序(包括库和系统调用)、正式的标准和惯例,抽象的概念等。man 工具是显示系统手册…

【转】Yelp是如何实现每天运行数百万个测试的

Yelp每天要运行数百万个测试,确保开发人员提交的代码不会对已有的功能造成破坏。如此巨大规模的测试,他们是怎么做到的呢?以下内容翻译自 Yelp 的技术博客,并已获得翻译授权,查看原文 How Yelp Runs Millions of Tests…

go语言linux下载文件,学习 Go 语言(Golang)PDF

1、简介Go 编程语言是一个使得程序员更加有效率的开源项目。Go 是有表达力、简 洁、清晰和有效率的。它的并行机制使其很容易编写多核和网络应用,而新奇的类型系统允许构建有性的模块化程序。Go 编译到机器码非常快 速,同时具有便利的垃圾回收和强大的运…

数据同步这点事

最近一段时间,在做数据ETL相关的事,结合实践以及自己的思考,记录下来,以做参考。 概述 一般来说,数据团队自己是很少生产数据的,一般都是对业务线的数据进行分析加工,从而让数据产生价值。一方面…

linux下的awk程序在哪里编写,如何编写awk命令和脚本

awk命令是处理或分析文本文件(尤其是按行和列组织的数据文件)的强大方法.您可以从命令行运行简单的awk命令. 应该将更复杂的任务作为awk程序(所谓的awk脚本)写入文件.awk命令的基本格式如下:awkpattern {action}输入文件>输出文件这意味着: 占用输入文件的每一行&#xff1b…