OpenStack分析报告.docx

上传人:b****5 文档编号:7875262 上传时间:2023-01-26 格式:DOCX 页数:42 大小:1.71MB
下载 相关 举报
OpenStack分析报告.docx_第1页
第1页 / 共42页
OpenStack分析报告.docx_第2页
第2页 / 共42页
OpenStack分析报告.docx_第3页
第3页 / 共42页
OpenStack分析报告.docx_第4页
第4页 / 共42页
OpenStack分析报告.docx_第5页
第5页 / 共42页
点击查看更多>>
下载资源
资源描述

OpenStack分析报告.docx

《OpenStack分析报告.docx》由会员分享,可在线阅读,更多相关《OpenStack分析报告.docx(42页珍藏版)》请在冰豆网上搜索。

OpenStack分析报告.docx

OpenStack分析报告

产品名称OpenStack

密级Confidentialitylevel

YGCloudPlatform

产品版本ProductLang

Totalpages共页

OpenStack

分析报告

Preparedby

拟制

Date

日期

Reviewedby

评审人

Date

日期

Approvedby

批准

Date

日期

YuguangTechnologiesCo.,Ltd.

宇光虚拟网络技术有限公司

(forinternaluseonly)

(仅供内部使用)

RevisionRecord修订记录

Date

日期

RevisionLang

修订

版本

CRID/DefectID

CR号

SecNo.

修改

章节

ChangeDescription

修改描述

Author

作者

1.引言

1.1.编写目的

深入分析OpenStack项目及相关技术,为后续研发做技术储备。

关于OpenStack项目总体概念说明请参考其它文档。

预期读者为所有对OpenStack感兴趣人员。

1.2.定义

《宇光锐云-术语表.doc》

《OpenStack-术语表.xlsx》

1.3.参考资料

《OpenStack研究报告.docx》

2.Openstack概览

2.1.功能简介

Nova是OpenStack云计算架构控制器,支持OpenStack云内的实例的生命周期所需的所有活动由Nova处理。

Nova作为管理平台管理着OpenStack云里的计算资源、网络、授权、和扩展需求。

但是,Nova不能提供本身的虚拟化功能,相反,它使用libvirt的API来支持虚拟机管理程序交互。

Nova通过web服务接口开放他的所有功能并兼容亚马逊web服务的EC2接口。

OpenStack云控制器和其他nova组件通信像调度器、网络控制器、通过AMQP的卷控制器(高级信息队列协议)。

Nova使用异步调用请求响应,一旦收到响应即获得回拨触发。

自从使用了异步通信,没有用户的操作会长期处于等待状态。

这是特别有用的,因为对API的许多动作调用有期待,如启动一个实例或上传镜像的时间消耗。

2.2.版本历史

2.3.关于命名

OpenStack发布版本号使用YYYYY.N(年.次)方案。

例如2012年第一次发布版本号为2012.1。

在开发周期内,同时使用对应代码名称。

这类名称是OpenStack设计小组附近城市的名称,而且以字母顺序排列。

Austin:

第一次设计小组工作的地方,德州奥斯汀;

Bexar:

第二次设计小组工作的地方,圣安东尼奥市(美国得克萨斯州南部城市);

Cactus:

德克萨斯州(美国州名);

Diablo:

圣克拉拉(美国加利福尼亚州西部城市);

Essex:

波士顿附近的一座城市;

Folsom:

旧金山附近的一座城市;

Grizzly:

与加利福尼亚相交。

2.4.OpenStack模块组成

2.5.OpenStack架构

2.6.OpenStack调用流程

2.7.OpenStack相关扩展

3.libvirt分析

OpenStack-nova中默认使用的管理虚拟机的API是libvirt,所以对libvirt结构进行深入的分析总结,有利于理解Openstack实现机制。

libvirt提供一种虚拟机监控程序不可知的API来安全管理运行于主机上的来宾操作系统。

libvirt本身不是一种工具,它是一种可以建立工具来管理来宾操作系统的API。

libvirt本身构建于一种抽象的概念之上。

它为受支持的虚拟机监控程序实现的常用功能提供通用的API。

libvirt起初是专门为Xen设计的一种管理API,后来被扩展为可支持多个虚拟机监控程序。

1

2

2.1系统简介

libvirt以一组API的形式存在,旨在供管理应用程序使用。

