1. 程式人生 > >nova建立虛機流程原始碼分析 openstack

nova建立虛機流程原始碼分析 openstack

    今天跟大家分享openstack中利用nova建立虛機時的原始碼流程,以便更好的理解openstack雲平臺實現,也有助於故障定位。

    建立虛機方式有兩種,一種是通過dashboard雲管理平臺建立,一種是nova命令列方式建立。現在各雲端計算公司都有自己的雲平臺介面,而openstack原生雲管理平臺是Horizon實現的Dashboard。
    Dashboard直接呼叫nova提供的API介面來建立虛機,nova命令列方式也是通過novaclient將命令列引數轉化為標準的http請求到nova API,所以分析建立虛機的流程首先從nova API接收請求開始。
    nova服務接收到請求後先由上述的server.py處理,建立server:
nova/api/openstack/compute/servers.py

def create(self, req, body):
    """Creates a new server for a given user."""
    (instances, resv_id) = self.compute_api.create(context,

    body引數就是http請求發來的引數,這一部分主要是先做許可權檢查,project_id,user_id,可用域等,然後對body進行解析,flavor,image,network,包括volume等引數提取,主要動作是呼叫compute對虛機資源進行計算(此處呼叫compute只是計算資源,並沒有建立)。
下面到nova/compute/api.py

    def create(self, context, instance_type,
        return self._create_instance(

    該方法對network和可用域做判斷,然後繼續呼叫api中的方法,我們來看_create_instance:

def _create_instance(self, context, instance_type,
    self.compute_task_api.schedule_and_build_instances(

    主要對虛機資源進行計算,網路,儲存,映象等,最後將計算出的虛機資訊引數提交給conductor,由conductor來統一控制排程,建立等流程。

    下面兩步是呼叫流程,不做詳細介紹,看下呼叫方法即可。
nova/conductor/api.py

def schedule_and_build_instances(self, context,       

nova/conductor/rpcapi.py

def schedule_and_build_instances(self, context, 

nova/conductor/manager.py

def schedule_and_build_instances(self, context, 
    hosts = self._schedule_instances(context, legacy_spec,
    self.compute_rpcapi.build_and_run_instance

    在這一方法中,先呼叫schedule進行排程來選擇主機,排程過程也不做詳細介紹,主要是根據nova.conf中配置的策略選擇符合條件的主機列表,計算權重,得出最優主機來建立instance;然後建立的任務就要需要呼叫nova compute來完成。

    openstack中的rpc呼叫,都是先通過apcapi.py來接收,再由manager.py裡面的具體方法來實現,下面直接看:
nova/compute/manager.py

def build_and_run_instance(self, context, instance, 
    utils.spawn_n(_locked_do_build_and_run_instance,

    下面兩步呼叫,不做詳解:

def _locked_do_build_and_run_instance(*args, **kwargs):
def _do_build_and_run_instance(self, context, instance, 
    LOG.debug('Starting instance...', instance=instance)
    with timeutils.StopWatch() as timer:
       self._build_and_run_instance(context, instance,

    此處開始建立虛機,debug列印啟動虛機,設定定時器,然後呼叫建立方法:

def _build_and_run_instance(self, context, instance, 
    self._build_resources(context, instance,
    self.driver.spawn(context, instance, image_meta,

    此時虛機狀態為build,建立資源:資源主要是網路,映象和卷;然後呼叫driver建立虛機:openstack中使用的虛擬化driver通常為libvirt,這個在nova.conf中配置,所以下面到virt中看程式碼如下:

nova/virt/libvirt/driver.py

def spawn(self, context, instance, image_meta, 
    self._create_domain_and_network(

    主要工作為建立本地映象,獲取虛機xml檔案,最後建立domain
這部分成功返回後,說明虛機已經建立成功處於running狀態,

def _create_domain(self, xml=None, domain=None,
    guest = libvirt_guest.Guest.create(xml, self._host)

    繼續呼叫:
nova/virt/libvirt/guest.py

    def create(cls, xml, host):
        """Create a new Guest"""
        guest = host.write_instance_config(xml)

    所以資源都已建立好,對映好,現在只需根據xml配置檔案建立guest:

def write_instance_config(self, xml):
    domain = self.get_connection().defineXML(xml)

    這裡面主要呼叫的是libvirt提供的介面函式來建立虛擬機器,這也是openstack層面的最後一步呼叫,defineXML(xml)函式是由libvirt中的c語言實現,做的工作也是對xml中的虛機配置進行檢查,包括建立使用ovs命令建立真實port等做操,最後將xml中的配置引數轉換為qemu命令列引數,由qemu實現真正的建立虛機程序。

    根據本文的流程分析,由雲管理平臺發起,到最後虛擬化的完成,可以清楚的梳理在整個openstack雲環境下各個層面的角色和作用,可以加深對雲端計算的理解。

小笨驢在吃草的時候建立了微信公眾號,為方便更多覓食的“小笨驢”,為大家準備了大量的免費基礎教學資料以及技術解決方案,還會定時釋出一些好的技術文章,當然也會扯扯蛋、談談人生、呵呵,希望我們這群樂於分享技術的“小笨驢”團隊越來越大!(技術乾貨分享群qq:128015753)


這裡寫圖片描述