日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) >

【KVM系列05】Libvirt 介绍

發(fā)布時(shí)間:2025/3/20 49 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【KVM系列05】Libvirt 介绍 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.


? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?第五章 Libvirt 介紹


1. Libvirt 是什么

1.1 Libvirt C API

1.2 Libvirt XML 定義

1.3 Libvirt API 的實(shí)現(xiàn)

1.4 Libvirt 的 Python 綁定

2. QEMU/KVM libvirt 驅(qū)動(dòng)

2.1 架構(gòu)

2.2 安裝

2.3 libvirt log

3 使用 libvirt 編程來管理 KVM 虛機(jī)的實(shí)例


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

?

1. Libvirt 是什么

為什么需要Libvirt?

  • Hypervisor 比如 qemu-kvm 的命令行虛擬機(jī)管理工具參數(shù)眾多,難于使用。
  • Hypervisor 種類眾多,沒有統(tǒng)一的編程接口來管理它們,這對(duì)云環(huán)境來說非常重要。
  • 沒有統(tǒng)一的方式來方便地定義虛擬機(jī)相關(guān)的各種可管理對(duì)象。
  • Libvirt提供了什么?

  • 它提供統(tǒng)一、穩(wěn)定、開放的源代碼的應(yīng)用程序接口(API)、守護(hù)進(jìn)程 (libvirtd)和和一個(gè)默認(rèn)命令行管理工具(virsh)。
  • 它提供了對(duì)虛擬化客戶機(jī)和它的虛擬化設(shè)備、網(wǎng)絡(luò)和存儲(chǔ)的管理。
  • 它提供了一套較為穩(wěn)定的C語(yǔ)言應(yīng)用程序接口。目前,在其他一些流行的編程語(yǔ)言中也提供了對(duì)libvirt的綁定,在Python、Perl、Java、Ruby、PHP、OCaml等高級(jí)編程語(yǔ)言中已經(jīng)有l(wèi)ibvirt的程序庫(kù)可以直接使用。
  • 它對(duì)多種不同的 Hypervisor 的支持是通過一種基于驅(qū)動(dòng)程序的架構(gòu)來實(shí)現(xiàn)的。libvirt 對(duì)不同的 Hypervisor 提供了不同的驅(qū)動(dòng),包括 Xen 的驅(qū)動(dòng),對(duì)QEMU/KVM 有 QEMU 驅(qū)動(dòng),VMware 驅(qū)動(dòng)等。在 libvirt 源代碼中,可以很容易找到 qemu_driver.c、xen_driver.c、xenapi_driver.c、vmware_driver.c、vbox_driver.c 這樣的驅(qū)動(dòng)程序源代碼文件。
  • 它作為中間適配層,讓底層 Hypervisor 對(duì)上層用戶空間的管理工具是可以做到完全透明的,因?yàn)?libvirt 屏蔽了底層各種 Hypervisor 的細(xì)節(jié),為上層管理工具提供了一個(gè)統(tǒng)一的、較穩(wěn)定的接口(API)。
  • 它使用 XML 來定義各種虛擬機(jī)相關(guān)的受管理對(duì)象。
  • ?? ? 目前,libvirt 已經(jīng)成為使用最為廣泛的對(duì)各種虛擬機(jī)進(jìn)行管理的工具和應(yīng)用程序接口(API),而且一些常用的虛擬機(jī)管理工具(如virsh、virt-install、virt-manager等)和云計(jì)算框架平臺(tái)(如OpenStack、OpenNebula、Eucalyptus等)都在底層使用libvirt的應(yīng)用程序接口。

    ? ? ? ? ? ? ? ? ? ? ? ? ???(SLE 11)

    1.1 Libvirt C API

    1.1.1 Libvirti API 所管理的主要對(duì)象

    對(duì)象解釋
    Domain (域)指運(yùn)行在由Hypervisor提供的虛擬機(jī)器上的一個(gè)操作系統(tǒng)實(shí)例(常常是指一個(gè)虛擬機(jī))或者用來啟動(dòng)虛機(jī)的配置。
    Hypervisor一個(gè)虛擬化主機(jī)的軟件層
    Node (主機(jī))一臺(tái)物理服務(wù)器。
    Storage pool (存儲(chǔ)池)一組存儲(chǔ)媒介的集合,比如物理硬盤驅(qū)動(dòng)器。一個(gè)存儲(chǔ)池被劃分為小的容器稱作卷。卷會(huì)被分給一個(gè)或者多個(gè)虛機(jī)。
    Volume (卷)一個(gè)從存儲(chǔ)池分配的存儲(chǔ)空間。一個(gè)卷會(huì)被分給一個(gè)或者多個(gè)域,常常成為域里的虛擬硬盤。

    1.1.2 對(duì)象的管理模型

    對(duì)象名稱對(duì)象Python 類描述
    Connect與 Hypervisor的連接

    virConnectPtr

    在調(diào)用任何 API 去管理一個(gè)本地或者遠(yuǎn)端的Hypervisor前,必須建立和這個(gè)Hypervisor的連接。
    DomainGuest domain

    virDomainPtr

    用于列舉和管理已有的虛機(jī),或者創(chuàng)建新的虛機(jī)。唯一標(biāo)識(shí):ID,Name,UUID。一個(gè)域可能是暫時(shí)性的或者持久性的。暫時(shí)性的域只能在它運(yùn)行期間被管理。持久性的域在主機(jī)上保存了它的配置。
    Virtual Network虛擬網(wǎng)絡(luò)

    virNetworkPtr

    用于管理虛機(jī)的網(wǎng)絡(luò)設(shè)備。唯一標(biāo)識(shí):Name,UUID。一個(gè)虛擬網(wǎng)絡(luò)可能是暫時(shí)性的或者持久性的。每個(gè)主機(jī)上安裝libvirt后,它都有一個(gè)默認(rèn)的網(wǎng)絡(luò)設(shè)備“default”。它向該主機(jī)上運(yùn)行的虛機(jī)提供DHCP服務(wù),以及通過NAT連接到主機(jī)上。
    Storage Pool存儲(chǔ)池

    virStoragePoolPtr

    用于管理虛擬機(jī)內(nèi)的所有存儲(chǔ),包括 local disk, logical volume group, iSCSI target, FibreChannel HBA and local/network file system。唯一標(biāo)識(shí):Name,UUID。一個(gè)存儲(chǔ)池可能是暫時(shí)性的或者持久性的。Pool 的 type 可以是??dir,?fs,?netfs,?disk,?iscsi,?logical,?scsi,mpath,?rbd,?sheepdog,?gluster 或者?zfs。
    Storage Volume??存儲(chǔ)卷

    virStorageVolPtr

    用于管理一個(gè)存儲(chǔ)池內(nèi)的存儲(chǔ)塊,包括一個(gè)池內(nèi)分配的塊、磁盤分區(qū)、邏輯卷、SCSI/iSCSI Lun,或者一個(gè)本地或者網(wǎng)絡(luò)文件系統(tǒng)內(nèi)的文件等。唯一標(biāo)識(shí):Name,Key,Path。
    Host device?主機(jī)設(shè)備

    virNodeDevPtr

    用于管理主機(jī)上的物理硬件設(shè)備,包括?the physical USB or PCI devices and logical devices these provide, such as a NIC, disk, disk

    controller, sound card, etc。唯一標(biāo)識(shí):Name。

    1.1.3 API 的簡(jiǎn)單分類

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

    對(duì)象其它
    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 FiltervirNWFilterDefineXMLvirNWFilterFree
    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.2 Libvirt XML 定義

    Libvirt 使用 XML 來定義各種對(duì)象,其中,與 OpenStack Nova 關(guān)系比較密切的有:

    disk (磁盤)任何磁盤設(shè)備,包括軟盤(floppy)、硬盤(hard disk)、光驅(qū)(cdrom)或者半虛擬化驅(qū)動(dòng)都使用 元素來定義。 方式: 。其中:
    • ”type“ 用來指定device source 的類型:"file", "block", "dir", "network", 或者 "volume"。具體的 source ?由 標(biāo)簽定義。
    • ”device“ 用來指定 device target 的類型:"floppy", "disk", "cdrom", and "lun", 默認(rèn)為 "disk" 。具體的 target 由 標(biāo)簽定義。

    (1)”volume“ 類型的 disk ?
  • 'volume' device='disk'>

  • 'qemu' type='raw'/>

  • 'blk-pool0' volume='blk-pool0-vol0'/>

  • 'hdk' bus='ide'/>

  • (2)”file“ 類型的 disk ?
  • 'file' snapshot='external'>

  • "tap" type="aio" cache="default"/>

  • '/var/lib/xen/images/fv0' startupPolicy='optional' />

  • 'hda' bus='ide'/>

  • (3)”block“ 類型的 disk ?
  • 'block' device='cdrom'>

  • 'qemu' type='raw'/>

  • 'hdd' bus='ide' tray='open'/>

  • <readonly/>

  • (4)”network“ 類型的 disk

    ?

    ?
  • 'network' device='cdrom'>

  • 'qemu' type='raw'/>

  • "http" name="url_path">

  • "hostname" port="80"/>

  • ?
  • 'hde' bus='ide' tray='open'/>

  • <readonly/>

  • ?

  • ?

    ?
    Host device assignment (主機(jī)設(shè)備分配)

    ?

    ?
  • 'subsystem' type='usb'> #USB 設(shè)備直接分配 'optional'>

  • '0x1234'/>

  • '0xbeef'/>

  • ?
  • '2'/>

  • ?
  • 'subsystem' type='pci' managed='yes'> #PCI 設(shè)備直接分配

  • ?
  • ?
  • '0x0000' bus='0x06' slot='0x02' function='0x0'/>

  • ?
  • '1'/>

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

  • ?
  • ?
  • ?

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

    ?

    ?
  • <interface?type='network'>

  • 'default'/> #虛擬網(wǎng)絡(luò)的名稱為 ‘default’?<!--interface> ... <interface type='network'>

  • 'default' portgroup='engineering'/>

  • 'vnet7'/>

  • "00:11:22:33:44:55"/>

  • ?
  • '09b11c53-8b5c-4eeb-8f00-d84eaa0aaa4f'/>

  • ?
  • ?
  • <!--interface>

  • ?
  • ?

    #virsh:attach-interface --domain d-2 --type network --source isolatednet1 --mac 52:53:00:4b:75:6f --config (2)type=‘birdge’ 定義一個(gè) Bridge to LAN(橋接到物理網(wǎng)絡(luò))的interface:前提是主機(jī)上存在一個(gè) bridge,該 bridge 已經(jīng)連到物理LAN。

    ?

    ?
  • <interface?type='bridge'>?#連接到 br0 'br0'/>

  • <!--interface>

  • <interface type='bridge'> #連接到br1 'br1'/>

  • 'vnet7'/>

  • "00:11:22:33:44:55"/>

  • <!--interface>

  • <interface type='bridge'> #連接到 Open vSwithc bridge ovsbr 'ovsbr'/>

  • 'openvswitch'>

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

  • ?
  • <!--interface>

  • ?

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

  • 'vnet7'/>

  • '/etc/qemu-ifup-mynet'/>

  • </interface>

  • (4)type=‘direct’ 定義一個(gè)直接連到物理網(wǎng)卡(Direct attachment to physical interface)的 interface:需要 Linux macvtap 驅(qū)動(dòng)支持 ?
  • <interface?type='direct'?trustGuestRxFilters='no'>

  • <source?dev='eth0'?mode='vepa'/>

  • </interface>

  • (5)type=‘hostdev’ 定義一個(gè)由主機(jī)PCI 網(wǎng)卡直接分配(PCI Passthrough)的 interface: 分配主機(jī)上的網(wǎng)卡給虛機(jī)

    ?

    ?
  • <interface?type='hostdev'?managed='yes'>

  • <driver?name='vfio'/>

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

  • ?
  • <mac?address='52:54:00:6d:90:02'/>

  • <virtualport?type='802.1Qbh'>

  • <parameters?profileid='finance'/>

  • ?
  • </interface>

  • ?

    ?
    network (網(wǎng)絡(luò))

    1. bridge:定義一個(gè)用于構(gòu)造該虛擬網(wǎng)絡(luò)的網(wǎng)橋。?

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

    3. forward: 定義虛擬網(wǎng)絡(luò)直接連到物理 LAN 的方式. ”mode“指轉(zhuǎn)發(fā)模式。

    ?(1) mode=‘nat’:所有連接到該虛擬網(wǎng)絡(luò)的虛擬的網(wǎng)絡(luò)都會(huì)經(jīng)過物理機(jī)器的網(wǎng)卡,并轉(zhuǎn)換成物理網(wǎng)卡的地址。

    ?

    ?
  • default

  • <bridge?name="virbr0"?/>

  • <forward?mode="nat"/>

  • <ip?address="192.168.122.1"?netmask="255.255.255.0">

  • ?
  • <range?start="192.168.122.2"?end="192.168.122.254"?/>

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

  • ?

    也可以指定公共的IP地址和端口號(hào)。

    ?
  • <forward?mode='nat'><address?start='1.2.3.4'?end='1.2.3.10'/>

  • <forward?mode='nat'><port?start='500'?end='1000'/>

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

    ?

    ?
  • ?
  • local

  • <bridge?name="virbr1"?/>

  • <forward?mode="route"?dev="eth1"/>

  • <ip?address="192.168.122.1"?netmask="255.255.255.0">

  • ?
  • <range?start="192.168.122.2"?end="192.168.122.254"?/>

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

  • ?

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

  • <forward?mode="bridge"/>

  • <bridge?name="br0"/>

  • (4) mode=‘passthrough’:使用?a macvtap "direct" connection in "passthrough" mode 指定主機(jī)上的特定網(wǎng)卡用于虛擬網(wǎng)絡(luò)???

    ?

    ?
  • <forward?mode='passthrough'>

  • <interface?dev='eth10'/>

  • <interface?dev='eth11'/>

  • <interface?dev='eth12'/>

  • <interface?dev='eth13'/>

  • <interface?dev='eth14'/>

  • ?

    (5) mode=‘hostdev’:直接分配主機(jī)上的網(wǎng)絡(luò)設(shè)備。 ?
  • <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'/>

  • ?

    詳細(xì)的 XML 定義說明在?https://libvirt.org/format.html。

    1.3 Libvirt API 的實(shí)現(xiàn)

    libvirt API 的實(shí)現(xiàn)是在各個(gè) Hypervisor driver 和 Storage dirver 內(nèi)。Hypervisor 驅(qū)動(dòng)包括:

    • 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 語(yǔ)言綁定。安裝 libvirt 時(shí),默認(rèn)會(huì)安裝 python-libvirt 。?來源:?https://libvirt.org/python.html??https://pypi.python.org/pypi/libvirt-python?

    Python API 和 C API 之間幾乎是一對(duì)一的映射關(guān)系,比如:?

    #C API int virConnectNumOfDomains (virConnectPtr conn); int virDomainSetMaxMemory (virDomainPtr domain, unsigned long memory);#Python API virConnect::numOfDomains(self) virDomain::setMaxMemory(self, memory)

    ?因此,libvirt 官網(wǎng)并沒有提供詳細(xì)的 python API 描述。

    2. QEMU/KVM libvirt 驅(qū)動(dòng)

    2.1 架構(gòu)

    ?Libvirtd 是一個(gè) daemon 進(jìn)程,可以被本地的virsh調(diào)用,也可以被遠(yuǎn)程的virsh調(diào)用

    ?Libvirtd 調(diào)用 qemu-kvm 操作KVM 虛擬機(jī)

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

    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 的發(fā)行版中直接安裝,比如 Ubuntu 上運(yùn)行 apt-get install libvirt-bin

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

    2.3 libvirt log

    這篇文章?描述了 livbirt log。設(shè)置所有日志的方法是在 /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 虛機(jī)的實(shí)例

    ?這里只描述基本的過程。具體的過程,下一篇文章會(huì)具體分析 Nova 中 libvirt 的使用。

  • 定義虛機(jī)的基本配置,包括 vCPU、內(nèi)存、磁盤或者cdrom以及啟動(dòng)順序,生成 xml 配置,調(diào)用?virDomainCreateXML API 啟動(dòng)一個(gè)虛機(jī)
  • 使用 Domain 相關(guān)的 API 來管理虛機(jī)的生命周期。我的這篇文章有虛機(jī)生命周期的詳細(xì)介紹。
  • 添加磁盤:定義一個(gè) disk 的 xml 配置,使用?virDomainAttachDevice API 將它掛載到虛機(jī)上。如果不是本地的源磁盤,需要提前準(zhǔn)備好。
  • 添加interface:使用 Network API 定義一個(gè)虛擬網(wǎng)絡(luò)(需要提前準(zhǔn)備好物理網(wǎng)絡(luò)),然后定義一個(gè) interface 的 XML 配置,使用?virDomainAttachDevice API 將它加到虛機(jī)。
  • 按照需要,重復(fù)2、3、4步驟。?
  • 總結(jié)

    以上是生活随笔為你收集整理的【KVM系列05】Libvirt 介绍的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。