libvirt通过一种特定于虚拟机监控程序的机制与每个有效虚拟机监控程序进行通信,以完成API请求。

libvirt将物理主机称作节点,将来宾操作系统称作域。

libvirt比较和用例模型

2.1.1控制方式

使用libvirt,我们有两种不同的控制方式。

第一种如上图所示,其中管理应用程序和域位于同一节点上。

在本例中,管理应用程序通过libvirt工作,以控制本地域。

当管理应用程序和域位于不同节点上时,便产生了另一种控制方式。

在本例中需要进行远程通信。

该模式使用一种运行于远程节点上、名为libvirtd的特殊守护进程。

当在新节点上安装libvirt时该程序会自动启动,且可自动确定本地虚拟机监控程序并为其安装驱动程序(稍后讨论)。

该管理应用程序通过一种通用协议从本地libvirt连接到远程libvirtd。

对于QEMU,协议在QEMU监视器处结束。

QEMU包含一个监测控制台,它允许检查运行中的来宾操作系统并控制虚拟机(VM)各部分。

使用libvirtd控制远程虚拟机监控程序

2.1.2虚拟机监控程序支持

为支持各种虚拟机监控程序的可扩展性,libvirt实施一种基于驱动程序的架构,该架构允许一种通用的API以通用方式为大量潜在的虚拟机监控程序提供服务。

这意味着,一些虚拟机监控程序的某些专业功能在API中不可见。

另外,有些虚拟机监控程序可能不能实现所有API功能,因而在特定驱动程序内被定义为不受支持。

下图展示了libvirtAPI与相关驱动程序的层次结构。

这里需要注意,libvirtd提供从远程应用程序访问本地域的方式。

基于驱动程序的libvirt架构

 

2.2源码架构

libvirt是由c语言开发的开源项目,由于源码不断的更新代码规模及结构也会不断变化,本文档针对libvirt-0.9.3。

2.2.1项目参量

代码规模可做为对该项目源码的粗略了解,详见下表:

Classes:

18

Files:

845

ProgramUnits:

8328

Lines:

426139

LinesBlank:

57548

LinesCode:

237946

LinesComment:

52314

LinesInactive:

66391

ExecutableStatements:

130083

DeclarativeStatements:

:

44041

RatioComment/Code:

0.22

2.2.2源码分类

对于一个开源项目,源码规模只能展现比较粗略的结构,下面对源码进行更细致的分类:

图.libvirt-0.9.3源码分类

2.2.3目录结构

libvirt项目源代码组织清晰规范,不同功能代码会分别存储在独立的目录中。

首先对libvirt代码目录结构做一个全面的认识:

图libvirt-0.9.3目录结构

●gnulib:

linux三个标准库之一;

●tools:

vrish工具;

●python:

语言绑定;

●docs:

文档源码;

●examples:

调用libvirtapi示例源码;

●include:

libvirt对外发布标准头文件;

●daemon:

libvirtd守护进程;

●src:

主框架、驱动、配置、工具类目录;

图libvirt完整目录间调用关系

2.2.4系统架构

libivrt跨平台特性与子驱动支持开关通过预编译宏控制。

libvirt主体架构与Facade(外观模式)相对应,为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。

图Facade(外观模式)结构图

当你要为一个复杂子系统提供一个简单接口时。

子系统往往因为不断演化而变得越来越复杂。

大多数模式使用时都会产生更多更小的类。

这使得子系统更具可重用性,也更容易对子系统进行定制,但这也给那些不需要定制子系统的用户带来一些使用上的困难。

Facade可以提供一个简单的缺省视图,这一视图对大多数用户来说已经足够,而那些需要更多的可定制性的用户可以越过facade层。

客户程序与抽象类的实现部分之间存在着很大的依赖性。

引入facade将这个子系统与客户以及其他的子系统分离,可以提高子系统的独立性和可移植性。

当你需要构建一个层次结构的子系统时,使用facade模式定义子系统中每层的入口点。

如果子系统之间是相互依赖的,你可以让它们仅通过facade进行通讯,从而简化了它们之间的依赖关系。

libvirt核心的三个元素为:

统一对外接口、子驱动管理、子驱动操作。

下图展现了这三者之间的调用、依赖关系:

图libvirt\src调用、依赖关系、

1

2

2.1

2.2

