openstack预备知识---虚拟化

一、虚拟化

1、什么是虚拟化?

虚拟化使得在一台物理的服务器上可以跑多台虚拟机,虚拟机共享物理机的 CPU、内存、IO 硬件资源,但逻辑上虚拟机之间是相互隔离的。

物理机我们一般称为宿主机(Host),宿主机上面的虚拟机称为客户机(Guest)。

那么 Host 是如何将自己的硬件资源虚拟化,并提供给 Guest 使用的呢?

这个主要是通过一个叫做 Hypervisor 的程序实现的。

2、虚拟化的分类

根据 Hypervisor 的实现方式和所处的位置,虚拟化又分为两种:

1)1型虚拟化

Hypervisor 直接安装在物理机上,多个虚拟机在 Hypervisor 上运行。Hypervisor 实现方式一般是一个特殊定制的 Linux 系统。Xen 和 VMWare 的 ESXi 都属于这个类型。

2)2型虚拟化

物理机上首先安装常规的操作系统,比如 Redhat、Ubuntu 和 Windows。Hypervisor 作为 OS 上的一个程序模块运行,并对管理虚拟机进行管理。KVM、VirtualBox 和 VMWare Workstation 都属于这个类型。

两种类型的对比:

1型虚拟化一般对硬件虚拟化功能进行了特别优化,性能上比2型要高;

2型虚拟化因为基于普通的操作系统,会比较灵活,比如支持虚拟机嵌套。嵌套意味着可以在KVM虚拟机中再运行KVM。

3、KVM

1)基本概念

KVM 全称是 Kernel-Based Virtual Machine。也就是说 KVM 是基于 Linux 内核实现的。

KVM有一个内核模块叫 kvm.ko,只用于管理虚拟 CPU 和内存。

那 IO 的虚拟化,比如存储和网络设备由谁实现呢?

这个就交给 Linux 内核和Qemu来实现。

说白了,作为一个 Hypervisor,KVM 本身只关注虚拟机调度和内存管理这两个方面。IO 外设的任务交给 Linux 内核和 Qemu。

2)Libvirt

Libvirt 是啥? 简单说就是 KVM 的管理工具。

其实,Libvirt 除了能管理 KVM 这种 Hypervisor,还能管理 Xen,VirtualBox 等。

OpenStack 底层也使用 Libvirt。

Libvirt 包含 3 个东西:后台 daemon 程序 libvirtd、API 库和命令行工具 virsh

libvirtd是服务程序,接收和处理 API 请求;

API 库使得其他人可以开发基于 Libvirt 的高级工具,比如 virt-manager,这是个图形化的 KVM 管理工具;

virsh 是我们经常要用的 KVM 命令行工具,后面会有使用的示例。

3)KVM实际操作

a、准备KVM实验环境

b、启动第一个虚机

c、远程管理虚机

4)KVM虚拟化原理

a、CPU虚拟化

一个 KVM 虚机在宿主机中其实是一个 qemu-kvm 进程,与其他 Linux 进程一样被调度。

虚机中的每一个虚拟 vCPU 则对应 qemu-kvm 进程中的一个线程。

虚机的 vCPU 总数可以超过物理 CPU 数量,这个叫 CPU overcommit(超配)。

KVM 允许 overcommit,这个特性使得虚机能够充分利用宿主机的 CPU 资源,但前提是在同一时刻,不是所有的虚机都满负荷运行。

b、内存虚拟化

KVM 通过内存虚拟化共享物理系统内存,动态分配给虚拟机。

为了在一台机器上运行多个虚拟机,KVM 需要实现 VA(虚拟内存) -> PA(物理内存) -> MA(机器内存)直接的地址转换。

虚机 OS 控制虚拟地址到客户内存物理地址的映射 (VA -> PA),但是虚机 OS 不能直接访问实际机器内存,因此 KVM 需要负责映射客户物理内存到实际机器内存 (PA -> MA)。

c、存储虚拟化

KVM 的存储虚拟化是通过存储池(Storage Pool)和卷(Volume)来管理的。

Storage Pool 是宿主机上可以看到的一片存储空间,可以是多种类型。

Volume 是在 Storage Pool 中划分出的一块空间,宿主机将 Volume 分配给虚拟机,Volume 在虚拟机中看到的就是一块硬盘。

a)目录类型的 Storage Pool

b)LVM类型的 Storage Pool

c)其他类型的Storage Pool

d、网络虚拟化

a)Linux Bridge

(a)基本概念

