虛擬化進階(四)

一、 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的應用程序接口。

1.jpg

2.jpg

1.1 Libvirt C API

1.1.1 Libvirti API 所管理的主要對象

對象解釋
Domain (域)指運行在由Hypervisor提供的虛擬機器上的一個操作系統實例(常常是指一個虛擬機)或者用來啓動虛機的配置。
Hypervisor一個虛擬化主機的軟件層
Node (主機)一臺物理服務器。
Storage pool (存儲池)一組存儲媒介的集合,比如物理硬盤驅動器。一個存儲池被劃分爲小的容器稱作卷。卷會被分給一個或者多個虛機。
Volume (卷)一個從存儲池分配的存儲空間。一個卷會被分給一個或者多個域,常常成爲域裏的虛擬硬盤。

1.2 Libvirt XML 定義

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

disk (磁盤)任何磁盤設備,包括軟盤(floppy)、硬盤(hard disk)、光驅(cdrom)或者半虛擬化驅動都使用 <disk> 元素來定義。 方式:
<disk type='**' device='**'>。其中:
  • ”type“ 用來指定device source 的類型:"file", "block", "dir", "network", 或者 "volume"。具體的 source  由 <source> 標籤定義。

  • ”device“ 用來指定 device target 的類型:"floppy", "disk", "cdrom", and "lun", 默認爲 "disk" 。具體的 target 由 <target> 標籤定義。


(1)”volume“ 類型的 disk
    <disk type='volume' device='disk'>
      <driver name='qemu' type='raw'/>
      <source pool='blk-pool0' volume='blk-pool0-vol0'/>
      <target dev='hdk' bus='ide'/>
    </disk>
(2)”file“ 類型的 disk
    <disk type='file' snapshot='external'>
      <driver name="tap" type="aio" cache="default"/>
      <source file='/var/lib/xen/images/fv0' startupPolicy='optional' />
      <target dev='hda' bus='ide'/>
    </disk>
(3)”block“ 類型的 disk
   <disk type='block' device='cdrom'>
      <driver name='qemu' type='raw'/>
      <target dev='hdd' bus='ide' tray='open'/>
      <readonly/>
    </disk>
(4)”network“ 類型的 disk

複製代碼

 <disk type='network' device='cdrom'>
      <driver name='qemu' type='raw'/>
      <source protocol="http" name="url_path">
        <host name="hostname" port="80"/>
      </source>
      <target dev='hde' bus='ide' tray='open'/>
      <readonly/>
    </disk>

複製代碼


Host device assignment (主機設備分配)

複製代碼

   <hostdev mode='subsystem' type='usb'> #USB 設備直接分配
      <source startupPolicy='optional'>
        <vendor id='0x1234'/>
        <product id='0xbeef'/>
      </source>
      <boot order='2'/>
    </hostdev>
    <hostdev mode='subsystem' type='pci' managed='yes'> #PCI 設備直接分配
      <source>
        <address domain='0x0000' bus='0x06' slot='0x02' function='0x0'/>
      </source>
      <boot order='1'/>
      <rom bar='on' file='/etc/fake/boot.bin'/>
    </hostdev>

複製代碼


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

複製代碼

<devices>
    <interface type='network'>
      <source network='default'/> #虛擬網絡的名稱爲 ‘default’
    </interface>
    ...    <interface type='network'>
      <source network='default' portgroup='engineering'/>
      <target dev='vnet7'/>
      <mac address="00:11:22:33:44:55"/>
      <virtualport>
        <parameters instanceid='09b11c53-8b5c-4eeb-8f00-d84eaa0aaa4f'/>
      </virtualport>

    </interface>
  </devices>

複製代碼

#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。

複製代碼

    <interface type='bridge'> #連接到 br0
      <source bridge='br0'/>
    </interface>
    <interface type='bridge'> #連接到br1
      <source bridge='br1'/>
      <target dev='vnet7'/>
      <mac address="00:11:22:33:44:55"/>
    </interface>
    <interface type='bridge'> #連接到 Open vSwithc bridge ovsbr
      <source bridge='ovsbr'/>
      <virtualport type='openvswitch'>
        <parameters profileid='menial' interfaceid='09b11c53-8b5c-4eeb-8f00-d84eaa0aaa4f'/>
      </virtualport>
    </interface>

複製代碼

#virsh:attach-interface --domain d-2 --type bridge --source virbr0 --mac 52:22:33:44:55:66 --config
(3)type=‘ethernet’ 定義一個使用指定腳本連接到 LAN 的 interface
<devices>
    <interface type='ethernet'>
      <target dev='vnet7'/>
      <script path='/etc/qemu-ifup-mynet'/>
    </interface>
  </devices>