2.2.1

2.2.2

2.2.3

2.2.4

2.2.4.1发布接口

libvirt.h定义了一致的对外接口,libvirt.c实现了所有接口,并且在接口中调用统一驱动界面封装业务逻辑。

图libvirt.c/h提供对外发布接口

另外libvirt还提供了一套shell工具-virsh,主要由virsh.c实现。

virsh是一个独立的工具,能来通过命令操作libvirt。

virsh的主要结构为定义了具体命令指针数组,接收到shell命令后对命令进行解析,然后在命令指针数组中搜索对应命令,摸索到命令后执行该命令对应的函数,如未搜索到则给出错误提示。

当然virsh具体的执行底层接口与libvirt.c是一致的。

virsh.c内部调用关系图如下:

2.2.4.2子驱动管理

libvirt将子驱动做了抽象的分类,每一类驱动统一一致的接口,供libvirt.c调用,而每级子驱动则像自身加载至子驱动管理模型中,由此做到上下层间充分解耦。

在Driver.h文件中定义的驱动类型如下:

图libvirt在driver.h中所定义的驱动类型

每一类驱动定义一组包括个性化数据及函数指针的struct,关联至virConnect对象,而virConnect对象在客户调用libivrt连接函数时创建,做为加载驱动的入口执行。

virConnect内部定义了所有驱动类型的地址,加载子驱动时根据参数类型,从全局驱动数组中遍历符合要求的子驱动,virConnect定义如下:

/**

*_virConnect:

*

*Internalstructureassociatedtoaconnection

*/

struct_virConnect{

/*Allthevariablesfromhere,untilthe'lock'declaration

*aresetupattimeofconnectionopen,andneverchanged

*since.Thusnoneedtolockwhenaccessingthem

*/

unsignedintmagic;/*specificvaluetocheck*/

intflags;/*asetofconnectionflags*/

xmlURIPtruri;/*connectionURI*/

/*Theunderlyinghypervisordriverandnetworkdriver.*/

virDriverPtrdriver;

virNetworkDriverPtrnetworkDriver;

virInterfaceDriverPtrinterfaceDriver;

virStorageDriverPtrstorageDriver;

virDeviceMonitorPtrdeviceMonitor;

virSecretDriverPtrsecretDriver;

virNWFilterDriverPtrnwfilterDriver;

/*Privatedatapointerwhichcanbeusedbydriverand

*networkdriverastheywish.

*NB:

'private'isareservedwordinC++.

*/

void*privateData;

void*networkPrivateData;

void*interfacePrivateData;

void*storagePrivateData;

void*devMonPrivateData;

void*secretPrivateData;

void*nwfilterPrivateData;

/*

*Thelockmutexmustbeacquiredbeforeaccessing/changing

*anyofmembersfollowingthispoint,orchangingtheref

*countofanyvirDomain/virNetworkobjectassociatedwith

*thisconnection

*/

virMutexlock;

/*Per-connectionerror.*/

virErrorerr;/*thelasterror*/

virErrorFunchandler;/*associatedhandlet*/

void*userData;/*theuserdata*/

intrefs;/*referencecount*/

};

libvirt.c中定义了全局的子驱动数组,用来保存子驱动的接口信息,定义如下:

#defineMAX_DRIVERS20

staticvirDriverPtrvirDriverTab[MAX_DRIVERS];

staticintvirDriverTabCount=0;

staticvirNetworkDriverPtrvirNetworkDriverTab[MAX_DRIVERS];

staticintvirNetworkDriverTabCount=0;

staticvirInterfaceDriverPtrvirInterfaceDriverTab[MAX_DRIVERS];

staticintvirInterfaceDriverTabCount=0;

staticvirStorageDriverPtrvirStorageDriverTab[MAX_DRIVERS];

staticintvirStorageDriverTabCount=0;

staticvirDeviceMonitorPtrvirDeviceMonitorTab[MAX_DRIVERS];

staticintvirDeviceMonitorTabCount=0;

staticvirSecretDriverPtrvirSecretDriverTab[MAX_DRIVERS];

staticintvirSecretDriverTabCount=0;

staticvirNWFilterDriverPtrvirNWFilterDriverTab[MAX_DRIVERS];

staticintvirNWFilterDriverTabCount=0;

#ifdefWITH_LIBVIRTD

