libvirt內部原理

2021-06-08 07:08:35 字數 2388 閱讀 6824

1. 什麼是libvirt,它的功能有哪些?

libvirt 是管理虛擬機器和其他虛擬化功能,比如儲存管理,網路管理的軟體集合。這

些軟體包括乙個api 庫、乙個daemon(libvirtd)和乙個命令列工具(virsh)。

the goal of libvirt: to provide a common and stable layer sufficient to

securely manage domains on a node, possibly remote

主要功能:

a) 虛擬機器管理:包括不同的領域生命週期操作,比如:啟動、停止、暫停、儲存、恢

復和遷移。支援多種裝置型別的熱插拔操作,包括:磁碟、網絡卡、記憶體和cpu。

b) 儲存管理:pool(local, netfs, iscsi, lvm 等)和volume(qcow2、vmdk、raw 等)

c) 網路管理:管理物理和邏輯的網路介面。

d) 虛擬nat 和基於路由的網路:任何執行了libvirt daemon 的主機都可以用來管理

和建立虛擬網路。

e) state monitoring apis needed to implement management policies

2. 體系結構

3. 內部原理

a) daemon(libvirtd)的功能

i. 遠端**

ii. 本地環境初始化

iii. 根據環境註冊各種driver(qemu, xen, storage…)的實現。

driver 有統一的介面,各driver 就是實現這些介面, 內部再呼叫command,

qemu 介面, xen 介面等等

b) virsh

它是libvirt 的客戶,提供命令列。

執行的步驟:

i. 初始化建立conn

實際上是根據connection 引數選擇具體的driver

ii. 解析引數,根據函式列表呼叫具體的函式。比如:

cmdcreate

cmdpoolcreate

… …iii. 最終呼叫api 來完成:

virdomaincreatexml

virstoragepoolcreatexml

… …c) api

函式和資料結構宣告: /usr/include/libvirt/libvirt.h

函式實現: ./src/libvirt.c

api 的實際動作最終呼叫各driver 的實現

virdomaincreatexml()

|-- conn->driver->domaincreate()

virstoragepoolcreatexml

|--conn->storagedriver->poolcreate()

… …d) python 繫結

i. python **import 「/usr/lib64/python2.6/site-packages/libvirt.py」

ii. 呼叫python 介面

iii. 實際呼叫的/usr/lib64/python2.6/site-packages/libvirtmod.so 裡的函式

iv. libvirtmod.so 最後還是呼叫api

e) driver 實現(driver 和impl 的關係,以qemu 和storage 為例)

./src/qemu/qemu_driver.c 裡申明了driver 介面:

static virdriver qemudriver =

qemuddomaincreate

|-- qemuprocessstart

| |-- cmd = qemubuildcommandline()

| |-- vircommandrun(cmd)

經過一通判斷和計算,最後還是呼叫」qemu-kvm」命令

./ src/storage/storage_driver.c 裡申明了storage driver 介面:

static virstoragedriver storagedriver =

storagepoolstart

|-- backend = virstoragebackendfortype()

|-- backend->startpool() == virstoragebackendiscsistartpool()

| |-- virstoragebackendiscsiscantargets()

| |-- virstoragebackendiscsiconnection()

| | |-- cmd = vircommandnewargs(「iscsiadm …」)

| | |-- vircommandrun(cmd)

經過一通判斷和計算,最後還是呼叫」iscsiadm」命令

AsyncTask內部原理

asynctask 是乙個封裝了 threadpoolexecutor 和 handler 機制的抽象類,其作用是方便開發者進行多個非同步任務時無需手動在每個執行緒中都採用 handler 機制來通知 ui 執行緒進行操作,從而簡化了多個非同步任務與 ui 執行緒的通訊的情況.我們先留下幾個問題,在...

oracle內部原理

總是以為對oracle很了解,已經使用了好多年,基本是增 刪 改 查,偶爾搞搞plsql,儲存過程等等,算是老使用者了!看到網上的大牛的理解程度,真是不堪一擊,要往這條路發展,還有好多東西要學習 國內的it技術,個人認為資料庫技術已經很牛了!其他的技術不敢下結論 color green size x...

iOS Switch內部原理

1 假設switch語句的分支比較少的時候 例如3,少於4的時候沒有意義 沒有必要使用此結構,相當於if。2 各個分支常量的差值較大的時候,編譯器會在效率還是記憶體進行取捨,這個時候編譯器還是會編譯成類似於if,else的結構。三個及以下case 1.建立工程在main函式頁面寫下如下 void f...