假设宿主机有 1 块与外网连接的物理网卡 eth0,上面跑了 1 个虚机 VM1,现在有个问题是:

如何让 VM1 能够访问外网?

至少有两种方案

1)将物理网卡eth0直接分配给VM1,但随之带来的问题很多:

宿主机就没有网卡,无法访问了;

新的虚机,比如 VM2 也没有网卡。

2)推荐的方案:给 VM1 分配一个虚拟网卡 vnet0,通过 Linux Bridge br0 将 eth0 和 vnet0 连接起来

Linux Bridge 是 Linux 上用来做 TCP/IP 二层协议交换的设备,其功能大家可以简单的理解为是一个二层交换机或者 Hub。

多个网络设备可以连接到同一个 Linux Bridge,当某个设备收到数据包时,Linux Bridge 会将数据转发给其他设备。

在上面这个例子中,当有数据到达 eth0 时,br0 会将数据转发给 vnet0,这样 VM1 就能接收到来自外网的数据;

反过来,VM1 发送数据给 vnet0,br0 也会将数据转发到 eth0,从而实现了 VM1 与外网的通信。

(b)动手实践虚机网络

(c)理解virbr0

virbr0 是 KVM 默认创建的一个 Bridge,其作用是为连接其上的虚机网卡提供 NAT 访问外网的功能。

b)VLAN

LAN 表示 Local Area Network,本地局域网,通常使用 Hub 和 Switch 来连接 LAN 中的计算机。

一般来说,两台计算机连入同一个 Hub 或者 Switch 时,它们就在同一个 LAN 中。

一个 LAN 表示一个广播域。 其含义是:LAN 中的所有成员都会收到任意一个成员发出的广播包。

VLAN 表示 Virtual LAN。

一个带有 VLAN 功能的switch 能够将自己的端口划分出多个 LAN。

计算机发出的广播包可以被同一个 LAN 中其他计算机收到,但位于其他 LAN 的计算机则无法收到。

简单地说,VLAN 将一个交换机分成了多个交换机,限制了广播的范围,在二层将计算机隔离到不同的 VLAN 中。

举个例子:有两组机器,Group A 和 B。

我们想配置成 Group A 中的机器可以相互访问,Group B 中的机器也可以相互访问,但是 A 和 B 中的机器无法互相访问。

方法一:使用两个交换机,A 和 B 分别接到一个交换机。

方法二:使用一个带 VLAN 功能的交换机,将 A 和 B 的机器分别放到不同的 VLAN 中。

请注意:

VLAN 的隔离是二层上的隔离,A 和 B 无法相互访问指的是二层广播包(比如 arp)无法跨越 VLAN 的边界。

但在三层(比如IP)上是可以通过路由器让 A 和 B 互通的。概念上一定要分清。

现在的交换机几乎都是支持 VLAN 的。

通常交换机的端口有两种配置模式: Access 和 Trunk。

Access 口

这些端口被打上了 VLAN 的标签,表明该端口属于哪个 VLAN。

不同 VLAN 用 VLAN ID 来区分,VLAN ID 的 范围是 1-4096。

Access 口都是直接与计算机网卡相连的,这样从该网卡出来的数据包流入 Access 口后就被打上了所在 VLAN 的标签。

Access 口只能属于一个 VLAN。

Trunk 口

假设有两个交换机 A 和 B。

A 上有 VLAN1(红)、VLAN2(黄)、VLAN3(蓝);B 上也有 VLAN1、2、3

那如何让 AB 上相同 VLAN 之间能够通信呢?

办法是将 A 和 B 连起来,而且连接 A 和 B 的端口要允许 VLAN1、2、3 三个 VLAN 的数据都能够通过。这样的端口就是Trunk口了。

VLAN1、2、3 的数据包在通过 Trunk 口到达对方交换机的过程中始终带着自己的 VLAN 标签。

现在看看 KVM 虚拟化环境下是如何实现 VLAN 的

eth0 是宿主机上的物理网卡,有一个命名为 eth0.10 的子设备(软件实现了一个交换机(当然是虚拟的))与之相连。

eth0.10 就是 VLAN 设备了,其 VLAN ID 就是 VLAN 10。

eth0.10 挂在命名为 brvlan10 的 Linux Bridge 上,虚机 VM1 的虚拟网卡 vent0 也挂在 brvlan10 上。

这样的配置其效果就是:

宿主机用软件实现了一个交换机(当然是虚拟的),上面定义了一个 VLAN10。