(4)type=‘direct’ 定義一個直接連到物理網卡(Direct attachment to physical interface)的 interface:需要 Linux macvtap 驅動支持
    <interface type='direct' trustGuestRxFilters='no'>
      <source dev='eth0' mode='vepa'/>
    </interface>
(5)type=‘hostdev’ 定義一個由主機PCI 網卡直接分配(PCI Passthrough)的 interface: 分配主機上的網卡給虛機

複製代碼

<devices>
    <interface type='hostdev' managed='yes'>
      <driver name='vfio'/>
      <source>
        <address type='pci' domain='0x0000' bus='0x00' slot='0x07' function='0x0'/>
      </source>
      <mac address='52:54:00:6d:90:02'/>
      <virtualport type='802.1Qbh'>
        <parameters profileid='finance'/>
      </virtualport>
    </interface>
  </devices>

複製代碼


network (網絡)
<bridge name="virbr0" stp="on" delay="5" macTableManager="libvirt"/>
<domain name="example.com" localOnly="no"/>
<forward mode="nat" dev="eth0"/>

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

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

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

 (1) mode=‘nat’:所有連接到該虛擬網絡的虛擬的網絡都會經過物理機器的網卡,並轉換成物理網卡的地址。

複製代碼

<network>
        <name>default</name>
        <bridge name="virbr0" />
        <forward mode="nat"/>
        <ip address="192.168.122.1" netmask="255.255.255.0">
          <dhcp>
            <range start="192.168.122.2" end="192.168.122.254" />
          </dhcp>
        </ip>
        <ip family="ipv6" address="2001:db8:ca2:2::1" prefix="64" />
      </network>

複製代碼

也可以指定公共的IP地址和端口號。

<forward mode='nat'><nat><address start='1.2.3.4' end='1.2.3.10'/> </nat> </forward>
<forward mode='nat'><nat><port start='500' end='1000'/></nat></forward>
(2) mode=‘route’:類似於 NAT,但是不使用NAT,而是使用routing table。  

複製代碼

      <network>
        <name>local</name>
        <bridge name="virbr1" />
        <forward mode="route" dev="eth1"/>
        <ip address="192.168.122.1" netmask="255.255.255.0">
          <dhcp>
            <range start="192.168.122.2" end="192.168.122.254" />
          </dhcp>
        </ip>
        <ip family="ipv6" address="2001:db8:ca2:2::1" prefix="64" />
      </network>

複製代碼

(3) mode=‘bridge’:使用不受libvirt管理的bridge,比如主機上已有的bridge;open vswitch bridge;使用 macvtap's "bridge"  模式
      <network>
        <name>host-bridge</name>
        <forward mode="bridge"/>
        <bridge name="br0"/>
      </network>
(4) mode=‘passthrough’:使用 a macvtap "direct" connection in "passthrough" mode 指定主機上的特定網卡用於虛擬網絡   

複製代碼

 <forward mode='passthrough'>
    <interface dev='eth10'/>
    <interface dev='eth11'/>
    <interface dev='eth12'/>
    <interface dev='eth13'/>
    <interface dev='eth14'/>
  </forward>

複製代碼

(5) mode=‘hostdev’:直接分配主機上的網絡設備。
<forward mode='hostdev' managed='yes'>
    <driver name='vfio'/>
    <address type='pci' domain='0' bus='4' slot='0' function='1'/>
    <address type='pci' domain='0' bus='4' slot='0' function='2'/>
    <address type='pci' domain='0' bus='4' slot='0' function='3'/>
  </forward>


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

 

1.1.2 對象的管理模型

對象名稱對象Python 類描述
Connect與 Hypervisor的連接

virConnectPtr

在調用任何 API 去管理一個本地或者遠端的Hypervisor前,必須建立和這個Hypervisor的連接。
DomainGuest 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 可以是  dirfsnetfsdiskiscsilogicalscsi,mpathrbdsheepdoggluster 或者 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 就是對各種對象的各種操作,包括基本的增、刪、改、查操作和其它操作。

對象其它
ConnectvirConnectOpen
virConnectOpenAuth
virConnectOpenReadOnly
virConnectClosevirConnectSetKeepAlive

Strorage poolvirStoragePoolBuild
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 volumevirStorageVolCreateXML
virStorageVolCreateXMLFrom
virStorageVolDelete
virStorageVolFree
virStorageVolResize
virStorageVolUpload
virStorageVolWipe
virStorageVolWipePattern
virStorageVolGetConnect/Info/Key/Name/Path/XMLDesc
 virStorageVolLookupByKey/Name/Path
virStorageVolRef
virStorageVolDownload
NetworkvirNetworkCreate
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 snapshotvirDomainSnapshotCreateXMLvirDomainSnapshotDelete
virDomainSnapshotFree
virDomainRevertToSnapshotvirDomainHasCurrentSnapshot
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



