天天看點

【KVM系列05】Libvirt 介紹

                                                                         第五章 Libvirt 介紹

1. Libvirt 是什麼

1.1 Libvirt C API

1.2 Libvirt XML 定義

1.3 Libvirt API 的實作

1.4 Libvirt 的 Python 綁定

2. QEMU/KVM libvirt 驅動

2.1 架構

2.2 安裝

2.3 libvirt log

3 使用 libvirt 程式設計來管理 KVM 虛機的執行個體

【KVM系列文章】https://blog.csdn.net/baidu_37107022/article/details/88812463

1. Libvirt 是什麼

為什麼需要Libvirt?

  1. Hypervisor 比如 qemu-kvm 的指令行虛拟機管理工具參數衆多,難于使用。
  2. Hypervisor 種類衆多,沒有統一的程式設計接口來管理它們,這對雲環境來說非常重要。
  3. 沒有統一的方式來友善地定義虛拟機相關的各種可管理對象。

Libvirt提供了什麼?

  1. 它提供統一、穩定、開放的源代碼的應用程式接口(API)、守護程序 (libvirtd)和和一個預設指令行管理工具(virsh)。
  2. 它提供了對虛拟化客戶機和它的虛拟化裝置、網絡和存儲的管理。
  3. 它提供了一套較為穩定的C語言應用程式接口。目前,在其他一些流行的程式設計語言中也提供了對libvirt的綁定,在Python、Perl、Java、Ruby、PHP、OCaml等進階程式設計語言中已經有libvirt的程式庫可以直接使用。
  4. 它對多種不同的 Hypervisor 的支援是通過一種基于驅動程式的架構來實作的。libvirt 對不同的 Hypervisor 提供了不同的驅動,包括 Xen 的驅動,對QEMU/KVM 有 QEMU 驅動,VMware 驅動等。在 libvirt 源代碼中,可以很容易找到 qemu_driver.c、xen_driver.c、xenapi_driver.c、vmware_driver.c、vbox_driver.c 這樣的驅動程式源代碼檔案。
  5. 它作為中間适配層,讓底層 Hypervisor 對上層使用者空間的管理工具是可以做到完全透明的,因為 libvirt 屏蔽了底層各種 Hypervisor 的細節,為上層管理工具提供了一個統一的、較穩定的接口(API)。
  6. 它使用 XML 來定義各種虛拟機相關的受管理對象。

     目前,libvirt 已經成為使用最為廣泛的對各種虛拟機進行管理的工具和應用程式接口(API),而且一些常用的虛拟機管理工具(如virsh、virt-install、virt-manager等)和雲計算架構平台(如OpenStack、OpenNebula、Eucalyptus等)都在底層使用libvirt的應用程式接口。

【KVM系列05】Libvirt 介紹
【KVM系列05】Libvirt 介紹

 (SLE 11)

1.1 Libvirt C API

1.1.1 Libvirti API 所管理的主要對象

對象 解釋
Domain (域) 指運作在由Hypervisor提供的虛拟機器上的一個作業系統執行個體(常常是指一個虛拟機)或者用來啟動虛機的配置。
Hypervisor 一個虛拟化主機的軟體層
Node (主機) 一台實體伺服器。
Storage pool (存儲池) 一組存儲媒介的集合,比如實體硬碟驅動器。一個存儲池被劃分為小的容器稱作卷。卷會被分給一個或者多個虛機。
Volume (卷) 一個從存儲池配置設定的存儲空間。一個卷會被分給一個或者多個域,常常成為域裡的虛拟硬碟。

1.1.2 對象的管理模型