eth0.10,brvlan10 和 vnet0 都分别接到 VLAN10 的 Access口上。

而 eth0 就是一个 Trunk 口。

VM1 通过 vnet0 发出来的数据包会被打上 VLAN10 的标签。

eth0.10 的作用是:定义了 VLAN10

brvlan10 的作用是:Bridge 上的其他网络设备自动加入到 VLAN10 中

c)Linux Bridge + VLAN = 虚拟交换机

对 KVM 的网络虚拟化做个总结。

1、物理交换机存在多个 VLAN,每个 VLAN 拥有多个端口。

同一 VLAN 端口之间可以交换转发,不同 VLAN 端口之间隔离。

所以交换机其包含两层功能:交换与隔离。

2、Linux 的 VLAN 设备实现的是隔离功能,但没有交换功能。

一个 VLAN 母设备(比如 eth0)不能拥有两个相同 ID 的 VLAN 子设备,因此也就不可能出现数据交换情况。

3、Linux Bridge 专门实现交换功能。

将同一 VLAN 的子设备都挂载到一个 Bridge 上,设备之间就可以交换数据了。

总结起来,Linux Bridge 加 VLAN 在功能层面完整模拟现实世界里的二层交换机。

eth0 相当于虚拟交换机上的 trunk 口,允许 vlan10 和 vlan20 的数据通过;

eth0.10,vent0 和 brvlan10 都可以看着 vlan10 的 access 口

eth0.20,vent1 和 brvlan20 都可以看着 vlan20 的 access 口

二、云计算

1、基本概念

计算(CPU/内存)、存储和网络是 IT 系统的三类资源。

通过云计算平台,这三类资源变成了三个池子。

当需要虚机的时候,只需要向平台提供虚机的规格。

平台会快速从三个资源池分配相应的资源,部署出这样一个满足规格的虚机。

虚机的使用者不再需要关心虚机运行在哪里,存储空间从哪里来,IP是如何分配,这些云平台都搞定了。

云平台是一个面向服务的架构,按照提供服务的不同分为 IaaS、PaaS 和 SaaS。

(1)IaaS(Infrastructure as a Service)基础设施即服务;提供的服务是虚拟机。

IaaS 负责管理虚机的生命周期,包括创建、修改、备份、启停、销毁等。

使用者从云平台得到的是一个已经安装好镜像(操作系统+其他预装软件)的虚拟机。

使用者需要关心虚机的类型(OS)和配置(CPU、内存、磁盘),并且自己负责部署上层的中间件和应用。

典型的 IaaS 例子有 AWS、Rackspace、阿里云等

(2)PaaS(Platform as a Service)平台即服务;提供的服务是应用的运行环境和一系列中间件服务(比如数据库、消息队列等)。

使用者只需专注应用的开发,并将自己的应用和数据部署到PaaS环境中。

PaaS负责保证这些服务的可用性和性能。

典型的 PaaS 有 Google App Engine、IBM BlueMix 等

(3)SaaS(Software as a Service)软件即服务;提供的是应用服务。

使用者只需要登录并使用应用,无需关心应用使用什么技术实现,也不需要关系应用部署在哪里。

SaaS的使用者通常是应用的最终用户。

典型的 SaaS 有 Google Gmail、Salesforce 等

2、云计算和openstack

OpenStack is a cloud operating system that controls large pools of compute, storage, and networking resources throughout a datacenter, all managed through a dashboard that gives administrators control while empowering their users to provision resources through a web interface.

以上是官网对 OpenStack 的定义,OpenStack 对数据中心的计算、存储和网络资源进行统一管理。

由此可见,OpenStack 针对的是 IT 基础设施,是 IaaS 这个层次的云操作系统。

原文地址:http://blog.51cto.com/10630401/2121520

时间: 2024-10-13 23:46:01

openstack预备知识---虚拟化的相关文章

这技术太纯了|5分钟学会OpenStack 基础知识(转)

原文地址:http://mt.sohu.com/20160511/n448800357.shtml ——<从入门到精通云服务器>第六讲 前五期的<从入门到精通云服务器>受到了广泛好评,收到留言,有很多读者对云计算相关的技术非常感兴趣.应观众要求,我们这期要安利一条纯技术内容.准备好瓜子.花生,随小编一起进入OpenStack 基础知识大讲堂吧. 了解OpenStack OpenStack 是最火的开源软件之一,活跃度呈指数级别上升:它是一组开源项目,诞生之初是由两个项目组成,目前十

[转]预备知识—程序的内存分配

