KVM 介绍(5):libvirt 介绍

学习 KVM 的系列文章:

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的应用程序接口。

                           (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 可以是  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 就是对各种对象的各种操作,包括基本的增、删、改、查操作和其它操作。

对象 其它
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)或者半虚拟化驱动都使用 <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.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 之间几乎是一对一的映射关系,比如:

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

#Python APIvirConnect::numOfDomains(self)virDomain::setMaxMemory(self, memory)

因此,libvirt 官网并没有提供详细的 python API 描述。

2. QEMU/KVM libvirt 驱动

2.1 架构

•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 的代码,然后编译和安装

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步骤。
时间: 2024-10-22 08:42:46

KVM 介绍(5):libvirt 介绍的相关文章

自我介绍(说是介绍更希望是对自己的一种鼓励吧)

如今,一个即将升入大四的我,老实说,感觉还没有找到学长的感觉呢,怎么就要试着说再见了呢?··· 我,就读于天津财经大学珠江学院,嵌入式软件方向,学渣一枚,但也在一直追寻着自己的方向,上了大学,有更多的时间去玩乐与思考,确立了自己的人生格言"人生就是一首断章",因为卞之琳在<断章>里写到'你站在桥上看风景,看风景的人在楼上看你,明月装饰了你的窗子,你装饰了别人的梦',确实,人生就是这样彼此羡慕着,所以不必太累··· 这也是我博客名和许多网站注册名字的由来. 说一下我们学校,一

day18(JDBC事务&连接池介绍&DBUtils工具介绍&BaseServlet作用)

day18总结 今日思维导图: 今日内容 事务 连接池 ThreadLocal BaseServlet自定义Servlet父类(只要求会用,不要求会写) DBUtils à commons-dbutils ? 事务 ? 事务的四大特性:ACID: mysql中操作事务 jdbc中操作事务 ? ? ? 事务概述 为了方便演示事务,我们需要创建一个account表: CREATE TABLE account( ????id INT PRIMARY KEY AUTO_INCREMENT, ????NA

LAMP架构介绍、MySQL_MariaDB介绍和MySQL安装

1.LAMP架构介绍 Linux+Apache(httpd)+MySQL+PHP PHP网站(Google.淘宝.百度.51cto播客.猿课论坛) 三个角色可以在一台机器.也可以分开 2.MySQL_MariaDB介绍     MySQL/Mariadb介绍 3.MySQL安装

18.1集群介绍18.2keepalived介绍18.3-5用keepalived配置高可用集群

18.1集群介绍18.2 keepalived介绍18.3 18.4 18.5 用keepalived配置高可用集群这里是用ngixn作为高可用的演示对象,因为有生产中很多企业用nginx作为负载均衡器使用编辑130上keepalived配置文件,内容从https://coding.net/u/aminglinux/p/aminglinux-book/git/blob/master/D21Z/master_keepalived.conf获取首先清空原来的配置文件内容再增加内容global_def

集群介绍,keepalived介绍,keepalived配置高可用集群

Linux集群概述 根据功能划分为两大类:高可用和负载均衡 高可用集群通常为两台服务器,一台工作,另外一台作为冗余,当提供服务的机器宕机,冗余将接替继续提供服务 实现高可用的开源软件有:heartbeat.keepalived (推荐) 负载均衡集群,需要有一台服务器作为分发器,它负责把用户的请求分发给后端的服务器处理,在这个集群里,除了分发器外,就是给用户提供服务的服务器了,这些服务器数量至少为2 实现负载均衡的开源软件有LVS.keepalived.haproxy.nginx,商业的有F5.

前端学习之路-CSS介绍,Html介绍,JavaScript介绍

CSS介绍 学前端必备掌握CSS样式,css为层叠样式表,用来定义页面的显示效果,加强用户的体验乐趣,那么如何用css到html中呢? style属性方式 利用标签中的style属性来改变显示样式 <p style="background-color: #FFF000"> p标签 </p> 在head中加入style标签 <head> <style type="text/css"> p { color: #FFF000

2.5星|《区块链超入门》:偏技术的介绍,没介绍过去两年间币圈的各种或狗血或精彩的故事与事故

区块链超入门 偏技术的介绍,重点介绍比特币.以太坊.EOS.作者认为这是区块链的三代技术.三代区块链的重要卖点都是去中心化.作者认为目前还没有好的区块链应用出现,但是比较看好区块链的未来. 有些图表是直接基于文字的,画的不好,文字可以说清楚的内容,画成图后,几个元素间的关系反而让读者困惑.行文风格有点啰嗦重复. 一个严重的缺陷:几乎没介绍过去两年间币圈的各种或狗血或精彩的故事与事故,比如ICO.空气币.矿机.矿工等领域.感觉是作者有意的,说了这些故事容易让读者对区块链的未来产生怀疑. 最近读到的

kvm/qemu/libvirt学习笔记 (1) qemu/kvm/libvirt介绍及虚拟化环境的安装

kvm简介 kvm最初由Quramnet公司开发,2008年被RedHat公司收购.kvm全称基于内核的虚拟机(Kernel-based Virtual Machine),它是Linux的一个内核模块.包括核心虚拟化模块kvm.ko,以及特定CPU的模块kvm-inet.ko或kvm-amd.ko,其实现需要宿主机的CPU支持硬件虚拟化.从Linux内核版本2.6.20开始,kvm模块就已经包含在Linux内核中了.在X86平台下CPU的硬件虚拟化技术有Inetl的VT-X和AMD的AMD-V.

KVM虚拟化技术之virt-manager使用及KVM虚拟化平台网络模型介绍

接上篇博文继续 一.使用virt-manager创建和管理虚拟机 1.使用VNC Viewer连接进入虚拟化平台主机 2.打开终端输入virt-manager命令启动virt-manager虚拟机管理界面 #virt-manager 3.通过virt-manager安装CentOS 6.6的虚拟机 点击如图所示图标新建虚拟机: 选择PXE引导,我的网络内存在一个系统自动化部署服务器: 选择操作系统类型和版本: 设置内存和CPU个数: 设置硬盘大小,这里采用动态扩展磁盘空间方式: 忽略这个错误,由