對象名稱 對象 Python 類 描述
Connect 與 Hypervisor的連接配接 virConnectPtr 在調用任何 API 去管理一個本地或者遠端的Hypervisor前,必須建立和這個Hypervisor的連接配接。
Domain Guest domain virDomainPtr 用于列舉和管理已有的虛機,或者建立新的虛機。唯一辨別:ID,Name,UUID。一個域可能是暫時性的或者持久性的。暫時性的域隻能在它運作期間被管理。持久性的域在主機上儲存了它的配置。
Virtual Network 虛拟網絡 virNetworkPtr 用于管理虛機的網絡裝置。唯一辨別:Name,UUID。一個虛拟網絡可能是暫時性的或者持久性的。每個主機上安裝libvirt後,它都有一個預設的網絡裝置“default”。它向該主機上運作的虛機提供DHCP服務,以及通過NAT連接配接到主機上。
Storage Pool 存儲池 virStoragePoolPtr 用于管理虛拟機内的所有存儲,包括 local disk, logical volume group, iSCSI target, FibreChannel HBA and local/network file system。唯一辨別:Name,UUID。一個存儲池可能是暫時性的或者持久性的。Pool 的 type 可以是  dir, fs, netfs, disk, iscsi, logical, scsi,mpath, rbd, sheepdog, gluster 或者 zfs。
Storage Volume   存儲卷 virStorageVolPtr 用于管理一個存儲池内的存儲塊,包括一個池内配置設定的塊、磁盤分區、邏輯卷、SCSI/iSCSI Lun,或者一個本地或者網絡檔案系統内的檔案等。唯一辨別:Name,Key,Path。
Host device  主機裝置 virNodeDevPtr

用于管理主機上的實體硬體裝置,包括 the physical USB or PCI devices and logical devices these provide, such as a NIC, disk, disk

controller, sound card, etc。唯一辨別:Name。

1.1.3 API 的簡單分類

Libvirt API 就是對各種對象的各種操作,包括基本的增、删、改、查操作和其它操作。

對象 其它
Connect

virConnectOpen

virConnectOpenAuth

virConnectOpenReadOnly

virConnectClose virConnectSetKeepAlive
Strorage pool

virStoragePoolBuild

virStoragePoolCreate

virStoragePoolCreateXML

virStoragePoolDefineXML

virStoragePoolDelete

virStoragePoolDestroy

virStoragePoolFree

virStoragePoolUndefine

virStoragePoolRefresh

virStoragePoolSetAutostart

virConnectFindStoragePoolSources

virConnectListAllStoragePools

virConnectListDefinedStoragePools

virConnectListStoragePools

virConnectNumOfDefinedStoragePools

virConnectNumOfStoragePools

virStoragePoolGetInfo/Name/UUID/UUIDString/XMLDesc

 virStoragePoolIsActive/Persistent

virStoragePoolLookupByName/UUID/UUIDString/Volume

virStoragePoolRef

virStoragePoolGetAutostart

virStoragePoolGetConnect

virStoragePoolNumOfVolumes

virStoragePoolListAllVolumes

virStoragePoolListVolumes

Storage volume

virStorageVolCreateXML

virStorageVolCreateXMLFrom

virStorageVolDelete

virStorageVolFree

virStorageVolResize

virStorageVolUpload

virStorageVolWipe

virStorageVolWipePattern

virStorageVolGetConnect/Info/Key/Name/Path/XMLDesc

 virStorageVolLookupByKey/Name/Path

virStorageVolRef

virStorageVolDownload
Network

virNetworkCreate

virNetworkCreateXML

virNetworkDefineXML

virNetworkDestroy

virNetworkFree

virNetworkUndefine

virNetworkSetAutostart

virNetworkUpdate

virConnectListAllNetworks

virConnectListDefinedNetworks

virConnectListNetworks

virConnectNumOfDefinedNetworks

virConnectNumOfNetworks

virNetworkGetBridgeName/DHCPLeases/Name/UUID/UUIDString/XMLDesc

virNetworkIsActive/Persistent

 virNetworkLookupByName/UUID/UUIDString

virNetworkGetAutostart

virNetworkGetConnect

virConnectNetworkEventDeregisterAny

virConnectNetworkEventGenericCallback

virNetworkDHCPLeaseFree

Domain snapshot virDomainSnapshotCreateXML

virDomainSnapshotDelete

virDomainSnapshotFree

virDomainRevertToSnapshot

virDomainHasCurrentSnapshot

virDomainListAllSnapshots

virDomainSnapshotCurrent

virDomainSnapshotGetConnect/Domain/Name/Parent/XMLDesc

virDomainSnapshotHasMetadata