因为经典,所以转发. 一.预备知识—程序的内存分配 一个由C/C++编译的程序占用的内存分为以下几个部分 栈区(stack)  —   由编译器自动分配释放,存放函数的参数值,局部变量的值等.其操作方式类似于数据结构中的栈. 堆区(heap)   —   一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回    收.注意它与数据结构中的堆是两回事,分配方式倒是类似于链表. 全局区(静态区)(static) —,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,

word2vec 中的数学原理详解(二)预备知识

  word2vec 是 Google 于 2013 年开源推出的一个用于获取 word vector 的工具包,它简单.高效,因此引起了很多人的关注.由于 word2vec 的作者 Tomas Mikolov 在两篇相关的论文 [3,4] 中并没有谈及太多算法细节,因而在一定程度上增加了这个工具包的神秘感.一些按捺不住的人于是选择了通过解剖源代码的方式来一窥究竟,出于好奇,我也成为了他们中的一员.读完代码后,觉得收获颇多,整理成文,给有需要的朋友参考. 相关链接 (一)目录和前言 (二)预备知

《软件调试的艺术》笔记--预备知识

1.gcc的-g选项 如果要使用gdb进行调试,必须在编译时在gcc中加入-g选项,使用参数 -g 表示将源代码信息编译到可执行文件中. 如果不使用-g选项: #include <stdio.h> int main(void) { int i = 1; i = i + 1; printf("i = %d\n",i); return 0; } gcc main.c gdb a.out (gdb) b main Breakpoint 1 at 0x4004f8 (gdb) r

最大熵学习笔记(一)预备知识

  生活中我们经常听到人们说"不要把鸡蛋放到一个篮子里",这样可以降低风险.深究一下,这是为什么呢?其实,这里边包含了所谓的最大熵原理(The Maximum Entropy Principle).本文为一则读书笔记,将对最大熵原理以及由此导出的最大熵模型进行介绍,重点给出其中所涉及数学公式的理解和详细推导. 相关链接 最大熵学习笔记(零)目录和引言 最大熵学习笔记(一)预备知识 最大熵学习笔记(二)最大熵原理 最大熵学习笔记(三)最大熵模型 最大熵学习笔记(四)模型求解 最大熵学习笔

【转】关于LIS和一类可以用树状数组优化的DP 预备知识

原文链接 http://www.cnblogs.com/liu-runda/p/6193690.html 预备知识 DP(Dynamic Programming):一种以无后效性的状态转移为基础的算法,我们可以将其不严谨地先理解为递推.例如斐波那契数列的递推求法可以不严谨地认为是DP.当然DP的状态也可以是二维/三维的,某一维的含义也不仅仅是指某个数列的第几项. 树状数组(BIT or fenwick tree):一种高效地动态维护一个序列并动态求取前缀和的数据结构.修改某个元素/求一次前缀和的

C++ primer plus读书笔记——第1章 预备知识

第1章 预备知识 1. Ritchie希望有一种语言能将低级语言的效率.硬件访问能力和高级语言的通用性.可移植性融合在一起,于是他在旧语言的基础上开发了C语言. 2. 在C++获得一定程度的成功后,Stroustrup才添加了模版,这使得进行泛型编程成为可能. 3. Linux中要支持C++11,编译源文件时要使用-std = c++0x选项: g++ -std = c++0x use_auto.cpp 4. 程序执行完毕后,有些IDE自动关闭窗口,而有些IDE不关闭.为查看输出,可以在程序的最

android金阳光自动化测试——学习历程:自动化预备知识上&amp;&amp;下

章节:自动化基础篇——自动化预备知识上&&下 网易云课堂: 上:http://study.163.com/course/courseLearn.htm?courseId=712011#/learn/video?lessonId=877113&courseId=712011 下:http://study.163.com/course/courseLearn.htm?courseId=712011#/learn/video?lessonId=877114&courseId=71

Qt DLL总结【一】-链接库预备知识

1.链接库概念 静态链接库和动态链接库介绍 我们可以创建一种文件里面包含了很多函数和变量的目标代码,链接的时候只要把这个文件指示给链接程序就自动地从文件中查找符合要求的函数和变量进行链接,整个查找过程根本不需要我们操心. 这个文件叫做 "库(Libary)",平时我们把编译好的目标代码存储到"库"里面,要用的时候链接程序帮我们从库里面找出来. 静态链接库: 在早期库的组织形式相对简单,里面的目标代码只能够进行静态链接,所以我们称为"静态库",静态