精华内容
下载资源
问答
  • 大咖写在前面:大家都知道,“区块链”是目前出门寒暄的必杀技...概述,区块链与云计算相似的地方底层三要素之云计算1. 计算虚拟化计算虚拟化就是在虚拟系统和底层硬件之间抽象出CPU和内存等,以供虚拟机使用。计算虚拟
        

    640?wx_fmt=jpeg&wxfrom=5&wx_lazy=1


    大咖写在前面:

    大家都知道,“区块链”是目前出门寒暄的必杀技,可出名更早的“云计算”也一直是技术界的宠儿。我们在研究区块链的过程中发现,区块链的发展和云计算有许多的相似之处,因此便有了此文,带领大家从宏观的角度认识区块链和云计算。本期先从底层三要素讲起。


    概述,区块链与云计算相似的地方

    640?wx_fmt=jpeg&wxfrom=5&wx_lazy=1


    底层三要素之云计算


    1. 计算虚拟化

    计算虚拟化就是在虚拟系统和底层硬件之间抽象出CPU和内存等,以供虚拟机使用。计算虚拟化技术需要模拟出一套操作系统的运行环境,在这个环境你可以安装Windows也是可以安装Linux,这些操作系统被称作Guest OS。他们相互独立,互不影响(相对的,因为当主机资源不足会出现竞争等问题,导致运行缓慢等问题)。计算虚拟化可以将主机单个物理核虚拟出多个vcpu,这些vcpu本质上就是运行的进程,考虑到系统调度,所以并不是虚拟的核数越多越好;内存相似的,把物理机上面内存进行逻辑划分出多个段,供不同的虚拟机使用,每个虚拟机看到的都是自己独立的一个内存。除了这些还需要模拟网络设备、BIOS等。这个虚拟化软件叫做hypervisor,著名的有ESXI、xen、KVM等,通常分为两种,第一种是直接部署到物理服务器上面的,如下图ESXI 


    0?wx_fmt=jpeg

    由于直接部署到裸机上面,hypervisor需要自带各种硬件驱动,虚拟机的所有操作都需要经过hypervisor。还有另一种虚拟化hypervisor,以KVM最为流行(个人电脑上面安装的virtualbox以及workstations也是),它们依赖与宿主机操作系统,这样的好处就是可以充分利用宿主机的各种资源管理以及驱动,但效率上面会打一些折扣。下图是KVM的在使用IO时候的流程图。

    0?wx_fmt=jpeg

    当然也可以从全虚拟化、半虚拟化、硬件辅助虚拟化的角度去说,现在数据中心基本都是硬件辅助虚拟化了,全虚拟化就是完全靠软件模拟、半虚拟需要修改操作让其知道自己运行在虚拟环境中、硬件辅助由硬件为每个Guest OS提供一套寄存器、Guest OS可以直接运行在特权级,这样提高效率。 


    虽然当前数据中心商用的虚拟化软件仍然以VMware的ESXI为主,但在OpenStack的推动下,KVM正在慢慢追赶,并且KVM是开源的,下面简单介绍一下KVM。KVM是基于内核的,从内核2.6以后就自带了,可以运行在x86和power等主流架构上。 KVM主要是CPU和内存的虚拟化,其它设备的虚拟化和虚拟机的管理则需要依赖QEMU完成。一个虚拟机本质上就是一个进程,运行在QEMU-KVM进程地址空间,KVM(内核空间)和qemu(用户空间)相结合一起向用户提供完整的虚拟化环境。



    2. 网络虚拟化

    网络虚拟化是一种重要的网络技术,该技术可在物理网络上虚拟多个相互隔离的虚拟网络,不依赖于底层物理连接,能够动态变化网络拓扑,提供多租户隔离,从而使得不同用户之间使用独立的网络资源切片变成可能,从而提高网络资源利用率,实现弹性的网络。这里面目前最为火热的即软件定义网络(Software Defined Network, SDN),SDN的出现使得网络虚拟化的实现更加灵活和高效,同时网络虚拟化也成为SDN应用中的重量级应用。其核心技术OpenFlow通过将网络设备控制面与数据面分离开来,从而实现了网络流量的灵活控制,使网络作为管道变得更加智能。


    通过SDN实现网络虚拟化包括物理网络管理,网络资源虚拟化和网络隔离三部分。而这三部分内容往往通过专门的中间层软件完成,我们称之为网络虚拟化平台。虚拟化平台需要完成物理网络的管理和抽象虚拟化,并分别提供给不同的租户。此外,虚拟化平台还应该实现不同租户之间的相互隔离,保证不同租户互不影响。虚拟化平台的存在使得租户无法感知到网络虚拟化的存在,也即虚拟化平台可实现用户透明的网络虚拟化。


    (1)虚拟化平台

    虚拟化平台是介于数据网络拓扑和租户控制器之间的中间层。面向数据平面,虚拟化平面就是控制器;而面向租户控制器,虚拟化平台就是数据平面。所以虚拟化平台本质上具有数据平面和控制层面两种属性。在虚拟化的核心层,虚拟化平台需要完成物理网络资源到虚拟资源的虚拟化映射过程。面向租户控制器,虚拟化平台充当数据平面角色,将模拟出来的虚拟网络呈现给租户控制器。从租户控制器上往下看,只能看到属于自己的虚拟网络,而并不了解真实的物理网络。而在数据层面的角度看,虚拟化平台就是控制器,而交换机并不知道虚拟平面的存在。所以虚拟化平台的存在实现了面向租户和面向底层网络的透明虚拟化,其管理全部的物理网络拓扑,并向租户提供隔离的虚拟网络。


    网络虚拟化平台示意图

    0?wx_fmt=jpeg

    虚拟化平台不仅可以实现物理拓扑到虚拟拓扑“一对一”的映射,也应该能实现物理拓扑“多对一”的映射。而由于租户网络无法独占物理平面的交换机,所以本质上虚拟网络实现了“一虚多”和“多虚一”的虚拟化。此处的“一虚多”是指单个物理交换机可以虚拟映射成多个虚拟租户网中的逻辑交换机,从而被不同的租户共享;“多虚一”是指多个物理交换机和链路资源被虚拟成一个大型的逻辑交换机。即租户眼中的一个交换机可能在物理上由多个物理交换机连接而成。


    单虚拟节点映射到多物理节点

    0?wx_fmt=jpeg


    (2)网络资源虚拟化

    为实现网络虚拟化,虚拟化平台需要对物理网络资源进行抽象虚拟化,其中包括拓扑虚拟化,节点资源虚拟化和链路资源虚拟化。


    拓扑虚拟化

    拓扑虚拟化是网络虚拟化平台最基本的功能。虚拟平台需要完成租户虚网中的虚拟节点和虚拟链路到物理节点和链路的映射。其中包括“一对一”和“一对多”的映射。“一对一”的映射中,一个虚拟节点将会映射成一个物理节点,同理虚拟链路也是。而在“一对多”的映射中,一个虚拟节点可以映射成由多个连接在一起的物理节点;一条逻辑链路也可能映射成由链接在一起的多条链路。而对于物理节点而言,一个物理节点可以被多个逻辑节点映射。


    节点资源虚拟化

    节点资源的虚拟化包括对节点Flow tables(流表)、CPU等资源的抽象虚拟化。流表资源本身是交换机节点的稀缺资源,如果能对其进行虚拟化,然后由虚拟化平台对其进行分配,分配给不同的租户,那么就可以实现不同租户对节点资源使用的分配和限制。拓扑抽象仅仅完成了虚拟节点到物理节点的映射,而没有规定不同用户/租户对物理节点资源使用的分配情况。若希望进行更细粒度的网络虚拟化,节点资源虚拟化非常有必要。


    链路资源虚拟化

    和节点资源一样,链路资源也是网络中重要的资源,而拓扑抽象并没有规定某些用户可使用的链路资源的多少。所以在进行更细粒度的虚拟化时,有必要对链路资源进行虚拟化,从而实现链路资源的合理分配。可被抽象虚拟化的链路资源包括租户可使用的带宽以及端口的队列资源等等。


    (3)网络隔离

    网络资源虚拟化仅仅完成了物理资源到虚拟资源的抽象过程,为实现完全的网络虚拟化,还需要对不同的租户提供隔离的网络资源。网络隔离需要对SDN的控制平面和数据平面进行隔离,从而保证不同租户控制器之间互补干扰,不同虚网之间彼此隔离。此外,为了满足用户对地址空间自定义的需求,虚拟化平台还需要对网络地址进行虚拟化。


    控制面隔离

    控制器的性能对SDN整体的性能产生极大的影响,所以虚拟化平台需保证租户的控制器在运行时不受其他租户控制器的影响,保证租户对虚拟化平台资源的使用。虚拟化平台在连接租户控制器时需保证该进程可以得到一定的资源保障,比如CPU资源。而虚拟化平台本身所处的位置就可以轻易实现租户的控制器之间的相互隔离。


    数据面隔离

    数据面的资源包括节点的CPU、Flow Tables等资源以及链路的带宽,端口的队列资源等。为保证各个租户的正常使用,需对数据面的资源进行相应的隔离,从而保证租户的资源不被其他租户所占据。若在数据面上不进行资源的隔离,则会产生租户数据在数据面上的竞争,从而无法保障租户对网络资源的需求,所以很有必要在数据面对资源进行隔离。


    地址隔离

    为使租户能在自己的虚拟租户网中任意使用地址,虚拟化平台需要完成地址的隔离。实现地址隔离主要通过地址映射来完成。租户可任意定制地址空间,而这些地址对于虚拟化平台而言是面向租户的虚拟地址。虚拟化平台在转发租户控制器南向协议报文时,需要将虚拟地址转化成全网唯一的物理地址。租户的服务器的地址在发送到接入交换机时就会被修改成物理地址,然后数据包的转发会基于修改之后的物理地址进行转发。当数据到达租户目的地址主机出端口,控制器需将地址转换成原来租户设定的地址,从而完成地址的虚拟化映射。地址的虚拟化映射使得租户可以使用完全的地址空间,可以使用任意的FlowSpace(流空间:流表匹配项所组成的多维空间),而面向物理层面则实现了地址的隔离,使得不同的租户使用特定的物理地址,数据之间互不干扰。


    3. 存储虚拟化

    存储虚拟化是一种贯穿于整个IT环境、用于简化本来可能会相对复杂的底层基础架构的技术。存储虚拟化的思想是将资源的逻辑映像与物理存储分开,从而为系统和管理员提供一幅简化、无缝的资源虚拟视图。在没有云计算之前存储虚拟化已经发展了很久,可以说和云计算没有特别关系,而云计算存储通常指的是亚马逊的S3存储或者EBS存储等,将统一的资源池划分给多个用户。


    对于用户来说,虚拟化的存储资源就像是一个巨大的“存储池”,用户不会看到具体的磁盘、磁带,也不必关心自己的数据经过哪一条路径通往哪一个具体的存储设备。


    从管理的角度来看,虚拟存储池是采取集中化的管理,并根据具体的需求把存储资源动态地分配给各个应用。值得特别指出的是,利用虚拟化技术,可以用磁盘阵列模拟磁带库,为应用提供速度像磁盘一样快、容量却像磁带库一样大的存储资源,这就是当今应用越来越广泛的虚拟磁带库(VTL, Virtual Tape Library),在当今企业存储系统中扮演着越来越重要的角色。


    主流的存储虚拟化有以下三种技术,在云计算场景中通常会根据实际场景选择合适的技术。


    SAN

    先从高端存储说起,现在高端存储应该EMC、IBM和HDS的天下,这些年外置存储跟随着廉价磁盘不断提升容量和性能,推动了SAN网络、主机FC接口不断成熟,在数据中心变得很普遍,尤其在金融领域。

    0?wx_fmt=jpeg

    SAN提供的是块存储,譬如磁盘阵列里面有10块I T的数据盘,然后可以通过做RAID或者逻辑卷(LVM)的方式划分出10个的数据盘,但这个10个数据盘已经和之前的物理盘不一样了,一个逻辑盘可能有第一个物理盘提供100G,第二个物理盘提供300G。对于操作系统来说,完全无法感知是物理盘还是逻辑盘,这是存储资源池的理念。通过RAID或者LVM不仅可以提供数据保护还能够重新划分盘的大小,提高读写速率。


    但SAN也不是毫无缺点,它价格也是比较昂贵的,光纤口,光纤交换机价格高,所以才有了IPSAN存储,通过IP协议承载存储协议;无法提供数据共享,一个盘只能挂给一个主机,所以这就有了NAS存储。


    NAS

    NAS是文件存储,文件存储相比块存储最大的优势是能共享数据,它基于标准的网络协议,SAN是有自己一套存储协议的。常见的NAS包括NFS、FTP和HTTP文件服务器等,由于这种设备通常都有一个IP,所以一般客户机充当数据网关服务器可以直接对其访问。NAS建立在传统网络之上,所以可以更远距离的传输,并且NAS具有安装容易易于维护的特点,但其速度通常要比SAN慢很多。 

    0?wx_fmt=jpeg


    分布式存储

    伴随着x86性能提升,以x86芯片构建的小型存储系统在中端存储领域开始崭露头角。通过将X86本地的磁盘利用起来构建一个大存储集群。分布式存储通常能够同时提供块存储和文件存储的能力。这里不得介绍一个和OpenStack结合紧密的分布式存储ceph,下图是ceph官网的一个整体模块图,它提供了CEPH FS文件存储系统和POSIX接口、对象存储以及最常用的快存储。 

    0?wx_fmt=png


    它的基石是下面的RADOS,再下面就是系统组件,包括:

    • CEPH OSDs:CEPH的OSD(Object Storage Device)守护进程。主要功能包括:存储数据、副本数据处理、数据恢复、数据回补,平衡数据分布。并将数据相关的一些监控信息提供给CEPH Moniter,以便CEPH Moniter来检查其他OSD的心跳状态。一个CEPH存储集群,要求至少两个CEPH OSDs,才能有效的保存两份数据。注意,这里的两个CEPH OSD是指运行在两台物理服务器上的,并不是在一台物理服务器上开两个CEPH OSD的守护进程。 


    • Moniters:CEPH的Moniter守护进程,主要功能是维护集群状态的表组,这个表组中包含了多张表,其中有Moniter map、OSD map 、PG(Placement Group) map、CRUSH map。 


    • MDSs:CEPH的MDS (Metadata Server)守护进程,主要保存的是CEPH Filesystem的元数据。注意,对于CEPH的块设备和CEPH对象存储都不需要CEPH MDS守护进程。CEPH MDS 为基于POSIX文件系统的用户提供了一些基础命令的执行,比如ls、find等等,这样可以很大层度上降低CPEH 存储集群的压力。 


    还有一个开源的对象存储就是openstack的Swift,Swift的初衷就是用廉价的成本来存储容量特别大的数据,swift使用容器来管理对象,允许用户存储、检索和删除对象以及对象的元数据,而这些操作都是通过用户友好的RESTful风格的接口完成。


    底层三要素之区块链


    1. 共享帐本

    共享账本准确的说应该是分布式账本技术,这个技术从实质上说就是一个可以在多个站点、不同地理位置或者多个机构组成的网络里进行分享的资产数据库。在一个网络里的参与者可以获得一个唯一、真实账本的副本。账本里的任何改动都会在所有的副本中被反映出来,反应时间会在几分钟甚至是几秒内。在这个账本里存储的资产可以是金融、法律定义上的、实体的或是电子的资产。在这个账本里存储的资产的安全性和准确性是通过公私钥以及签名的使用去控制账本的访问权,从而实现密码学基础上的维护。根据网络中达成共识的规则,账本中的记录可以由一个、一些或者是所有参与者共同进行更新。


    分布式账本技术使用密码哈希算法和数字签名来确保交易的完整性,同时确保共享账本是精确副本,并降低了发生交易欺诈的风险,因为篡改需要同时在许多地方同时执行。密码哈希算法(比如 SHA256 计算算法)能确保对交易输入的任何改动 — 甚至是最细微的改动 — 都会计算出一个不同的哈希值,表明交易输入可能被损坏。数字签名则确保交易源自发送方(已使用私钥签名)而不是冒名顶替者。


    2. 共识算法


    这里主要讲述区块链在发展过程中出现的五种典型共识算法:PoW、PoS、DPoS、PBFT和联合共识。


    早期,比特币Bitcoin作为区块链技术的第一个成功应用率先引入了工作量证明机制(PoW,Proof of Work),工作量证明机制利用了Hash算法在随机性上这个非常重要的特性。PoW机制俗称挖矿,这里挖的是比特币里的每一个区块。每个区块用包含的交易、时间、以及一个自定义数值来计算这个区块的Hash。一个合格的区块的Hash必须满足前N位为零,因此需要不断的调整刚才那三个参数来寻找满足条件的Hash。由于Hash算法足够随机,零的个数越多,算出这个Hash的概率越低。此时,要得到合理的Block Hash需要经过大量尝试计算,计算时间取决于机器的哈希运算速度。当某个节点提供出一个合理的Block Hash值,说明该节点确实经过了大量的尝试计算,这就是工作量证明。当然,并不能得出计算次数的绝对值,因为寻找合格的Hash是一个概率事件。当节点拥有占全网n%的算力时,该节点即有n%的概率率先发布一个合格的区块。


    随后,由于PoW这种算法极其耗费计算资源,截至写本文时(2017年8月),据测算,比特币网络消耗的电力就已经高达15TW。因此,随后的NXT等新兴密码学货币提出了一种新的思路即股权证明(PoS,Proof of Stake)。这种模式会根据你持有数字货币的量和时间,决定你可以发布下一个区块的概率。在PoS模式下,有一个名词叫币龄,每个币每天产生1币龄,比如你持有100个币,总共持有了30天,那么,此时你的币龄就为3000,然后按照所有人的币龄根据一个随机算法决定谁来发布下一个区块。这个时候,如果你被选中发布了一个POS区块,你的币龄就会被清空为0重新再来。


    PoS也不是没有缺点,最大的缺点就是在于效率上。因此,比特股BitShares提出了委托股权证明机制(DPoS,Delegated Proof of Stake)。它的原理是让每一个持有比特股的人进行投票,由此产生101位代表 , 我们可以将其理解为101个超级节点或者矿池,而这101个超级节点彼此的权利是完全相等的。从某种角度来看,DPoS有点像是议会制度或人民代表大会制度。如果代表不能履行他们的职责(当轮到他们时,没能生成区块),他们会被除名,网络会选出新的超级节点来取代他们。


    以上的这些共识机制都依赖密码学货币,因为不管是PoW还是PoS,驱动寻找区块的源动力都是发布新区块的货币奖励。对于无代币的系统如HyperLedger Fabric,如何选择共识机制?这时,我们可以回过头看看PBFT。BFT(Byzantine Fault Tolerance,拜占庭容错算法)是很早就提出的分布式容错算法,可以查找拜占庭问题来进一步了解,这里不做详述。PBFT作为BFT的一种实现,是一种状态机副本复制算法,即服务作为状态机进行建模,状态机在分布式系统的不同节点进行副本复制。每个状态机的副本都保存了服务的状态,同时也实现了服务的操作。将所有的副本组成的集合使用大写字母R表示,使用0到|R|-1的整数表示每一个副本。为了描述方便,假设|R|=3f+1,这里f是有可能失效的副本的最大个数。尽管可以存在多于3f+1个副本,但是额外的副本除了降低性能之外不能提高可靠性。


    除此之外,还有一种基于投票的联合共识(Voting),以Ripple为代表。这种共识使网络能够基于特殊节点列表达成共识。初始特殊节点列表就像一个俱乐部,要接纳一个新成员,必须由51%的该俱乐部会员投票通过。共识遵循这核心成员的51%权力,外部人员则没有影响力。这种共识方式同样极大的提高了效率,但是却需要确保特殊节点中恶意节点不能超过51%,牺牲的是整个网络的去中心化。


    3. P2P网络

    P2P为大众所熟知主要要归功于BitTorrent及BT的流行,而P2P网络的核心概念即彼此连接的多台计算机之间都处于对等的地位,各台计算机有相同的功能,无主从之分,一台计算机既可作为服务器,设定共享资源供网络中其他计算机所使用,又可以作为工作站,整个网络一般来说不依赖专用的集中服务器,也没有专用的工作站。网络中的每一台计算机既能充当网络服务的请求者,又对其它计算机的请求做出响应,提供资源、服务和内容。通常这些资源和服务包括:信息的共享和交换、计算资源(如CPU计算能力共享)、存储共享(如缓存和磁盘空间的使用)、网络共享、打印机共享等。


    区块链为了实现分布式账本的能力,同样也采用了P2P网络。分布式账本会分发给网络中的所有成员节点,同时可以阻止任何单个或一组参与者控制底层基础架构或破坏整个系统。网络中的参与者是平等的,都遵守相同的协议。


    下期预告:

    云计算:公有云,私有云,混合云,朵朵不一

    区块链:公有链,私有链,联盟链,链链各异


    扫码持续关注我们!由于我们微信平台刚刚上线,还未开通留言互动功能。请点击阅读原文留言分享互动噢:-)


    0?wx_fmt=jpeg


    ---------------------------------------------------------

    本期嘉宾:

    谢文杰,智链ChainNova CTO区块链技术专家。原金山云技术产品专家,百度移动事业部技术经理。互联网从业十余年,在技术及产品设计、管理方面经验丰富。从14年开始研究区块链,对众多主流区块链技术平台均有深入研究,目前专注于带领团队将区块链技术与现有企业级成熟技术体系如Container、CI/CD、BigData的融合,帮助企业在业务中快速融入区块链技术特性。


    金钰,智链ChainNova 高级区块链研发工程师。原IBM GBS区块链技术专家,移动应用软件架构师。互联网从业8年,在金融领域,制造业领域有丰富的行业经验。从16年开始研究区块链,曾参与邮储银行,农业银行等多家银行区块链实践项目,有丰富的咨询及实施经验

    展开全文
  • 对于虚拟机中的操作系统,VMM需要完整模拟底层的硬件设备,包括处理器、内存、时钟、I/O设备、中断等等,换句话说,VMM用纯软件的形式“模拟”出一台计算机供虚拟机中的操作系统使用。 这种完全模拟一台计算机的技术...

    我们熟知的VMware事实上有两个产品线,一个是VMware ESXi,直接安装在裸金属之上,不需要额外的操作系统,属于第一类虚拟化。另一个是我们普通用户更加熟知的VMware WorkStation,属于第二类虚拟化。
    对于虚拟机中的操作系统,VMM需要完整模拟底层的硬件设备,包括处理器、内存、时钟、I/O设备、中断等等,换句话说,VMM用纯软件的形式“模拟”出一台计算机供虚拟机中的操作系统使用。
    这种完全模拟一台计算机的技术也称为全虚拟化,这样做的好处显而易见,虚拟机中的操作系统感知不到自己是在虚拟机中,代码无需任何改动,直接可以安装。而缺点也是可以想象:完全用软件模拟,转换翻译执行,性能堪忧!
    而QEMU则是完全软件层面的“模拟”,乍一看和VMware好像差不多,不过实际本质是完全不同的。VMware是将原始CPU指令序列翻译成经过处理后的CPU指令序列来执行。而QEMU则是完全模拟执行整个CPU指令集,更像是“解释执行”,两者的性能不可同日而语。
    既然有全虚拟化,那与之相对的也就有半虚拟化,前面说了,由于敏感指令的关系,全虚拟化的VMM需要捕获到这些指令并完整模拟执行这个过程,实现既满足虚拟机操作系统的需要,又不至于影响到物理计算机。但说来简单,这个模拟过程实际上相当的复杂,涉及到大量底层技术,并且如此模拟费时费力。而试想一下,如果把操作系统中所有执行敏感指令的地方都改掉,改成一个接口调用(HyperCall),接口的提供方VMM实现对应处理,省去了捕获和模拟硬件流程等一大段工作,性能将获得大幅度提升
    这就是半虚拟化,这项技术的代表就是Xen,一个诞生于2003年的开源项目。
    这项技术一个最大的问题是:需要修改操作系统源码,做相应的适配工作。这对于像Linux这样的开源软件还能接受,充其量多了些工作量罢了。但对于Windows这样闭源的商业操作系统,修改它的代码,无异于痴人说梦
    硬件辅助虚拟化 VT / AMD-v
    折腾来折腾去,全都是因为x86架构的CPU天然不支持经典虚拟化模式,软件厂商不得不想出其他各种办法来在x86上实现虚拟化。
    如果进一步讲,CPU本身增加对虚拟化的支持,那又会是一番怎样的情况呢?在软件厂商使出浑身解数来实现x86平台的虚拟化后的不久,各家处理器厂商也看到了虚拟化技术的广阔市场,纷纷推出了硬件层面上的虚拟化支持,正式助推了虚拟化技术的迅猛发展。这其中为代表的就是Intel的VT系列技术和AMD的AMD-v系列技术。
    KVM-QEMU
    有了硬件辅助虚拟化的加持,虚拟化技术开始呈现井喷之势。VirtualBox、Hyper-V、KVM等技术如雨后春笋般接连面世。这其中在云计算领域声名鹊起的当属开源的KVM技术了。
    KVM全称for Kernel-based Virtual Machine,意为基于内核的虚拟机。
    在虚拟化底层技术上,KVM和VMware后续版本一样,都是基于硬件辅助虚拟化实现。不同的是VMware作为独立的第三方软件可以安装在Linux、Windows、MacOS等多种不同的操作系统之上,而KVM作为一项虚拟化技术已经集成到Linux内核之中,可以认为Linux内核本身就是一个HyperVisor,这也是KVM名字的含义,因此该技术只能在Linux服务器上使用。
    KVM技术常常搭配QEMU一起使用,称为KVM-QEMU架构。前面提到,在x86架构CPU的硬件辅助虚拟化技术诞生之前,QEMU就已经采用全套软件模拟的办法来实现虚拟化,只不过这种方案下的执行性能非常低下。

    KVM本身基于硬件辅助虚拟化,仅仅实现CPU和内存的虚拟化,但一台计算机不仅仅有CPU和内存,还需要各种各样的I/O设备,不过KVM不负责这些。这个时候,QEMU就和KVM搭上了线,经过改造后的QEMU,负责外部设备的虚拟,KVM负责底层执行引擎和内存的虚拟,两者彼此互补,成为新一代云计算虚拟化方案的宠儿
    容器技术-LXC & Docker
    前面谈到的无论是基于翻译和模拟的全虚拟化技术、半虚拟化技术,还是有了CPU硬件加持下的全虚拟化技术,其虚拟化的目标都是一台完整的计算机,拥有底层的物理硬件、操作系统和应用程序执行的完整环境。

    为了让虚拟机中的程序实现像在真实物理机器上运行“近似”的效果,背后的HyperVisor做了大量的工作,付出了“沉重”的代价。
    虽然HyperVisor做了这么多,但你有没有问过虚拟机中的程序,这是它想要的吗?或许HyperVisor给的太多,而目标程序却说了一句:你其实可以不用这样辛苦。
    确实存在这样的情况,虚拟机中的程序说:我只是想要一个单独的执行执行环境,不需要你费那么大劲去虚拟出一个完整的计算机来。
    这样做的好处是什么?
    虚拟出一台计算机的成本高还是只虚拟出一个隔离的程序运行环境的成本高?答案很明显是前者。一台物理机可能同时虚拟出10台虚拟机就已经开始感到乏力了,但同时虚拟出100个虚拟的执行环境却还是能够从容应对,这对于资源的充分利用可是有巨大的好处。
    近几年大火的容器技术正是在这样的指导思想下诞生的
    不同于虚拟化技术要完整虚拟化一台计算机,容器技术更像是操作系统层面的虚拟化,它只需要虚拟出一个操作系统环境。

    LXC技术就是这种方案的一个典型代表,全称是LinuX Container,通过Linux内核的Cgroups技术和namespace技术的支撑,隔离操作系统文件、网络等资源,在原生操作系统上隔离出一个单独的空间,将应用程序置于其中运行,这个空间的形态上类似于一个容器将应用程序包含在其中,故取名容器技术。
    举个不是太恰当的比喻,一套原来是三居室的房子,被二房东拿来改造成三个一居室的套间,每个一居室套间里面都配备了卫生间和厨房,对于住在里面的人来说就是一套完整的住房。
    如今各个大厂火爆的Docker技术底层原理与LXC并不本质区别,甚至在早期Docker就是直接基于LXC的高层次封装。Docker在LXC的基础上更进一步,将执行执行环境中的各个组件和依赖打包封装成独立的对象,更便于移植和部署
    容器技术的好处是轻量,所有隔离空间的程序代码指令不需要翻译转换,就可以直接在CPU上执行,大家底层都是同一个操作系统,通过软件层面上的逻辑隔离形成一个个单独的空间。
    容器技术的缺点是安全性不如虚拟化技术高,毕竟软件层面的隔离比起硬件层面的隔离要弱得多。隔离环境系统和外面的主机共用的是同一个操作系统内核,一旦利用内核漏洞发起攻击,程序突破容器限制,实现逃逸,危及宿主计算机,安全也就不复存在。
    超轻虚拟化 firecracker
    虚拟完整的计算机隔离性好但太过笨重,简单的容器技术又因为太过轻量纯粹靠软件隔离不够安全,有没有一个折中的方案同时兼具两者的优点,实现既轻量又安全呢?
    近年来,一种超轻虚拟化的思想开始流行开来,亚马逊推出的firecracker就是一个典型的代表。
    firecracker将虚拟化技术的强隔离性和容器技术的轻量性进行融合,提出了一个microVM的概念,底层通过KVM虚拟化技术实现各个microVM的强隔离,而隔离的虚拟机中运行的是一个个精简版的微型操作系统,砍掉了大量无用的功能,专为容器设计的微型OS。
    超轻虚拟化如今成为一个新的浪潮,除了AWS的firecracker,谷歌的gVisor, Intel主导的NEMU也在向这个领域开始发力。
    总结
    本文简单介绍了虚拟化技术的基本概念和基本要求。随后引出由于早期的x86架构不支持经典的虚拟化方案,各家软件厂商只能通过软件模拟的形式来实现虚拟化,其代表是早期的VMware WorkStation和Xen。
    不过纯粹依靠软件的方式毕竟有性能的瓶颈,好在Intel和AMD及时推出了CPU硬件层面的虚拟化支持,软件厂商迅速跟进适配,极大的改善了虚拟化的性能体验。这一时期的代表有新版本的VMware WorkStation、Hyper-V、KVM等。
    近年来,随着云计算和微服务的纵深发展,对虚拟化技术的虚拟粒度逐渐从粗到细。从最早的虚拟化完整的计算机,到后来只需虚拟出一个操作系统,再到后来虚拟出一个微服务需要的环境即可,以Docker为代表的容器技术在这个时期大放异彩。

    展开全文
  • 本文首发于我的公众号 aCloudDeveloper,专注于云计算,但不止于云计算,努力打造干货平台,欢迎大家关注,二维码文末可以扫。 Qemu 架构 Qemu  是纯软件实现的虚拟化模拟器,几乎可以模拟任何...

    本文首发于我的公众号 Linux云计算网络(id: cloud_dev),专注于干货分享,号内有 10T 书籍和视频资源,后台回复 「1024」 即可领取,欢迎大家关注,二维码文末可以扫。

    Qemu 架构

    Qemu 是纯软件实现的虚拟化模拟器,几乎可以模拟任何硬件设备,我们最熟悉的就是能够模拟一台能够独立运行操作系统的虚拟机,虚拟机认为自己和硬件打交道,但其实是和 Qemu 模拟出来的硬件打交道,Qemu 将这些指令转译给真正的硬件。

    正因为 Qemu 是纯软件实现的,所有的指令都要经 Qemu 过一手,性能非常低,所以,在生产环境中,大多数的做法都是配合 KVM 来完成虚拟化工作,因为 KVM 是硬件辅助的虚拟化技术,主要负责 比较繁琐的 CPU 和内存虚拟化,而 Qemu 则负责 I/O 虚拟化,两者合作各自发挥自身的优势,相得益彰。

    qemu

    从本质上看,虚拟出的每个虚拟机对应 host 上的一个 Qemu 进程,而虚拟机的执行线程(如 CPU 线程、I/O 线程等)对应 Qemu 进程的一个线程。下面通过一个虚拟机启动过程看看 Qemu 是如何与 KVM 交互的。

    // 第一步,获取到 KVM 句柄
    kvmfd = open("/dev/kvm", O_RDWR);
    // 第二步,创建虚拟机,获取到虚拟机句柄。
    vmfd = ioctl(kvmfd, KVM_CREATE_VM, 0);
    // 第三步,为虚拟机映射内存,还有其他的 PCI,信号处理的初始化。ioctl(kvmfd, KVM_SET_USER_MEMORY_REGION, &mem);
    // 第四步,将虚拟机镜像映射到内存,相当于物理机的 boot 过程,把镜像映射到内存。
    // 第五步,创建 vCPU,并为 vCPU 分配内存空间。
    ioctl(kvmfd, KVM_CREATE_VCPU, vcpuid);
    vcpu->kvm_run_mmap_size = ioctl(kvm->dev_fd, KVM_GET_VCPU_MMAP_SIZE, 0);
    // 第五步,创建 vCPU 个数的线程并运行虚拟机。ioctl(kvm->vcpus->vcpu_fd, KVM_RUN, 0);
    // 第六步,线程进入循环,并捕获虚拟机退出原因,做相应的处理。
    for (;;) {  
      ioctl(KVM_RUN)  
      switch (exit_reason) {      
        case KVM_EXIT_IO:  /* ... */      
        case KVM_EXIT_HLT: /* ... */  
      }
    }
    // 这里的退出并不一定是虚拟机关机,
    // 虚拟机如果遇到 I/O 操作,访问硬件设备,缺页中断等都会退出执行,
    // 退出执行可以理解为将 CPU 执行上下文返回到 Qemu。
    

    Qemu 源码结构

    Qemu 软件虚拟化实现的思路是采用二进制指令翻译技术,主要是提取 guest 代码,然后将其翻译成 TCG 中间代码,最后再将中间代码翻译成 host 指定架构的代码,如 x86 体系就翻译成其支持的代码形式,ARM 架构同理。

    所以,从宏观上看,源码结构主要包含以下几个部分:

    • /vl.c:最主要的模拟循环,虚拟机环境初始化,和 CPU 的执行。

    • /target-arch/translate.c:将 guest 代码翻译成不同架构的 TCG 操作码。

    • /tcg/tcg.c:主要的 TCG 代码。

    • /tcg/arch/tcg-target.c:将 TCG 代码转化生成主机代码。

    • /cpu-exec.c:主要寻找下一个二进制翻译代码块,如果没有找到就请求得到下一个代码块,并且操作生成的代码块。

    其中,涉及的主要几个函数如下:

    知道了这个总体的代码结构,再去具体了解每一个模块可能会相对容易一点。

    Qemu 的使用

    1. 源码下载

    centos:sudo apt-get install qemu
    ubuntu:sudo yum install qemu -y
    安装包:
    $wget http://wiki.qemu-project.org/download/qemu-2.0.0.tar.bz2
    $tar xjvf qemu-2.0.0.tar.bz2
    Git:
    $git clone git://git.qemu-project.org/qemu.git
    

    2. 编译及安装

    $cd qemu-2.0.0 //如果使用的是git下载的源码,执行cd qemu
    $./configure --enable-kvm --enable-debug --enable-vnc --enable-werror  --target-list="x86_64-softmmu"
    $make -j8
    $sudo make install
    

    configure 脚本用于生成 Makefile,其选项可以用 ./configure --help 查看。

    这里使用到的选项含义如下:

    • –enable-kvm:编译 KVM 模块,使 Qemu 可以利用 KVM 来访问硬件提供的虚拟化服务。

    • –enable-vnc:启用 VNC。

    • –enalbe-werror:编译时,将所有的警告当作错误处理。

    • –target-list:选择目标机器的架构。默认是将所有的架构都编译,但为了更快的完成编译,指定需要的架构即可。

    安装好之后,会生成如下应用程序:

    • ivshmem-client/server:这是一个 guest 和 host 共享内存的应用程序,遵循 C/S 的架构。

    • qemu-ga:这是一个不利用网络实现 guest 和 host 之间交互的应用程序(使用 virtio-serial),运行在 guest 中。

    • qemu-io:这是一个执行 Qemu I/O 操作的命令行工具。

    • qemu-system-x86_64:Qemu 的核心应用程序,虚拟机就由它创建的。

    • qemu-img:创建虚拟机镜像文件的工具,下面有例子说明。

    • qemu-nbd:磁盘挂载工具。

    下面通过创建虚拟机操作来对这些工具有个初步的认识。

    3. 创建虚拟机

    • 使用qemu-img创建虚拟机镜像

    虚拟机镜像用来模拟虚拟机的硬盘,在启动虚拟机之前需要创建镜像文件。

    qemu-img create -f qcow2 test-vm-1.qcow2 10G
    

    -f 选项用于指定镜像的格式,qcow2 格式是 Qemu 最常用的镜像格式,采用来写时复制技术来优化性能。test-vm-1.qcow2 是镜像文件的名字,10G是镜像文件大小。镜像文件创建完成后,可使用 qemu-system-x86 来启动x86 架构的虚拟机:

    • 使用 qemu-system-x86 来启动 x86 架构的虚拟机
    qemu-system-x86_64 test-vm-1.qcow2
    

    因为 test-vm-1.qcow2 中并未给虚拟机安装操作系统,所以会提示 “No bootable device”,无可启动设备。

    • 启动 VM 安装操作系统镜像
    qemu-system-x86_64 -m 2048 -enable-kvm test-vm-1.qcow2 -cdrom ./Centos-Desktop-x86_64-20-1.iso
    

    -m 指定虚拟机内存大小,默认单位是 MB, -enable-kvm 使用 KVM 进行加速,-cdrom 添加 fedora 的安装镜像。可在弹出的窗口中操作虚拟机,安装操作系统,安装完成后重起虚拟机便会从硬盘 ( test-vm-1.qcow2 ) 启动。之后再启动虚拟机只需要执行:

    qemu-system-x86_64 -m 2048 -enable-kvm test-vm-1.qcow2
    

    qemu-img 支持非常多种的文件格式,可以通过 qemu-img -h 查看

    其中 raw 和 qcow2 是比较常用的两种,raw 是 qemu-img 命令默认的,qcow2 是 qemu 目前推荐的镜像格式,是功能最多的格式。这些知识后面会有文章来专门讲述。

    这篇文章写得有点长,可能是 Qemu 唯一一篇文章,这并不是说 Qemu 不重要,而是我们平时在使用过程中主要把它当工具用,遇到不懂的查就行了,当然,如果你觉得看代码爽一点,非常鼓励,如果看了有什么心得,我们可以一起交流交流。好了,老铁们,看在我深夜一点还在写干货给你们,就给我点个赞吧。


    公众号后台回复“加群”,带你进入高手如云交流群

    我的公众号 「Linux云计算网络」(id: cloud_dev) ,号内有 10T 书籍和视频资源,后台回复 「1024」 即可领取,分享的内容包括但不限于 Linux、网络、云计算虚拟化、容器Docker、OpenStack、Kubernetes、工具、SDN、OVS、DPDK、Go、Python、C/C++编程技术等内容,欢迎大家关注。

    展开全文
  • 云计算

    千次阅读 2016-09-13 07:19:45
    过去在图中往往用云来表示电信网,后来也用来表示互联网和底层基础设施的抽象。云代表虚拟化的资源。云计算大约也可称为云服务吧。服务在云端。是一种按使用量付费的模式二、云计算的作用 将众多的资源组合起来,...

    一、什么是云计算

    云是网络、互联网的一种比喻说法。 过去在图中往往用云来表示电信网,后来也用来表示互联网和底层基础设施的抽象。

    云代表虚拟化的资源。

    云计算大约也可称为云服务吧。服务在云端。是一种按使用量付费的模式

    二、云计算的作用
    将众多的资源组合起来,虚拟成一个整体,供外部使用。一是方便,二是优质。

    三、为啥要用云计算
    企业再也不用斥巨资购买服务器,并出高薪养着一群维护人员了。有利降低成本。

    四、云计算的种类
    每种云服务模式都通过某种程度上的资源抽象,来减低消费者构建和部署系统的复杂性。

    1、基础设施即服务(IaaS)
    2、平台即服务(PaaS)
    3、软件即服务(SaaS)

    这里写图片描述
    这里写图片描述

    1、SaaS,云服务模式中最为成熟的一种类型。
    最常见的服务形式,或者是网页,或者是API。

    成熟、现成,可快速集成,拿来即用,节省开发时间和成本,但可能欠缺灵活性,不一定能满足用户的全部需求。

    常见的解决方案,如CRM,ERP,等等。

    2、PaaS,最不成熟。提供了操作系统以及各种底层服务,使得用户可以专注业务,但资源可能由于多用户共享导致有时出现性能瓶颈;同时,也会出现用户受制于人的顾虑。

    但是,在中国,常用的阿里云应该就是这种模式。购买的时候,要选操作系统。

    3、IaaS,就相当于一个啥都没装的虚拟机,包括操作系统。提供最大限度的灵活性。这让我想起有一些数据库系统,为了方便自己管理,需要直接使用没有经过操作系统格式化的磁盘(俗称生磁盘)。

    同时,如果用户所需资源规模很大,比如TB级的数据,或巨大带宽,那么IaaS的成本会比PaaS更低更划算。

    五、云计算与RESTful

    表述性状态转移(RESTful)服务是每一种云服务方案的关键组成部分。
    因为每种云服务都有对外的RESTful服务的API:
    1、使得不同的应用和服务能轻松地连接在一起

    2、使不同设备,如PC、手机、平板使用相同的服务,时刻保持同步

    3、RESTful服务,利于构建松耦合系统,增强容错性。

    因为松耦合,意味着依赖很弱,在某一个点出问题的时候,其他影响不大,仍能正常工作,或者优雅降级。而松耦合的关键,在于无状态。所谓的无状态,是对服务而言的,就是状态放在客户端,而不是服务器端。因此,当某服务出问题的时候,客户端可以轻松地转向另一个服务,而不会出现状态丢失。

    六、云计算的优劣
    优点:
    1、硬件成本降低
    2、服务周全,安全性强,你妈再也不用担心你的数据

    缺点:
    云不是一种时髦,或包治百病的灵丹妙药。应用是否迁移到云,要看实际,避免失败。传统的应用并不适合迁移到云。

    七、云计算与大数据的关系
    没有直接的关系。不过云降低了硬件资源的成本,又有强大的功能和服务,这为大数据提供了支撑和基础。

    大数据

    展开全文

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 39,143
精华内容 15,657
关键字:

云计算最底层