virDomainSnapshotIsCurrent

virDomainSnapshotListAllChildren

virDomainSnapshotListChildrenNames

virDomainSnapshotListNames

virDomainSnapshotLookupByName

virDomainSnapshotNum

virDomainSnapshotNumChildren

virDomainSnapshotRef

Host

virInitialize

virNodeSetMemoryParameters

virNodeSuspendForDuration

virConnectBaselineCPU

virConnectCompareCPU

virConnectGetCPUModelNames/Capabilities/Hostname/LibVersion/MaxVcpus/Sysinfo/Type/URI/Version

virConnectIsAlive

virConnectIsEncrypted

virConnectIsSecure

virGetVersion

virNodeGetCPUMap/CPUStats /CellsFreeMemory/FreeMemory/Info/MemoryParameters/MemoryStats /

 virNodeGetSecurityModel

virTypedParamsAddBoolean

virTypedParamsAddDouble

virTypedParamsAddFromString

virTypedParamsAddInt

virTypedParamsAddLLong

virTypedParamsAddString

virTypedParamsAddUInt

virTypedParamsAddULLong

virTypedParamsClear

virTypedParamsFree

virTypedParamsGet

Interface

virInterfaceCreate

virInterfaceDefineXML

virInterfaceDestroy

virInterfaceFree

virInterfaceUndefine

virInterfaceChangeBegin

virInterfaceChangeCommit

virInterfaceChangeRollback

virConnectListAllInterfaces

virConnectListDefinedInterfaces

virConnectListInterfaces

virConnectNumOfDefinedInterfaces

virConnectNumOfInterfaces

virInterfaceGetConnect

virInterfaceGetMACString

virInterfaceGetName

virInterfaceGetXMLDesc

virInterfaceIsActive

virInterfaceLookupByMACString

virInterfaceLookupByName

virInterfaceRef

Net Filter virNWFilterDefineXML

virNWFilterFree

virNWFilterUndefine

virConnectListAllNWFilters

virConnectListNWFilters

virConnectNumOfNWFilters

virNWFilterGetName

virNWFilterGetUUID

virNWFilterGetUUIDString

virNWFilterGetXMLDesc

virNWFilterLookupByName

virNWFilterLookupByUUID

virNWFilterLookupByUUIDString

virNWFilterRef

Domain Event

virConnectDomainEventDeregister

virConnectDomainEventDeregisterAny

virConnectDomainEventDeviceAddedCallback

virConnectDomainEventDeviceRemovedCallback

virConnectDomainEventAgentLifecycleCallback

virConnectDomainEventBalloonChangeCallback

virConnectDomainEventBlockJobCallback

virConnectDomainEventCallback

virConnectDomainEventDiskChangeCallback

virConnectDomainEventGenericCallback

virConnectDomainEventGraphicsCallback

virConnectDomainEventIOErrorCallback

virConnectDomainEventIOErrorReasonCallback

virConnectDomainEventPMSuspendCallback

virConnectDomainEventPMSuspendDiskCallback

Domain

virDomainCreate

virDomainCreateLinux

virDomainCreateWithFiles

virDomainCreateWithFlags

virDomainCreateXML

virDomainCreateXMLWithFiles

virDomainDefineXML

virDomainDefineXMLFlags

virDomainDestroy

virDomainDestroyFlags

virDomainFree

virDomainUndefine

virDomainUndefineFlags

virDomainUpdateDeviceFlags

virDomainAbortJob

virDomainAddIOThread

virDomainDelIOThread

virDomainAttachDevice

virDomainAttachDeviceFlags

virDomainDetachDevice

virDomainDetachDeviceFlags

virDomainBlockCommit

virDomainBlockCopy

virDomainBlockJobAbort

virDomainBlockJobSetSpeed

virDomainBlockPeek

virDomainBlockPull

virDomainBlockRebase

virDomainBlockResize

virDomainCoreDump

virDomainCoreDumpWithFormat

virDomainFSFreeze

virDomainFSInfoFree

virDomainFSThaw

virDomainFSTrim

virDomainInjectNMI

virDomainInterfaceFree