InterfacevirInterfaceCreate
virInterfaceDefineXML

virInterfaceDestroy
virInterfaceFree
virInterfaceUndefine
virInterfaceChangeBegin
virInterfaceChangeCommit
virInterfaceChangeRollback

virConnectListAllInterfaces
virConnectListDefinedInterfaces
virConnectListInterfaces
virConnectNumOfDefinedInterfaces
virConnectNumOfInterfaces
virInterfaceGetConnect
virInterfaceGetMACString
virInterfaceGetName
virInterfaceGetXMLDesc
virInterfaceIsActive
virInterfaceLookupByMACString
virInterfaceLookupByName
virInterfaceRef


Net FiltervirNWFilterDefineXML

virNWFilterFree
virNWFilterUndefine
virConnectListAllNWFilters
virConnectListNWFilters
virConnectNumOfNWFilters
virNWFilterGetName
virNWFilterGetUUID
virNWFilterGetUUIDString
virNWFilterGetXMLDesc
virNWFilterLookupByName
virNWFilterLookupByUUID
virNWFilterLookupByUUIDString
virNWFilterRef


Domain EventvirConnectDomainEventDeregister
virConnectDomainEventDeregisterAny
virConnectDomainEventDeviceAddedCallback
virConnectDomainEventDeviceRemovedCallback
virConnectDomainEventAgentLifecycleCallback
virConnectDomainEventBalloonChangeCallback
virConnectDomainEventBlockJobCallback
virConnectDomainEventCallback
virConnectDomainEventDiskChangeCallback
virConnectDomainEventGenericCallback
virConnectDomainEventGraphicsCallback
virConnectDomainEventIOErrorCallback
virConnectDomainEventIOErrorReasonCallback
virConnectDomainEventPMSuspendCallback
virConnectDomainEventPMSuspendDiskCallback




DomainvirDomainCreate
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

SecretvirSecretDefineXMLvirSecretFree
virSecretUndefine
virSecretSetValuevirConnectListAllSecrets
virConnectListSecrets
virConnectNumOfSecrets
virSecretGetConnect/UUID/UUIDString/UsageID/UsageType/Value/XMLDesc
virSecretLookupByUUID/UUIDString/Usage
virSecretRef


StreamvirStreamNewvirStreamFreevirStreamFinish

virStreamAbort

virStreamRecv

virStreamRecvAll

virStreamSend

virStreamSendAll

virStreamSinkFunc
virStreamSourceFunc


1.3 Libvirt API 的實現

libvirt API 的實現是在各個 Hypervisor driver 和 Storage dirver 內。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 之間幾乎是一對一的映射關係,比如:

複製代碼

 virDomainSetMaxMemory (virDomainPtr domain, unsigned  memory);

#Python API

複製代碼

 因此,libvirt 官網並沒有提供詳細的 python API 描述。

二、QEMU/KVM libvirt 驅動

2.1 架構

3.jpg

•Libvirtd 是一個 daemon 進程,可以被本地的virsh調用,也可以被遠程的virsh調用

•Libvirtd 調用 qemu-kvm 操作KVM 虛擬機

 

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

virsh commandPublic APIQEMU driver functionMonitor command
virsh create XMLFILEvirDomainCreateXML()qemudDomainCreate()info cpus, cont, change vnc password, balloon (all indirectly)
virsh suspend GUESTvirDomainSuspend()qemudDomainSuspend()stop
virsh resume GUESTvirDomainResume()qemudDomainResume()cont
virsh shutdown GUESTvirDomainShutdown()qemudDomainShutdown()system_powerdown
virsh setmem GUEST MEM-KBvirDomainSetMemory()qemudDomainSetMemory()balloon (indirectly)
virsh dominfo GUESTvirDomainGetInfo()qemudDomainGetInfo()info balloon (indirectly)
virsh save GUEST FILENAMEvirDomainSave()qemudDomainSave()stop, migrate exec
virsh restore FILENAMEvirDomainRestore()qemudDomainRestore()cont
virsh dumpxml GUESTvirDomainDumpXML()qemudDomainDumpXML()info balloon (indirectly)
virsh attach-device GUEST XMLFILEvirDomainAttachDevice()qemudDomainAttachDevice()change, eject, usb_add, pci_add (all indirectly)
virsh detach-device GUEST XMLFILEvirDomainDetachDevice()qemudDomainDetachDevice()pci_del (indirectly)
virsh migrate GUEST DEST-URIvirDomainMigrate()qemudDomainMigratePerform()stop, migrate_set_speed, migrate, cont
virsh domblkstat GUESTvirDomainBlockStats()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步驟。 

 

轉自:http://www.cnblogs.com/sammyliu/p/4558638.html


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章