staticvirStateDriverPtrvirStateDriverTab[MAX_DRIVERS];

staticintvirStateDriverTabCount=0;

#endif

staticintinitialized=0;

目前版本所封装的具体驱动类型为:

虚拟化驱动(virDriverPtr)、虚拟网络驱动(virNetworkDriverPtr)、物理网卡驱(virInterfaceDriverPtr)、存储驱动(virStorageDriverPtr)、监控驱动(virDeviceMonitorPtr)、安全驱动(virSecretDriverPtr)、过滤驱动(virNWFilterDriverPtr)、状态驱动(virStateDriverPtr)。

以虚拟化驱动(virDriverPtr)驱动定义为例:

/**

*_virDriver:

*

*Structureassociatedtoavirtualizationdriver,definingthevarious

*entrypointsforit.

*

*Alldriversmustsupportthefollowingfields/methods:

*-no

*-name

*-open

*-close

*/

struct_virDriver{

intno;/*thenumbervirDrvNo*/

constchar*name;/*thenameofthedriver*/

virDrvOpenopen;

virDrvCloseclose;

virDrvDrvSupportsFeaturesupports_feature;

virDrvGetTypetype;

virDrvGetVersionversion;

virDrvGetLibVersionlibvirtVersion;

virDrvGetHostnamegetHostname;

virDrvGetSysinfogetSysinfo;

virDrvGetMaxVcpusgetMaxVcpus;

virDrvNodeGetInfonodeGetInfo;

virDrvGetCapabilitiesgetCapabilities;

virDrvListDomainslistDomains;

virDrvNumOfDomainsnumOfDomains;

virDrvDomainCreateXMLdomainCreateXML;

virDrvDomainLookupByIDdomainLookupByID;

virDrvDomainLookupByUUIDdomainLookupByUUID;

virDrvDomainLookupByNamedomainLookupByName;

virDrvDomainSuspenddomainSuspend;

virDrvDomainResumedomainResume;

virDrvDomainShutdowndomainShutdown;

virDrvDomainRebootdomainReboot;

virDrvDomainDestroydomainDestroy;

virDrvDomainGetOSTypedomainGetOSType;

virDrvDomainGetMaxMemorydomainGetMaxMemory;

virDrvDomainSetMaxMemorydomainSetMaxMemory;

virDrvDomainSetMemorydomainSetMemory;

virDrvDomainSetMemoryFlagsdomainSetMemoryFlags;

virDrvDomainSetMemoryParametersdomainSetMemoryParameters;

virDrvDomainGetMemoryParametersdomainGetMemoryParameters;

virDrvDomainSetBlkioParametersdomainSetBlkioParameters;

virDrvDomainGetBlkioParametersdomainGetBlkioParameters;

virDrvDomainGetInfodomainGetInfo;

virDrvDomainGetStatedomainGetState;

virDrvDomainGetControlInfodomainGetControlInfo;

virDrvDomainSavedomainSave;

virDrvDomainRestoredomainRestore;

virDrvDomainCoreDumpdomainCoreDump;

virDrvDomainScreenshotdomainScreenshot;

virDrvDomainSetVcpusdomainSetVcpus;

virDrvDomainSetVcpusFlagsdomainSetVcpusFlags;

virDrvDomainGetVcpusFlagsdomainGetVcpusFlags;

virDrvDomainPinVcpudomainPinVcpu;

virDrvDomainPinVcpuFlagsdomainPinVcpuFlags;

virDrvDomainGetVcpuPinInfodomainGetVcpuPinInfo;

virDrvDomainGetVcpusdomainGetVcpus;

virDrvDomainGetMaxVcpusdomainGetMaxVcpus;

virDrvDomainGetSecurityLabeldomainGetSecurityLabel;

virDrvNodeGetSecurityModelnodeGetSecurityModel;

virDrvDomainGetXMLDescdomainGetXMLDesc;

virDrvConnectDomainXMLFromNativedomainXMLFromNative;

virDrvConnectDomainXMLToNativedomainXMLToNative;

virDrvListDefinedDomainslistDefinedDomains;

virDrvNumOfDefinedDomainsnumOfDefinedDomains;

virDrvDomainCreatedomainCreate;

virDrvDomainCreateWithFlagsdomainCreateWithFlags;

virDrvDomainDefineXMLdom

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 工学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1