virDomainManagedSave

virDomainManagedSaveRemove

virDomainMigrate

virDomainMigrate2

virDomainMigrate3

virDomainMigrateSetCompressionCache

virDomainMigrateSetMaxDowntime

virDomainMigrateSetMaxSpeed

virDomainMigrateToURI

virDomainMigrateToURI2

virDomainMigrateToURI3

virDomainOpenChannel

virDomainOpenConsole

virDomainOpenGraphics

virDomainOpenGraphicsFD

virDomainPMSuspendForDuration

virDomainPMWakeup

virDomainReboot

virDomainReset

virDomainRestore

virDomainRestoreFlags

virDomainResume

virDomainSave

virDomainSaveFlags

virDomainSaveImageDefineXML

virDomainScreenshot

virDomainSendKey

virDomainSendProcessSignal

virDomainShutdown

virDomainShutdownFlags

virDomainSuspend

virDomainSetAutostart

virDomainSetBlkioParameters

virDomainSetBlockIoTune

virDomainSetInterfaceParameters

virDomainSetMaxMemory

virDomainSetMemory

virDomainSetMemoryFlags

virDomainSetMemoryParameters

virDomainSetMemoryStatsPeriod

virDomainSetMetadata

virDomainSetNumaParameters

virDomainSetSchedulerParameters

virDomainSetSchedulerParametersFlags

virDomainSetTime

virDomainSetUserPassword

virDomainSetVcpus

virDomainSetVcpusFlags

virConnectGetAllDomainStats

virConnectGetDomainCapabilities

virConnectListAllDomains

virConnectListDefinedDomains

virConnectListDomains

virConnectNumOfDefinedDomains

virConnectNumOfDomains

virDomainBlockStats

virDomainBlockStatsFlags

virDomainGetAutostart

virDomainGetBlkioParameters

virDomainGetBlockInfo

virDomainGetBlockIoTune

virDomainGetBlockJobInfo

virDomainGetCPUStats

virDomainGetConnect

virDomainGetControlInfo

virDomainGetDiskErrors

virDomainGetEmulatorPinInfo

virDomainGetFSInfo

virDomainGetHostname

virDomainGetID

virDomainGetIOThreadInfo

virDomainGetInfo

virDomainGetInterfaceParameters

virDomainGetJobInfo

virDomainGetJobStats

virDomainGetMaxMemory

virDomainGetMaxVcpus

virDomainGetMemoryParameters

virDomainGetMetadata

virDomainGetName

virDomainGetNumaParameters

virDomainGetOSType

virDomainGetSchedulerParameters

virDomainGetSchedulerParametersFlags

virDomainGetSchedulerType

virDomainGetSecurityLabel

virDomainGetSecurityLabelList

virDomainGetState

virDomainGetTime

virDomainGetUUID

virDomainGetUUIDString

virDomainGetVcpuPinInfo

virDomainGetVcpus

virDomainGetVcpusFlags

virDomainGetXMLDesc

virDomainHasManagedSaveImage

virDomainIOThreadInfoFree

virDomainInterfaceAddresses

virDomainInterfaceStats

virDomainIsActive

virDomainIsPersistent

virDomainIsUpdated

virDomainListGetStats

virDomainLookupByID

virDomainLookupByName

virDomainLookupByUUID

virDomainLookupByUUIDString

virDomainMemoryPeek

virDomainMemoryStats

virDomainMigrateGetCompressionCache

virDomainMigrateGetMaxSpeed

virDomainPinEmulator ?

virDomainPinIOThread

virDomainPinVcpu

virDomainPinVcpuFlags

virDomainSaveImageGetXMLDesc

virDomainStatsRecordListFree

virConnectDomainXMLFromNative

virConnectDomainXMLToNative

Secret virSecretDefineXML

virSecretFree

virSecretUndefine

virSecretSetValue

virConnectListAllSecrets

virConnectListSecrets

virConnectNumOfSecrets

virSecretGetConnect/UUID/UUIDString/UsageID/UsageType/Value/XMLDesc

virSecretLookupByUUID/UUIDString/Usage

virSecretRef

Stream virStreamNew virStreamFree

