1. 程式人生 > >Openstack:Nova中“從雲硬碟啟動”、“從映象啟動”、“從映象啟動(建立一個卷)”_prep_block_device中的差異

Openstack:Nova中“從雲硬碟啟動”、“從映象啟動”、“從映象啟動(建立一個卷)”_prep_block_device中的差異

原文網址:http://blog.csdn.net/xiangpingli/article/details/47913059

在前面跟蹤分析了:“從映象啟動”、“從映象啟動(建立一個新卷)”過程中,卷的建立是在_build_resources->_prep_block_device中建立的,而不是在

spawm->_create_image中建立的,而_create_image只是來在捲上建立映象,或者說來組織映象。

在這裡看一下“從雲硬碟啟動”和“從映象啟動”、“從映象啟動(建立一個卷)”,在_prep_block_device中的差異.

(1)“從雲硬碟啟動”可以先不關注,肯定是在cinder這邊建立的卷,不過是怎麼

_prep_block_device的?

(2)“從映象啟動(建立一個新卷)”確定是在cinder中建立的,nova呼叫了cinderclient的建立卷的命令,但其_prep_block_device做了什麼?

(3)“從映象啟動”這裡的卷(_base + disk)是在nova中建立的還是調cinder建立的?在_prep_block_device中做了什麼?

(4)除了建立卷,還做了什麼?不管在哪裡建卷,都要_prep_block_device,是準備哪些東西?

再深入看一下_prep_block_device的流程:

  1. ->nova.compute.manager.ComputeManager._prep_block_device //準備塊裝置  
  2.   ->nova.compute.manager.ComputeManager.attach_block_devices   
  3.       ->nova.virt.block_device.attach_block_devices   
  4. ->nova.virt.block_device.DriverImageBlockDevice.attach:volume_api.create //懷疑這裡在不同的建立方式下走不同的流程  
  5.       ->Nova.volume.API.create  
  6.         ->nova.volume.cinder.API.create  
  7.           -> client = cinderclient(context) ; client.volumes.create(size, **kwargs)//呼叫cinder建立卷  

確認:

nova.virt.block_device.DriverImageBlockDevice.attachvolume_api.create //懷疑這裡在不同的建立方式下走不同的流程

確認這裡在“從雲硬碟啟動”、“從映象啟動”、“從映象啟動(建立一個新卷)”三種方式下會走不同的流程

1)“從映象啟動”:

從映象啟動時,那幾個類:DriverImageBlockDevice、DriverSnapshotBlockDevice、DriverBlankBlockDevice中的attach一個也沒有呼叫

看下nova.compute.manager.ComputeManager.attach_block_devices 有沒有被呼叫


  1. ->nova.compute.manager.ComputeManager._prep_block_device //準備塊裝置  
  2.     ->nova.compute.manager.ComputeManager.attach_block_devices   
  3.       ->nova.virt.block_device.attach_block_devices   

接下來調到哪兒去了?“從映象啟動”建立雲硬碟,應該是在_create_image中做的,這裡attach什麼呢?是不是也要準備塊裝置?_create_image中只是下載?

看這時候有沒有卷資訊呢?

��看下nova.compute.manager.ComputeManager.attach_block_devices 有沒有被呼叫?那幾個類:DriverImageBlockDevice、DriverSnapshotBlockDevice、DriverBlankBlockDevice中的attach一個也沒有呼叫

“從映象啟動”的_prep_block_device:在attach_block_devices這裡就直接返回了,如下是“從映象啟動”的列印:


看這時候有沒有卷資訊呢?從映象啟動時,那幾個類:DriverImageBlockDevice、DriverSnapshotBlockDevice、DriverBlankBlockDevice中的attach一個也沒有呼叫

看下nova.compute.manager.ComputeManager.attach_block_devices 有沒有被呼叫

“從映象啟動(建立一個新卷)”的_prep_block_device:這裡會去呼叫cindercreate建卷,和呼叫cinderattach去掛載雲硬碟。如下是“從映象啟動(建立一個新卷)”的log


這裡的呼叫流程:
  1. ->nova.compute.manager.ComputeManager._prep_block_device //準備塊裝置  
  2.   ->nova.compute.manager.ComputeManager.attach_block_devices   
  3.     ->nova.virt.block_device.attach_block_devices   
  4.       ->nova.virt.block_device.DriverImageBlockDevice.attach  
  5.         ->nova.virt.driver.create  
  6.          ->nova.virt.libvrit.driver.create 建立一個新卷  
  7.       ->nova.virt.block_device.DriverVolumeBlockDevice.attach (DriverVolumeBlockDevice是DriverImageBlockDevice的父類)  
  8.         ->nova.virt.driver.attach  
  9.           ->nova.virt.libvirt.driver.attach 掛載這個卷    

“從雲硬碟啟動”的_prep_block_device:這裡不會去建立卷,因為卷已經存在了,所以這裡會直接呼叫attach去掛載雲硬碟。如下是“從雲硬碟啟動”的Log


