1. 程式人生 > WINDOWS開發 >virsh命令和呼叫libvirt api的區別

virsh命令和呼叫libvirt api的區別

答曰:virsh是libvirt API的封裝

libvirt是什麼

libvirt是用來管理虛擬機器或虛擬化功能的軟體集合,主要包括:

   1. libvirt API

   2. libvirtd程序

   3. virsh工具集 這三部分。 最初的目的是為不同的hypervisor提供統一的管理介面。

詳解如下:

1. Libvirt API

不同版本的API具體參見:http://libvirt.org/hvsupport.htmllibvirt api主要為不同的虛擬化技術方案對外提供統一的介面,其設計思想為:
(1)isolation from HV API changes - 隔離底層

硬體虛擬化介面對上層的影響
(2)portable across HV - 支援多種os,如linux,windows,solairs等
(3)rapid application development - 提供封裝的API,加快軟體開發的過程
(4)TLS,SASL,SSH,PolicyKit - 提供各種加密協議,保證了上層應用對下層資源的安全訪問
通過封裝最原始的C庫,實現了多種程式語言的介面:Perl,Python,OCaml,Java,Ruby,C#,Php,並對目前在應用層程式設計中常用的協議進行封裝,形成不同的協議庫,方便在應用層程式設計中呼叫,目前主要支援:

1. Mapping to CIM/DMTF: libvirt-cim

  公共資訊模型CIM,是一個與具體實現無關的、用於描述管理資訊的概念性模型。
2. Mapping to AMQP/QMF: libvirt-qmf
  AMQP是一個提供統一訊息服務的應用層標準協議,是一種二進位制協議,提供客戶端應用與訊息中介軟體之間非同步、安全、高效地互動。
  基於此協議的客戶端與訊息中介軟體可傳遞訊息,並不受客戶端/中介軟體不同產品,不同開發語言等條件的限制。
3. Mapping to SNMP: libvirt-snmp
  該庫使得libvirt具備SNMP的功能,開發人員能夠通過SNMP來監控和設定每個node上不同domain的資訊
4.Mapping to GObject: libvirt-glib

2. daemon程序(libvirtd )

該後臺程序主要實現以下功能:

(1)遠端代理
  所有remote client傳送來的命令,由該程序監測執行
(2)本地環境初始化
  libvirt服務的啟停,使用者connection的響應等
(3)根據環境註冊各種Driver(qemu,xen,storage…)的實現
  不同虛擬化技術以Driver的形式實現,由於libvirt對外提供的e799bee5baa6e59b9ee7ad9431333337376364是統一的介面,所以各個Driver就是實現這些介面, 即將Driver註冊到libvirt中

3. virsh 工具集  

  是libvirt API的封裝,以Command Line Interface提供的對外介面。

4. 通過virsh命令或介面建立虛擬機器例項的程式碼執行路徑:

1)virsh命令或API介面c建立虛擬機器 -- 介面層
  virsh create vm.xml 或者 virDomainPtr virDomainCreateXML (virConnectPtr conn,const char * xmlDesc,unsigned int flags)
(2)呼叫libvirt提供的統一介面 -- 抽象驅動層
  conn->driver->domainCreateXML(conn,xmlDesc,flags); //此處的domainCreateXML即抽象的統一介面,這裡並不需要關心底層的driver是kvm,還是xen
(3)呼叫底層的相應虛擬化技術的介面 -- 具體驅動層
  domainCreateXML = qemuDomainCreateXML; //如果driver=qemu,那麼此處即呼叫的qemu註冊到抽象驅動層上的函式qemuDomainCreateXML
(4)拼裝shell命令,並執行
  以qemu為例,qemuDomainCreateXML首先會拼裝一條建立虛擬機器的命令,比如qemu -hda disk.img,然後建立一個新的執行緒來執行
  回過頭來思考,libvirt通過4步,將最底層的直接在shell中輸入命令來完成的操作進行了抽象封裝,給應用程式開發人員提供了統一的,易用的介面。

5. 抽象驅動層

目前,libvirt以下幾種型別的抽象驅動,每一種型別的驅動代表某以功能模組的抽象封裝:

(1)虛擬化驅動(virDriverPtr)
(2)虛擬網路驅動(virNetworkDriverPtr)
(3)物理網絡卡驅(virInterfaceDriverPtr)
(4)儲存驅動(virStorageDriverPtr)
(5)監控驅動(virDeviceMonitorPtr)
(6)安全驅動(virSecretDriverPtr)
(7)過濾驅動(virNWFilterDriverPtr)
(8)狀態驅動(virStateDriverPtr)