virStreamFinish

virStreamAbort

virStreamRecv

virStreamRecvAll

virStreamSend

virStreamSendAll

virStreamSinkFunc

virStreamSourceFunc

1.2 Libvirt XML 定義

Libvirt 使用 XML 來定義各種對象,其中,與 OpenStack Nova 關系比較密切的有:

disk (磁盤) 任何磁盤裝置,包括軟碟(floppy)、硬碟(hard disk)、光驅(cdrom)或者半虛拟化驅動都使用 元素來定義。 方式:
。其中:
           
  • ”type“ 用來指定device source 的類型:"file", "block", "dir", "network", 或者 "volume"。具體的 source  由 标簽定義。
  • ”device“ 用來指定 device target 的類型:"floppy", "disk", "cdrom", and "lun", 預設為 "disk" 。具體的 target 由 标簽定義。
(1)”volume“ 類型的 disk
  1. 'volume' device='disk'>

  2. 'qemu' type='raw'/>

  3. 'blk-pool0' volume='blk-pool0-vol0'/>

  4. 'hdk' bus='ide'/>

(2)”file“ 類型的 disk
  1. 'file' snapshot='external'>

  2. "tap" type="aio" cache="default"/>

  3. '/var/lib/xen/images/fv0' startupPolicy='optional' />

  4. 'hda' bus='ide'/>

(3)”block“ 類型的 disk
  1. 'block' device='cdrom'>

  2. 'qemu' type='raw'/>

  3. 'hdd' bus='ide' tray='open'/>

  4. <readonly/>

(4)”network“ 類型的 disk
  1. 'network' device='cdrom'>

  2. 'qemu' type='raw'/>

  3. "http" name="url_path">

  4. "hostname" port="80"/>

  5. 'hde' bus='ide' tray='open'/>

  6. <readonly/>

Host device assignment (主機裝置配置設定)
  1. 'subsystem' type='usb'> #USB 裝置直接配置設定 'optional'>

  2. '0x1234'/>

  3. '0xbeef'/>

  4. '2'/>

  5. 'subsystem' type='pci' managed='yes'> #PCI 裝置直接配置設定

  6. '0x0000' bus='0x06' slot='0x02' function='0x0'/>

  7. '1'/>

  8. 'on' file='/etc/fake/boot.bin'/>

Network interface (網卡)
有幾種 interface 類型:
           
(1)type = ‘network’ 定義一個連接配接 Virtual network 的 interface
           
  1. <interface type='network'>

  2. 'default'/> #虛拟網絡的名稱為 ‘default’ <!--interface> ... <interface type='network'>

  3. 'default' portgroup='engineering'/>

  4. 'vnet7'/>

  5. "00:11:22:33:44:55"/>

  6. '09b11c53-8b5c-4eeb-8f00-d84eaa0aaa4f'/>

  7. <!--interface>

#virsh:attach-interface --domain d-2 --type network --source isolatednet1 --mac 52:53:00:4b:75:6f --config
           
(2)type=‘birdge’ 定義一個 Bridge to LAN(橋接到實體網絡)的interface:前提是主機上存在一個 bridge,該 bridge 已經連到實體LAN。
           
  1. <interface type='bridge'> #連接配接到 br0 'br0'/>

  2. <!--interface>

  3. <interface type='bridge'> #連接配接到br1 'br1'/>

  4. 'vnet7'/>

  5. "00:11:22:33:44:55"/>

  6. <!--interface>

  7. <interface type='bridge'> #連接配接到 Open vSwithc bridge ovsbr 'ovsbr'/>

  8. 'openvswitch'>

  9. 'menial' interfaceid='09b11c53-8b5c-4eeb-8f00-d84eaa0aaa4f'/>

  10. <!--interface>

#virsh:attach-interface --domain d-2 --type bridge --source virbr0 --mac 52:22:33:44:55:66 --config
           
(3)type=‘ethernet’ 定義一個使用指定腳本連接配接到 LAN 的 interface
           
  1. <interface type='ethernet'>

  2. 'vnet7'/>

  3. '/etc/qemu-ifup-mynet'/>

  4. </interface>