流程如下:
  1. ->nova.compute.manager.ComputeManager._prep_block_device //準備塊裝置  
  2.   ->nova.compute.manager.ComputeManager.attach_block_devices   
  3.     ->nova.virt.block_device.attach_block_devices   
  4.       ->nova.virt.block_device.DriverVolumeBlockDevice.attach (DriverVolumeBlockDevice是DriverImageBlockDevice的父類)  
  5.         ->nova.virt.driver.attach  
  6.           ->nova.virt.libvirt.driver.attach 掛載這個卷    

也就是說,在_prep_block_device中的差別:

“從映象啟動”,這裡不會去建立卷,也不會去呼叫任何attach,因為這時候不存在一個卷,這個卷要在後面_create_image中建立

“從雲硬碟啟動”這裡卷早已經建好了,但是會去呼叫cinderattach,去掛載這個卷,或者說掛載這個塊裝置,就是做block_device_mapping

“從映象啟動(建立一個新卷)”:這裡會呼叫呼叫cindercreate去建立一個卷,並且會去呼叫cinderattach去掛載這個卷


這裡的_prep_block_device方法的更深入的原理是什麼?


【需要搞清楚】對這裡的流程清楚了,就是調到了哪裡。但原理還不夠清楚,怎麼調過去的,為什麼就調到後面的nova.compute.manager.ComputeManager.attach_block_devices了,後面的nova.compute.manager.ComputeManager.attach_block_devices為什麼有的會調createattach,有的會呼叫attach而不呼叫create,有的createattach都不會呼叫?【需要搞清楚】

詳細解析:

這裡主要是以attach_block_devices的返回值作為block_device_mapping的成員,所以attach_block_devices返回什麼很重要。

attach_block_devices:


要明白map(func, {{},{}})是什麼意思,map是將第二個引數中的所有成員,在第一個引數的函式中執行一遍!

“從映象啟動(建立一個新卷)”列印:



這裡可以看到,會去呼叫_log_and_attach,去呼叫實際的createattach去建立卷和掛載卷。

“從映象啟動”列印:


這裡可以看到,不會去呼叫_log_and_attach,這裡不會去建卷,更不會去掛載卷,都在後面的_create_image中來處理。這裡經過再次確認,確實不會呼叫。

“從雲硬碟啟動”,列印:



這裡也會去執行map中的回撥函式:_log_and_attach函式,去掛載已經建立好的雲硬碟。

這裡最根本的是要搞清楚:

block_device_mapping是什麼?

map(_log_and_attach, block_device_mapping)做了什麼?

這裡還沒搞明白,後面再研究。


相關推薦

OpenstackNova硬碟啟動映象啟動映象啟動建立一個_prep_block_device差異

原文網址:http://blog.csdn.net/xiangpingli/article/details/47913059 在前面跟蹤分析了:“從映象啟動”、“從映象啟動(建立一個新卷)”過程中,卷的建立是在_build_resources->_prep_blo

openstacknova硬碟啟動建立虛擬機器的流程

原文網址:http://blog.csdn.net/xiangpingli/article/details/47912601 先使用cinder建立雲硬碟 然後在nova中建立示例的時候,會先在_prep_block_device中掛載cinder中建立的卷,然後建

openstacknova映象啟動建立一個建立虛擬機器的流程

原文網址:http://blog.csdn.net/xiangpingli/article/details/47912777 nova還有一種啟動方式:“從映象啟動(建立一個新卷)” 這個流程中,nova會在_prep_block_device中的attach_blo

openstack 虛機丟失恢復 硬碟存在,但虛機丟失或無法啟動

openstack中有很多虛機在物理機重啟或服務重啟,資源不足,被人誤刪等原因導致在計算節點執行好好的虛機變成了 ERROR狀態或者shutoff 更可悲的是無法重啟,那樣如果機器中跑著業務,損失就大了。 現基於卷虛機跟大家分享一個解決方案  1. 為了測試對比,現在已有的卷虛機上寫東西,證明資料完

阿里 - 更換系統盤附帶檔案遷移過程遇到的一些錯誤

  * 必須先生成 【例項快照】,才能繼續生成 【系統映象】   進入方式:雲伺服器ECS -> 例項 -> 點選【例項ID】進入 ->  2. 本例項磁碟 -> 操作列中點選建立快照    3. 檢

查看Linux內核版本命令兩種方法

use proc color tex 2.6 distrib oot lin hat 一、查看Linux內核版本命令(兩種方法):1、cat /proc/version[[email protected]CentOS home]# cat /proc/versio

第二周神經網絡的編程基礎----------2編程作業常見問題與答案Programming Assignment FAQ

sort sign 常見問題 keep 什麽 有變 圖標 更新 無限循環 Please note that when you are working on the programming exercise you will find comments that say "#

