深入浅出 kvm qemu libvirt
在所谓的kvm技术中,应用到的其实有2个东西:qemu+kvm
kvm负责cpu虚拟化+内存虚拟化,实现了cpu和内存的虚拟化,但kvm不能模拟其他设备;
qemu是模拟IO设备(网卡,磁盘),kvm加上qemu之后就能实现真正意义上服务器虚拟化。
因为用到了上面两个东西,所以一般都称之为qemu-kvm。
libvirt则是调用kvm虚拟化技术的接口用于管理的,用libvirt管理方便,直接用qemu-kvm的接口太繁琐。
Qemu
Qemu是一个模拟器,它向Guest OS模拟CPU和其他硬件,Guest OS认为自己和硬件直接打交道,其实是同Qemu模拟出来的硬件打交道,Qemu将这些指令转译给真正的硬件。
由于所有的指令都要从Qemu里面过一手,因而性能较差。
KVM
KVM是linux内核的模块,它需要CPU的支持,采用硬件辅助虚拟化技术Intel-VT,AMD-V,内存的相关如Intel的EPT和AMD的RVI技术,Guest OS的CPU指令不用再经过Qemu转译,直接运行,大大提高了速度,KVM通过/dev/kvm暴露接口,用户态程序可以通过ioctl函数来访问这个接口。见如下伪代码:
1
2
3
4
5
6
7
8
9
10
|
open( "/dev/kvm" ) ioctl(KVM_CREATE_VM) ioctl(KVM_CREATE_VCPU) for (;;) { ioctl(KVM_RUN) switch (exit_reason) { case KVM_EXIT_IO: case KVM_EXIT_HLT: } } |
KVM内核模块本身只能提供CPU和内存的虚拟化,所以它必须结合QEMU才能构成一个完成的虚拟化技术,这就是下面要说的qemu-kvm。
qemu-kvm
Qemu将KVM整合进来,通过ioctl调用/dev/kvm接口,将有关CPU指令的部分交由内核模块来做。kvm负责cpu虚拟化+内存虚拟化,实现了cpu和内存的虚拟化,但kvm不能模拟其他设备。qemu模拟IO设备(网卡,磁盘等),kvm加上qemu之后就能实现真正意义上服务器虚拟化。因为用到了上面两个东西,所以称之为qemu-kvm。
Qemu模拟其他的硬件,如Network, Disk,同样会影响这些设备的性能,于是又产生了pass through半虚拟化设备virtio_blk, virtio_net,提高设备性能。
libvirt
libvirt是目前使用最为广泛的对KVM虚拟机进行管理的工具和API。Libvirtd是一个daemon进程,可以被本地的virsh调用,也可以被远程的virsh调用,Libvirtd调用qemu-kvm操作虚拟机。
简单的讲,openstack nova最核心的功能就是对一大堆的虚拟机进行管理,虚拟机可以是各种各样(kvm, qemu, xen, vmware...),而且管理的方法也可以是各种各样(libvirt, xenapi, vmwareapi...),因为我的电脑不支持CPU的VT,而且以前在visualbox中装OpenStack,也只能使用qemu,所以这次测试的主要是qemu的使用,另外nova中默认使用的管理虚拟机的API是libvirt,所以这里的测试使用libvirt。
首先来简单说一下我对libvirt和qemu这两个的理解:
1. libvirt
libvirt是一套用C语言写的API,旨在为各种虚拟机提供一套通用的编程接口,而且支持与Java,Python等语言的绑定。基于libvirt的虚拟机管理工具也有很多:virt-manager(GUI工具),virsh(命令行工具)。其架构示意图如下:
(左图是没有使用libvirt的情况)
这里涉及到几个概念:
(1)Domain:虚拟机的一个运行实例,简单的理解,就是一个虚拟机虚拟出来的操作系统。它的叫法可是多种多样:instance,guest OS,virsual machine,其实都指的同一个概念。
(2)Hypervisor:指的就是虚拟机本身,比如qemu, kvm, xen...
libvirt
由几个不同的部分组成,其中包括应用程序编程接口 (API) 库、一个守护进程 (libvirtd
),以及一个默认命令行实用工具 (virsh
),libvirtd守护进程负责对虚拟机的管理工作,在用各种工具对虚拟机进行管理的时候,这个守护进程一定要跑起来,而且这个进程可以分为两种,一种是root权限的libvirtd,一种是普通用户权限的libvirtd,前者权限大,可以虚拟计算机的各种设备。
开启root权限的libvirtd守护进程要以root身份去运行:sudo libvirtd --daemon
2. qemu
qemu是一个仿真器,即可用于来宾操作系统的虚拟化,也可以作为完整的机器仿真器使用,运行使用主机 CPU 或其他 CPU 架构的操作系统。
qemu 支持两种操作模式:用户模式仿真和系统模式仿真。用户模式仿真 允许一个 CPU 构建的进程在另一个 CPU 上执行(执行主机 CPU 指令的动态翻译并相应地转换 Linux 系统调用)。系统模式仿真 允许对整个系统进行仿真,包括处理器和配套的外围设备,这时就应该使用root权限的libvirtd。
qemu相关的命令:
- $ qemu-img create -f qcow disk.img 128M
创建一个名为disk.img的128M大小的qcow格式的磁盘映像文件,这个文件充当来宾操作系统的硬盘。
- $ qemu -hda disk.img -cdrom /root/cflinux-1.0.iso -boot d
-hda指定磁盘映像文件,-cdrom指定光盘镜像文件,-boot指定从哪里引导系统,d是从CD-ROM引导,c表示从硬盘引导
- $ qemu -hda disk.img
开始启动来宾操作系统
接下来,使用visual manager工具来模仿一下openstack中Flat模式的网络,因为我在安装openstack的时候,最后一步总是无法ping或ssh上实例,所以这里通过对实例的直接操作来进行演示,其网络拓扑图如下:
(网络是我的一大浩劫,一遇到和网络相关的东西,立马就纠结了,网桥,路由,网关,网段,交换机,nat,dhcp等等,这些东西不实践一下,完全弄不明白他们是干什么的,还好,通过这一段时间的学习,基本上知道了怎么回事,开学之后,一定要补一下网络知识。)
从开始安装,到今晚之前,在这个拓扑图里,一直有一个不懂的东西,就是那个br100!原来它就是传说中的网桥,网卡可以桥接到这个网桥上,来连接两个局域网。网桥工作在物理链路层,相当于一个“低层”的路由器,通过mac帧来识别主机,所以桥接到这个网桥上的网卡是不需要配ip的,这解开了我“多年”的疑惑:为什么那个eth1不需要配ip啊?那两个局域网是怎么连到一块的?原来如此!
还有一个困惑就是多网卡的问题,一直不明白,为什么一台电脑要多个网卡,一个网卡不够用吗?原来真的不够用!一个网卡只能负责接入到一个网络,如果一个电脑要同时接入多个网络的话,那么就得用多个网卡了,也就是说一台电脑可以同时处于不同的局域网中。那这样的话,以前在我脑海中,一台电脑在网络中的身份是唯一的,这样的概念就不成立了啊,一台电脑也可以有多个身份,是由网卡决定的。
好了,吐槽完毕,下面是我模拟的简单的拓扑图:
我的目的就是让host能ping通任意一个虚拟机,虚拟机之间能够相互ping通,并且host能ssh上任意一个虚拟机。
1. 首先要做的就是建立br100网桥,在安装nova时,这个网桥是自动创建的,这里来手动创建,创建网桥使用到的工具是bridge-utils,即使用brctl相关的命令:
- $ brctl addbr br100 #添加一个网桥
- $ brctl addif br100 eth0 #把网卡桥接到网桥上
- $ ifconfig eth0 0.0.0.0
- $ ifconfig br100 10.0.0.1 #给网桥配ip
eth0的ip可配可不配。这样创建的网桥不是永久的,系统重启的话,就会销毁了。
2. 建立虚拟机:
用visual manager建立3个虚拟机,我用的系统镜像是cflinux-1.0.iso,一个只有几兆的linux发行版,磁盘映像是用virtual manager创建的raw格式的image。
需要注意的是在第5步选择网络的时候,要选“specify shared device name”,然后在下面的输入框中输入刚刚创建好的网桥的名字:br100,如下图:
3. 改虚拟机的ip
不知道为什么visual manager创建的虚拟机初识状态的ip都是一样的,都是10.0.0.2,使用ifconfig命令把3个虚拟机的ip改为:
10.0.0.2 10.0.0.3 10.0.0.4
让他们在同一个网段。
这样,主机可以ping通实例,实例之间也可以相互ping通了,通过ssh root@10.0.0.2也能连上虚拟机了!
问题:
每次虚拟机启动之后,用ifconfig在主机上查询网络信息,会看到vnet0, vnet1等这些信息,还有virbr0, virbr1等,后者我知道表示的是一个网段,但是前者是做什么用的呢?是虚拟机的虚拟出来的网卡吗?
如果您愿意花几块钱请我喝杯茶的话,可以用手机扫描下方的二维码,通过 支付宝 捐赠。我会努力写出更好的文章。
(捐赠不显示捐赠者的个人信息,如需要,请注明您的联系方式)
Thank you for your kindly donation!!
深入浅出 kvm qemu libvirt的更多相关文章
- KVM+Qemu+Libvirt实战
上一篇的文章是为了给这一篇文件提供理论的基础,在这篇文章中我将带大家一起来实现在linux中虚拟出ubuntu的server版来 我们需要用KVM+Qemu+Libvirt来进行kvm全虚拟化,创建虚 ...
- kvm/qemu/libvirt学习笔记 (1) qemu/kvm/libvirt介绍及虚拟化环境的安装
kvm简介 kvm最初由Quramnet公司开发,2008年被RedHat公司收购.kvm全称基于内核的虚拟机(Kernel-based Virtual Machine),它是Linux的一个内核模块 ...
- KVM/QEMU/qemu-kvm/libvirt 概念全解
目录 目录 前言 KVM QEMU KVM 与 QEMU qemu-kvm Libvirt Libvirt 在 OpenStack 中的应用 前言 如果是刚开始接触虚拟机技术的话, 对上述的概念肯定会 ...
- KVM&Libvirt基本概念及开发杂谈
导读 大家好,本次肖力分享的主题是KVM&Libvirt基本概念及开发杂谈,内容有些凌乱松散,主要基于自己早期整理的笔记内容和实践感悟,有些内容难免有失偏颇,望见谅.前面先介绍下需要了解的基本 ...
- KVM/QEMU桥接网络设置及kvm资料
KVM/QEMU桥接网络设置 配置kvm的网络有2种方法.其一,默认方式为用户模式网络(Usermode Networking),数据包由NAT方式通过主机的接口进行传送.其二,使用桥接方式(Brid ...
- KVM+QEMU虚拟化概念
概念: KVM,即Kernel-basedvirtual machine,由redhat开发,是一种开源.免费的虚拟化技术.对企业来说,是一种可选的虚拟化解决方案. 定义:基于Linux内核的虚拟机 ...
- kvm/qemu虚拟机桥接网络创建与配置
首先阐述一下kvm与qemu的关系,kvm是修改过的qemu,而且使用了硬件支持的仿真,仿真速度比QEMU快. 配置kvm/qemu的网络有两种方法.其一,默认方式为用户模式网络(Usermode N ...
- gentoo在KVM+QEMU中安装笔记
gentoo是比较难安装的,本笔记主要是记录本次安装过程,以备参考. 1.首先,下载镜像,可以去国内各大镜像网站下载,我选择的是清华的镜像源:https://mirrors.tuna.tsinghua ...
- KVM 介绍(5):libvirt 介绍 [ Libvrit for KVM/QEMU ]
学习 KVM 的系列文章: (1)介绍和安装 (2)CPU 和 内存虚拟化 (3)I/O QEMU 全虚拟化和准虚拟化(Para-virtulizaiton) (4)I/O PCI/PCIe设备直接分 ...
随机推荐
- SonarQube学习入门指南
1. 什么是SonarQube? SonarQube 官网:https://www.sonarqube.org/ SonarQube®是一种自动代码审查工具,用于检测代码中的错误,漏洞和代码异味.它可 ...
- Atitit 项目的主体设计与结构文档 v5
Atitit 项目的主体设计与结构文档 v5 1. 版本历史说明2 2. 功能大概说明2 3. 实现的目标3 3.1. cross device跨设备(pc 手机 平板)3 3.2. cross sc ...
- vue-cli项目配置图解
配置vue项目机构步骤1.搭建环境:node.npm2.安装vue脚手架工具:npm install -g vue-cli3.初始化项目:vue init webpack vuedemo(“vuede ...
- (原创)c++11改进我们的程序之垃圾回收
c#和java中有自动垃圾回收机制,.net运行时和java虚拟机可以管理分配的堆内存,在对象失去引用时自动回收,因此在c#和jva中, 内存管理不是大问题.c++语言没有垃圾回收机制,必须自己去释放 ...
- asp.net mvc controller调用js
在controller中加入代码 ViewBag.js="<script>alert('弹出框');</script>"; 在视图中加入代码 @Html.R ...
- 移动web开发(一)——移动web开发必备知识
参考: 移动终端开发必备知识.http://isux.tencent.com/mobile-development-essential-knowledge.html
- 2. DNN神经网络的反向更新(BP)
1. DNN神经网络的前向传播(FeedForward) 2. DNN神经网络的反向更新(BP) 3. DNN神经网络的正则化 1. 前言 DNN前向传播介绍了DNN的网络是如何的从前向后的把数据传递 ...
- Faiss教程:GPU
Fassi通过CUDA支持GPU,要求3.5以上算力,float16要求CUDA7.5+ 通过index_gpu_to_cpu可以将索引从GPU复制到CPU,index_cpu_to_gpu 和 in ...
- burpsuite两个变量的爱情故事
抓包的时候在攻击类型处选择[Cluster bomb] 在payload type这里设置类型为[simple list] 第一个是账号 第二个是密码 分批加载即可
- java基础篇---文件上传(commons-FileUpload组件)
上一篇讲解了smartupload组件上传,那么这一篇我们讲解commons-FileUpload组件上传 FileUpload是Apache组织(www.apache.org)提供的免费的上传组件, ...