(4)type=‘direct’ 定義一個直接連到實體網卡(Direct attachment to physical interface)的 interface:需要 Linux macvtap 驅動支援
           
  1. <interface type='direct' trustGuestRxFilters='no'>

  2. <source dev='eth0' mode='vepa'/>

  3. </interface>

(5)type=‘hostdev’ 定義一個由主機PCI 網卡直接配置設定(PCI Passthrough)的 interface: 配置設定主機上的網卡給虛機
           
  1. <interface type='hostdev' managed='yes'>

  2. <driver name='vfio'/>

  3. <address type='pci' domain='0x0000' bus='0x00' slot='0x07' function='0x0'/>

  4. <mac address='52:54:00:6d:90:02'/>

  5. <virtualport type='802.1Qbh'>

  6. <parameters profileid='finance'/>

  7. </interface>

network (網絡)

1. bridge:定義一個用于構造該虛拟網絡的網橋。 

2. domain:定義 DHCP server 的 DNS domain。

3. forward: 定義虛拟網絡直接連到實體 LAN 的方式. ”mode“指轉發模式。

 (1) mode=‘nat’:所有連接配接到該虛拟網絡的虛拟的網絡都會經過實體機器的網卡,并轉換成實體網卡的位址。

  1. default

  2. <bridge name="virbr0" />

  3. <forward mode="nat"/>

  4. <ip address="192.168.122.1" netmask="255.255.255.0">

  5. <range start="192.168.122.2" end="192.168.122.254" />

  6. <ip family="ipv6" address="2001:db8:ca2:2::1" prefix="64" />

也可以指定公共的IP位址和端口号。
  1. <forward mode='nat'><address start='1.2.3.4' end='1.2.3.10'/>

  2. <forward mode='nat'><port start='500' end='1000'/>

(2) mode=‘route’:類似于 NAT,但是不使用NAT,而是使用routing table。  
  1. local

  2. <bridge name="virbr1" />

  3. <forward mode="route" dev="eth1"/>

  4. <ip address="192.168.122.1" netmask="255.255.255.0">

  5. <range start="192.168.122.2" end="192.168.122.254" />

  6. <ip family="ipv6" address="2001:db8:ca2:2::1" prefix="64" />

(3) mode=‘bridge’:使用不受libvirt管理的bridge,比如主機上已有的bridge;open vswitch bridge;使用 macvtap's "bridge"  模式
  1. host-bridge

  2. <forward mode="bridge"/>

  3. <bridge name="br0"/>

(4) mode=‘passthrough’:使用 a macvtap "direct" connection in "passthrough" mode 指定主機上的特定網卡用于虛拟網絡   
  1. <forward mode='passthrough'>

  2. <interface dev='eth10'/>

  3. <interface dev='eth11'/>

  4. <interface dev='eth12'/>

  5. <interface dev='eth13'/>

  6. <interface dev='eth14'/>

(5) mode=‘hostdev’:直接配置設定主機上的網絡裝置。
  1. <forward mode='hostdev' managed='yes'>

  2. <driver name='vfio'/>

  3. <address type='pci' domain='0' bus='4' slot='0' function='1'/>

  4. <address type='pci' domain='0' bus='4' slot='0' function='2'/>

  5. <address type='pci' domain='0' bus='4' slot='0' function='3'/>

詳細的 XML 定義說明在 https://libvirt.org/format.html。

1.3 Libvirt API 的實作

libvirt API 的實作是在各個 Hypervisor driver 和 Storage dirver 内。Hypervisor 驅動包括:

  • LXC - Linux Containers
  • OpenVZ
  • QEMU
  • Test - Used for testing
  • UML - User Mode Linux
  • VirtualBox
  • VMware ESX
  • VMware Workstation/Player
  • Xen
  • Microsoft Hyper-V
  • IBM PowerVM (phyp)
  • Parallels
  • Bhyve - The BSD Hypervisor

1.4 Libvirt 的 Python 綁定

python-libvirt 包含 Libvirt 的 Python 語言綁定。安裝 libvirt 時,預設會安裝 python-libvirt 。 來源: https://libvirt.org/python.html  https://pypi.python.org/pypi/libvirt-python 