【Java TCP/IP Socket】深入剖析socket——TCP通信由於底層隊列填滿而造成的死鎖問題含代碼

parameter 兩個 因此 tar 機制 至少 基礎 named 測試 基礎準備 首先需要明白數據傳輸的底層實現機制,在http://blog.csdn.net/ns_code/article/details/15813809這篇博客中有詳細的介紹,在上面的博

微信支付手機系統自帶的瀏覽器,調用微信支付如何實現非掃碼

所有 價格 驗證 返回 調用 -i 是否為空 支付申請 data- Q:翻看了微信支付的api沒發現支持h5調支付接口的情況(微信js除外),然後卻發現美團的支付成功調用了,這是怎麽實現的? A: 使用微信H5支付即可。H5支付通過URL調起微信APP,

關於Spring boot讀取屬性配置文件出現中文亂碼的問題的解決針對application.properties

HA inf encoding 屬性 文件中 ide for 出現 spring 兩種方法: 方法一:在配置文件中設置中文編碼: banner.charset=utf-8server.tomcat.uri-encoding=UTF-8spring.http.encoding

題解報告hdu 2188 悼念512汶川大地震遇難同胞——選拔誌願者巴什博弈

desc 考核 解題思路 bsp c代碼 字符串 每次 代碼 ont 題目鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=2188 Problem Description 對於四川同胞遭受的災難,全國人民紛紛伸出援助之手,幾乎每個省

群暉(黑) 篇四申請免費SSL證書以及用群暉套件搭建郵件服務器可以收藏的

智能 等待 默認項目 家用路由器 asq 地方 服務器搭建 復制 for 轉載的文章 群暉(黑) 篇四:申請免費SSL證書以及用群暉套件搭建郵件服務器 前言這個系列是關於群暉常用套件的使用記錄,前兩篇討論了監控中心,虛擬機,

Java學習——方法傳遞參數分簡單類型與復雜類型引用類型編程計算100+98+96+。。。+4+2+1的值,用遞歸方法實現

dig oid 傳遞 system alt style 類型 遞歸 gen package hello; public class digui { public static void main(String[] args) { /

二叉樹建立與訪問先序,序,後序

二叉樹的建立(先序建立) 二叉樹的訪問(遞迴與非遞迴 先序)(遞迴與非遞迴中序)(遞迴與非遞迴 後序) #include<iostream> #include<stack> using namespace std; struct Tree_Node ///結點的

C# 選擇檔案選擇資料夾開啟檔案或者資料夾 路徑獲取檔案全路徑目錄副檔名檔名稱 追加拷貝刪除移動檔案建立目錄 修改檔名資料夾名!!

https://www.cnblogs.com/zhlziliaoku/p/5241097.html 1、選擇檔案用OpenDialog OpenFileDialog dialog = new OpenFileDialog(); dialog.Multiselect = true;/

《TensorFlow實戰Google深度學習框架》--5.2.1 MNIST手寫識別問題程式已改進

目錄 MNIST資料集介紹: TensorFlow完整訓練MNIST資料集(程式已改進): 本篇部落格涉及很多本書第4章的知識:啟用函式、指數衰減的學習率設定、正則化、滑動平均等知識。如有疑問請參考本部落格關於第4章記錄介紹。 MNIST資料集介紹: MNIST資料集是N

ml課程概率圖模型—貝葉斯網路隱馬爾可夫模型相關含程式碼實現

以下是我的學習筆記,以及總結,如有錯誤之處請不吝賜教。 本文主要介紹機器學習中的一個分支——概率圖模型、相關基礎概念以及樸素貝葉斯、隱馬爾可夫演算法,最後還有相關程式碼案例。 說到機器學習的起源,可以分為以下幾個派別: 連線主義:又稱為仿生學派(bionicsism)或生理學派

Java帶包建立及引用的類的編譯

Java中帶包(建立及引用)的類的編譯 Java中帶包(建立及引用)的類的編譯與除錯 java源程式的編譯大家都知道,也就是cmd中到原始檔所在目錄下javac **.java即可,當程式中有包宣告還能簡簡單單的直接javac **.java嗎?答案當然是no,下面舉個簡單的例子證明一下直接

劍指offer陣列的逆序對

時間限制:2秒 空間限制:32768K 熱度指數:228207 本題知識點: 陣列 題目描述 在陣列中的兩個數字,如果前面一個數字大於後面的數字,則這兩個數字組成一個逆序對。輸入一個數組,求出這個陣列中的逆序對的總數P。並將P對1000000007取模的結果輸出。 即輸出P%1000

劍指offer陣列出現次數超過一半的數字

時間限制:1秒 空間限制:32768K 熱度指數:248291 本題知識點: 陣列 題目描述 陣列中有一個數字出現的次數超過陣列長度的一半,請找出這個數字。例如輸入一個長度為9的陣列{1,2,3,2,2,2,5,4,2}。由於數字2在陣列中出現了5次,超過陣列長度的一半,因此輸出2。