Python API 和 C API 之間幾乎是一對一的映射關系,比如:​

#C API int virConnectNumOfDomains (virConnectPtr conn); int virDomainSetMaxMemory (virDomainPtr domain, unsigned long memory);


#Python API virConnect::numOfDomains(self) virDomain::setMaxMemory(self, memory)
           

 是以,libvirt 官網并沒有提供詳細的 python API 描述。

2. QEMU/KVM libvirt 驅動

2.1 架構

【KVM系列05】Libvirt 介紹

?Libvirtd 是一個 daemon 程序,可以被本地的virsh調用,也可以被遠端的virsh調用

?Libvirtd 調用 qemu-kvm 操作KVM 虛拟機

這裡有一個 virsh 指令、Libvirt C API、 QEMU driver 方法 和 QEMU Monitor 指令的對照表(部分):

virsh command Public API QEMU driver function Monitor command
virsh create XMLFILE virDomainCreateXML() qemudDomainCreate() info cpus, cont, change vnc password, balloon (all indirectly)
virsh suspend GUEST virDomainSuspend() qemudDomainSuspend() stop
virsh resume GUEST virDomainResume() qemudDomainResume() cont
virsh shutdown GUEST virDomainShutdown() qemudDomainShutdown() system_powerdown
virsh setmem GUEST MEM-KB virDomainSetMemory() qemudDomainSetMemory() balloon (indirectly)
virsh dominfo GUEST virDomainGetInfo() qemudDomainGetInfo() info balloon (indirectly)
virsh save GUEST FILENAME virDomainSave() qemudDomainSave() stop, migrate exec
virsh restore FILENAME virDomainRestore() qemudDomainRestore() cont
virsh dumpxml GUEST virDomainDumpXML() qemudDomainDumpXML() info balloon (indirectly)
virsh attach-device GUEST XMLFILE virDomainAttachDevice() qemudDomainAttachDevice() change, eject, usb_add, pci_add (all indirectly)
virsh detach-device GUEST XMLFILE virDomainDetachDevice() qemudDomainDetachDevice() pci_del (indirectly)
virsh migrate GUEST DEST-URI virDomainMigrate() qemudDomainMigratePerform() stop, migrate_set_speed, migrate, cont
virsh domblkstat GUEST virDomainBlockStats() qemudDomainBlockStats() info blockstats
- virDomainBlockPeek() qemudDomainMemoryPeek() memsave

2.2 安裝

有三種方式來安裝 libvirt:

(1)下載下傳 libvirt 的源代碼,然後編譯和安裝

(2)從各 Linux 的發行版中直接安裝,比如 Ubuntu 上運作 apt-get install libvirt-bin

(3)從 git 上克隆 libvirt 的代碼,然後編譯和安裝

2.3 libvirt log

這篇文章 描述了 livbirt log。設定所有日志的方法是在 /etc/libvirt/libvirtd.conf 中添加下面的配置然後重新開機 libvirt:

log_filters="1:libvirt 1:util 1:qemu" log_outputs="1:file:/var/log/libvirt/libvirtd.log"
           

3 使用 libvirt 程式設計來管理 KVM 虛機的執行個體

 這裡隻描述基本的過程。具體的過程,下一篇文章會具體分析 Nova 中 libvirt 的使用。

  1. 定義虛機的基本配置,包括 vCPU、記憶體、磁盤或者cdrom以及啟動順序,生成 xml 配置,調用 virDomainCreateXML API 啟動一個虛機
  2. 使用 Domain 相關的 API 來管理虛機的生命周期。我的這篇文章有虛機生命周期的詳細介紹。
  3. 添加磁盤:定義一個 disk 的 xml 配置,使用 virDomainAttachDevice API 将它挂載到虛機上。如果不是本地的源磁盤,需要提前準備好。
  4. 添加interface:使用 Network API 定義一個虛拟網絡(需要提前準備好實體網絡),然後定義一個 interface 的 XML 配置,使用 virDomainAttachDevice API 将它加到虛機。
  5. 按照需要,重複2、3、4步驟。