虚拟化技术 — Libvirt 异构虚拟化管理组件

这篇具有很好参考价值的文章主要介绍了虚拟化技术 — Libvirt 异构虚拟化管理组件。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

Libvirt

Libvirt 是目前使用最为广泛的异构虚拟化管理工具,由 libvirt API 函数库、libvirtd Daemon 这 2 个关键部分组成,还具有一个默认命令行管理工具 virsh。

  • https://libvirt.org/

虚拟化技术 — Libvirt 异构虚拟化管理组件

libvirt API 函数库

Libvirt 采用了面向驱动的架构设计,北向提供了统一的虚拟化资源管理 API,南向通过不同的驱动程序来对接异构的底层虚拟化技术。同时,libvirt API 为多种高级编程语言都提供了编程接口,包括 C、Python、Java、Perl、Ruby 等,具有非常强的可扩展性。

除了官方提供的多种管理工具之外(包括:virsh CLI、virt-manager、virt-viewer、vist-install ),OpenStack 也通过 libvirt API 提供的跨虚拟化平台能力,可以同时支持 QEMU-KVM、VMware、Xen 等多种虚拟化实现。

虚拟化技术 — Libvirt 异构虚拟化管理组件

libvirtd Daemon

虚拟化技术 — Libvirt 异构虚拟化管理组件

libvirtd Daemon 是一个 Multi-Drivers 软件架构,围绕虚拟机这一核心对象提供了计算、存储、网络、安全、监控等虚拟化资源的管理功能。

  • 虚拟机管理:用于创建、删除、修改、暂停、恢复、迁移和监视 VM。
  • 虚拟网络管理:用于创建、删除和修改虚拟网络,包括 Bridge/OvS、NAT、VLAN 网络。
  • 存储管理:用于管理 VM 的 QCOW2 镜像和虚拟磁盘,包括创建、删除、修改和查看存储卷。
  • 集群管理:用于管理多台运行了 libvirtd Daemon 的 Host Cluster 上的 VM,可以通过远程连接的方式进行管理。
  • 安全策略:用于控制对 Host 和 VM 的访问权限,防止未经授权的访问。
  • 监控和统计:用于获取 Host 和 VM 的状态信息和统计数据,包括 CPU 使用率、内存使用率、网络流量、磁盘 I/O 等。

软件架构

libvirtd 的软件架构包括了以下核心组件:

  1. 监听器(Listener):监听客户端连接请求。默认情况下,libvirtd 使用 TCP/IP 协议,并在本地主机上监听 16509 端口。
  2. 驱动程序(Driver):libvirtd 使用驱动程序来与不同的虚拟化技术交互。
  3. 数据库(DB):存储虚拟机相关的信息。默认情况下,libvirtd 使用 SQLite,也支持其他数据库,如:MySQL、PostgreSQL。

权限模式

为了保障 HostOS 的安全性,libvirtd 可以在 2 种权限模式下运行:

  1. 系统模式:libvirtd 以 Root 权限运行,可以使用 libvirtd 的完整功能,虚拟出物理主机的各种设备。
  2. 会话模式:libvirtd 以 Non-root 权限运行,以普通系统用户的身份运行。

运行模式

为了支持集群管理和虚拟机迁移功能,libvirtd 具有 2 种运行模式:

  1. 本地控制管理:Application 和 libvirtd 在同一个 Host 上。
  2. 远程控制管理:Application 和 libvirtd 不再同一个 Host 上。Local libvirtd 和 Remote libvirtd 之间可以使用 TCP over SSH 协议进行安全通信。

虚拟化技术 — Libvirt 异构虚拟化管理组件

virsh CLI

yum install -y virt-install

virsh list               # 查看在运行的虚拟机。
virsh list --all         # 查看所有虚拟机。
virsh console centos72   # 连接虚拟机的 Console。
virsh start centos72     # 启动虚拟机。
virsh reboot centos72    # 重新启动虚拟机。
virsh shutdown centos72  # 优雅关闭虚拟机。
virsh destroy centos72   # 强制关闭虚拟机。
virsh suspend centos72   # 暂停(挂起)虚拟机。
virsh resume centos72    # 恢复被挂起的虚拟机。
virsh undefine centos72  # 删除虚拟机的 XML 配置文件,但不删除虚拟机的磁盘文件。
virsh autostart centos72 # 设置虚拟机随物理机一同启动。
virsh autostart --disable centos72 # 取消虚拟机的开机自启动。
virsh dumpxml centos72   # 查看虚拟机的配置文件。
virsh edit centos72      # 编辑虚拟机的配置文件。
virsh setvcpus           # 动态配置虚拟机的 CPU。
virsh setmaxmem          # 动态配置虚拟机的 Memory。

Domain XML

  • https://libvirt.org/format.html

libvirtd 使用 XML 格式来保存一个 VM 所有的配置信息,下面是一个简单的示例:

<domain type='kvm'>
  <name>myvm</name>
  <memory unit='KiB'>1048576</memory>
  <vcpu placement='static'>2</vcpu>
  <os>
    <type arch='x86_64' machine='pc-i440fx-2.9'>hvm</type>
    <boot dev='hd'/>
  </os>
  <devices>
    <disk type='file' device='disk'>
      <driver name='qemu' type='qcow2'/>
      <source file='/var/lib/libvirt/images/myvm.qcow2'/>
      <target dev='vda' bus='virtio'/>
    </disk>
    <interface type='network'>
      <mac address='52:54:00:9b:08:fa'/>
      <source network='default'/>
      <model type='virtio'/>
    </interface>
  </devices>
</domain>
  • domain 根元素:其中,type=‘kvm’ 表示使用 KVM Hypervisor。
  • name 元素:指定 VM 的名称。
  • memory 元素:指定 VM 的 vMemory 大小,单位为 KiB。
  • vcpu 元素:指定 VM 的 vCPU 个数,其中,placement=‘static’ 表示静态分配方式。
  • os 元素:指定 VM 的操作系统类型和 boot 引导顺序。
  • devices 元素:指定 VM 的设备信息。
    • disk 元素:指定 VM 的 vDisk 信息,包括:类型、文件路径、磁盘编号、驱动程序等信息。
    • interface 元素:指定 VM 的 vNIC 信息,包括:虚拟网络、MAC 地址、驱动程序等信息。

disk 标签

虚拟机的磁盘有多种类型,包括:软盘(Floppy)、硬盘(Hard Disk)、光驱(cdrom)等。

标签格式:

<disk type='XXX' device='XXX'>
  • type:指定 Device source 标签的类型,包括:file、block、dir、network、volume。
  • device:指定 Device target 标签的类型,包括:floppy、disk、cdrom、lun,默认为 disk。

示例:

  • 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>
  • file disk
    <disk type='file' device='disk' snapshot='external'>
      <driver name="tap" type="aio" cache="default"/>
      <source file='/var/lib/xen/images/fv0' startupPolicy='optional' />
      <target dev='hda' bus='ide'/>
    </disk>
  • block cdrom
   <disk type='block' device='cdrom'>
      <driver name='qemu' type='raw'/>
      <target dev='hdd' bus='ide' tray='open'/>
      <readonly/>
    </disk>
  • network cdrom
   <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> 

network 元素

可以给 Libvirt 创建多种不同的 Networks,包括:Bridge、NAT、Route、Passthrough、hostdev 等等。

  1. Bridge 模式:支持 Linux Bridge、OvS Bridge、MACVTAP Bridge 等 Bridge 技术。
      <network>
        <name>host-bridge</name>
        <forward mode="bridge"/>
        <bridge name="br0"/>
      </network>
  1. NAT 模式:将虚拟机 IP 转换为 Host IP。
	<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>
  1. Route 模式:使用 Host 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>
  1. Passthrough 模式:直通 Host 设备到虚拟机。
<forward mode='passthrough'>
    <interface dev='eth10'/>
    <interface dev='eth11'/>
    <interface dev='eth12'/>
    <interface dev='eth13'/>
    <interface dev='eth14'/>
  </forward>
  1. hostdev 模式:直接使用 Host 的设备。
<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>

interface 元素

支持多种不同类型的虚拟机网卡接口,包括:Network、Bridge、Direct、hostdev 等等。

  1. Network Interface:定义一个连接到 Network 中的接口。
<devices>
    <interface type='network'>
      <source network='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>
  1. Bridge Interface:定义一个连接到 Bridge 中的接口。
  <interface type='bridge'>
      <source bridge='br0'/>
    </interface>
    <interface type='bridge'>
      <source bridge='br1'/>
      <target dev='vnet7'/>
      <mac address="00:11:22:33:44:55"/>
    </interface>
    <interface type='bridge'>
      <source bridge='ovsbr'/>
      <virtualport type='openvswitch'>
        <parameters profileid='menial' interfaceid='09b11c53-8b5c-4eeb-8f00-d84eaa0aaa4f'/>
      </virtualport>
    </interface>
  1. Direct Interface :定义一个直接连到物理网卡的接口。
    <interface type='direct' trustGuestRxFilters='no'>
      <source dev='eth0' mode='vepa'/>
    </interface>
  1. hostdev Interface:定义一个直接连到 PCI 物理网卡的接口。
  <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>

Host device assignment 元素

针对不同的 hostdev 可以定义对应的主机设备分配方式。

    # USB 设备直接分配
    <hostdev mode='subsystem' type='usb'>
      <source startupPolicy='optional'>
        <vendor id='0x1234'/>
        <product id='0xbeef'/>
      </source>
      <boot order='2'/>
    </hostdev>

	# PCI 设备直接分配
    <hostdev mode='subsystem' type='pci' managed='yes'>
      <source>
        <address domain='0x0000' bus='0x06' slot='0x02' function='0x0'/>
      </source>
      <boot order='1'/>
      <rom bar='on' file='/etc/fake/boot.bin'/>
    </hostdev>

Libvirt Public API

Management API

Connect

  • virConnectOpen
  • virConnectOpenAuth
  • virConnectOpenReadOnly

  • virConnectGetCPUModelNames
  • virConnectGetCapabilities
  • virConnectGetHostname
  • virConnectGetLibVersion
  • virConnectGetMaxVcpus
  • virConnectGetSysinfo
  • virConnectGetType
  • virConnectGetURI
  • virConnectGetVersion
  • virConnectIsAlive
  • virConnectIsEncrypted
  • virConnectIsSecure

  • virConnectSetKeepAlive
  • virConnectBaselineCPU
  • virConnectCompareCPU

  • virConnectClose

Host

  • virNodeGetCPUMap
  • virNodeGetCPUStats
  • virNodeGetCellsFreeMemory
  • virNodeGetFreeMemory
  • virNodeGetInfo
  • virNodeGetMemoryParameters
  • virNodeGetMemoryStats
  • virNodeGetSecurityModel

  • virInitialize
  • virNodeSetMemoryParameters
  • virNodeSuspendForDuration

Domain API

Domain

  • virDomainCreate
  • virDomainCreateLinux
  • virDomainCreateWithFiles
  • virDomainCreateWithFlags
  • virDomainCreateXML
  • virDomainCreateXMLWithFiles
  • virDomainDefineXML
  • virDomainDefineXMLFlags

  • virConnectGetAllDomainStats
  • virConnectGetDomainCapabilities
  • virConnectListAllDomains
  • virConnectListDefinedDomains
  • virConnectListDomains
  • virConnectNumOfDefinedDomains
  • virConnectNumOfDomains
  • virDomainBlockStat
  • virDomainBlockStatsFlags
  • virDomainGetAutostar
  • 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

  • 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

  • virDomainDestroy
  • virDomainDestroyFlags
  • virDomainFree
  • virDomainUndefine
  • virDomainUndefineFlags
  • virDomainUpdateDeviceFlags

其他

  • virConnectDomainXMLFromNative
  • virConnectDomainXMLToNative

Domain Snapshot

  • virDomainSnapshotCreateXML

  • virDomainHasCurrentSnapshot
  • virDomainListAllSnapshots
  • virDomainSnapshotCurrent
  • virDomainSnapshotGetConnect
  • virDomainSnapshotGetDomain
  • virDomainSnapshotGetName
  • virDomainSnapshotGetParent
  • virDomainSnapshotGetXMLDesc
  • virDomainSnapshotHasMetadata
  • virDomainSnapshotIsCurrent
  • virDomainSnapshotListAllChildren
  • virDomainSnapshotListChildrenNames
  • virDomainSnapshotListNames
  • virDomainSnapshotLookupByName
  • virDomainSnapshotNum
  • virDomainSnapshotNumChildren
  • virDomainSnapshotRef

  • virDomainRevertToSnapshot

  • virDomainSnapshotDelete
  • virDomainSnapshotFree

Domain Event

  • virConnectDomainEventDeregister
  • virConnectDomainEventDeregisterAny
  • virConnectDomainEventDeviceAddedCallback
  • virConnectDomainEventDeviceRemovedCallback
  • virConnectDomainEventAgentLifecycleCallback
  • virConnectDomainEventBalloonChangeCallback
  • virConnectDomainEventBlockJobCallback
  • virConnectDomainEventCallback
  • virConnectDomainEventDiskChangeCallback
  • virConnectDomainEventGenericCallback
  • virConnectDomainEventGraphicsCallback
  • virConnectDomainEventIOErrorCallback
  • virConnectDomainEventIOErrorReasonCallback
  • virConnectDomainEventPMSuspendCallback
  • virConnectDomainEventPMSuspendDiskCallback

Storage API

Strorage Pool

  • virStoragePoolBuild
  • virStoragePoolCreate
  • virStoragePoolCreateXML
  • virStoragePoolDefineXML

  • virConnectFindStoragePoolSources
  • virConnectListAllStoragePools
  • virConnectListDefinedStoragePools
  • virConnectListStoragePools
  • virConnectNumOfDefinedStoragePools
  • virConnectNumOfStoragePools
  • virStoragePoolGetInfo
  • virStoragePoolGetName
  • virStoragePoolGetUUID
  • virStoragePoolGetUUIDString
  • virStoragePoolGetXMLDesc
  • virStoragePoolIsActive
  • virStoragePoolIsPersistent
  • virStoragePoolLookupByName
  • virStoragePoolLookupByUUID
  • virStoragePoolLookupByUUIDString
  • virStoragePoolLookupByVolume
  • virStoragePoolRef

  • virStoragePoolRefresh
  • virStoragePoolSetAutostart

  • virStoragePoolDelete
  • virStoragePoolDestroy
  • virStoragePoolFree
  • virStoragePoolUndefine

其他

  • virStoragePoolGetAutostart
  • virStoragePoolGetConnect
  • virStoragePoolNumOfVolumes
  • virStoragePoolListAllVolumes
  • virStoragePoolListVolumes

Storage Volume

  • virStorageVolCreateXML
  • virStorageVolCreateXMLFrom

  • virStorageVolGetConnect
  • virStorageVolGetInfo
  • virStorageVolGetKey
  • virStorageVolGetName
  • virStorageVolGetPath
  • virStorageVolGetXMLDesc
  • virStorageVolLookupByKey
  • virStorageVolLookupByName
  • virStorageVolLookupByPath
  • virStorageVolRef

  • virStorageVolResize
  • virStorageVolUpload
  • virStorageVolWipe
  • virStorageVolWipePattern

  • virStorageVolDelete
  • virStorageVolFree

其他

  • virStorageVolDownload

Network API

Network

  • virNetworkCreate
  • virNetworkCreateXML
  • virNetworkDefineXML

  • virConnectListAllNetworks
  • virConnectListDefinedNetworks
  • virConnectListNetworks
  • virConnectNumOfDefinedNetworks
  • virConnectNumOfNetworks
  • virNetworkGetName
  • virNetworkGetUUID
  • virNetworkGetUUIDString
  • virNetworkGetXMLDesc
  • virNetworkGetBridgeName
  • virNetworkGetDHCPLeases
  • virNetworkIsActive
  • virNetworkIsPersistent
  • virNetworkLookupByName
  • virNetworkLookupByUUID
  • virNetworkLookupByUUIDString
  • virNetworkGetAutostart
  • virNetworkGetConnect

  • virNetworkSetAutostart
  • virNetworkUpdate

  • virNetworkDestroy
  • virNetworkFree
  • virNetworkUndefine

其他

  • virConnectNetworkEventDeregisterAny
  • virConnectNetworkEventGenericCallback
  • virNetworkDHCPLeaseFree

Interface

  • virInterfaceCreate
  • virInterfaceDefineXML

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

  • virInterfaceChangeBegin
  • virInterfaceChangeCommit
  • virInterfaceChangeRollback

  • virInterfaceDestroy
  • virInterfaceFree
  • virInterfaceUndefine

Libvirt + QEMU-KVM 环境部署

HostOS 配置优化

  1. 使用国内 yum 和 epel 镜像源加速。
$ yum -y install wget

$ mkdir /etc/yum.repos.d/repo.bk
$ mv /etc/yum.repos.d/*.repo /etc/yum.repos.d/repo.bk

$ wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
$ wget -O /etc/yum.repos.d/epel-7.repo http://mirrors.aliyun.com/repo/epel-7.repo

$ yum clean all
$ yum makecache

$ yum install -y epel-release
  1. 升级 HostOS。
$ yum update -y && yum upgrade -y

开启 KVM Nested 嵌套虚拟化(可选的)

如果 HostOS 本身就是一个 VM,那么就需要开启 KVM Nested 嵌套虚拟化,使得 HostOS 能够具有与 Host 相同的 CPU 硬件辅助虚拟化特性,才能够在 VM 里面嵌套运行 KVM 虚拟机。

KVM Nested 是一个可通过修改内核参数来启用的功能,它能够使一台 VM 与 Host 可以具相同的 CPU 特性,支持 vmx|svm(AMD) 硬件虚拟化,该特性需要 Linux 内核版本大于 Linux 3.x。

查看是否启动了 Nested:

$ cat /sys/module/kvm_intel/parameters/nested
Y

启用 Nested:

$ echo 'options kvm_intel nested=1' >/etc/modprobe.d/kvm-nested.conf

# 卸载内核模块
$ modprobe -r kvm_intel

# 重新加载内核模块
$ modprobe kvm_intel

NOTE:如果无法重载内核模块,可以考虑直接重启。

如果希望已经存在的 KVM 虚拟机支持嵌套虚拟化,则需要重新编辑虚拟机的 XML 文件,修改其 CPU mode。

# 关机
$ virsh shutdown domain-xxx

# 编辑
$ virsh edit domain-xxx

<cpu mode='host-passthrough'>

# 开机
$ virsh start domain-xxx

登录入虚拟机检查是否有 CPU 穿透:

$ egrep '(vmx|svm)' /proc/cpuinfo
flags		: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon rep_good nopl eagerfpu pni pclmulqdq vmx ssse3 cx16 pcid sse4_1 sse4_2 x2apic popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm tpr_shadow vnmi flexpriority ept vpid fsgsbase tsc_adjust smep erms xsaveopt

安装 CentOS GNOME 图形界面

$ yum groupinstall -y "X Window System"
$ yum groupinstall -y "GNOME Desktop" "Graphical Administration Tools" 

$ init 5

安装 Libvirt + QEMU-KVM

$ cat /proc/cpuinfo | egrep 'vmx|svm'

$ setenforce 0
$ sed -i 's/=enforcing/=disabled/g' /etc/selinux/config

$ systemctl disable firewalld.service && systemctl stop firewalld.service && systemctl status firewalld.service

$ yum install -y qemu-kvm libvirt virt-manager virt-install bridge-utils 

$ lsmod | grep kvm

# 修改 QEMU 配置,使 Root 用户有文件访问权限
$ vi /etc/libvirt/qemu.conf
...
user = "root"
group = "root"

$ systemctl start libvirtd && systemctl enable libvirtd && systemctl status libvirtd

相关安装包及其作用文章来源地址https://www.toymoban.com/news/detail-438355.html

  • qemu-kvm:QEMU 的 KVM 分支发行版软件程序,包含了 KVM Kernel Module 和基于 KVM 重构后的 QEMU 模拟器。
  • qemu-img:QCOW2 镜像文件命令行工具。
  • libvirt:Libvirt 软件程序,提供了一套虚拟化管理工具及 API。
  • libvirt-client:Libvirt 的客户端软件程序,最重要的功能之一就是在宿主机关机时可以通知虚拟机也进行关机。
  • virt-manager:基于 Libvirt 的 GUI 虚拟机管理软件程序。
  • virt-install:基于 Libvirt 的用于创建虚拟机的命令行工具。
  • libvirt-python:Libvirt 的 Pyhton API。
  • python-virtinst:一套 Python 实现的用于创建虚拟机的命令行工具和程序库。
  • virt-viewer:连接虚拟机 Console 的命令行工具。
  • virt-top:虚拟机资源使用情况查看命令行工具。
  • virt-clone:虚拟机克隆命令行工具。
  • libguestfs-tools:GuestOS File System 命令行工具。
  • bridge-utils:Linux Bridge 命令行工具。

编译安装指定版本

  • 下载指定的版本
$ wget https://download.qemu.org/qemu-2.11.0.tar.xz
  • 安装编译依赖
$ yum -y install gcc gcc-c++ automake libtool zlib-devel glib2-devel bzip2-devel libuuid-devel spice-protocol spice-server-devel usbredir-devel libaio-devel 
  • 开始编译安装 QEMU-KVM
$ tar xvJf qemu-2.11.0.tar.xz
$ cd qemu-2.11.0
$ yum install -y libseccomp libseccomp-devel
$ yum install -y numactl numactl-devel
$ ./configure --enable-seccomp --enable-numa --prefix=/usr/local/qemu.2.11 && make && make install
  • 替换 bin 文件
$ ln -s /usr/local/qemu.2.11/bin/qemu-system-x86_64 /usr/bin/qemu-kvm
$ ln -s /usr/local/qemu.2.11/bin/qemu-system-x86_64 /usr/libexec/qemu-kvm
$ ln -s /usr/local/qemu.2.11/bin/qemu-img /usr/bin/qemu-img
  • 检查
$ qemu-img --version
$ qemu-kvm -version

到了这里,关于虚拟化技术 — Libvirt 异构虚拟化管理组件的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 云计算虚拟化技术与开发-------虚拟化技术应用第一章内容(虚拟化技术概念、虚拟化特征、虚拟化目的、半虚拟化和全虚拟化特点和区别、虚拟化实现的三种结构的特点和区别)

    目录 虚拟化技术第一章主要内容 虚拟化技术的概念: 虚拟化的特征:         虚拟化的目的: 虚拟化与云计算的关系: 半虚拟化和全虚拟化的特点和区别:  虚拟化实现的三种结构的特点和区别:         虚拟化(Virtualization)是把物理资源转变为逻辑上可以管理

    2024年02月03日
    浏览(54)
  • 虚拟化技术 — 虚拟机计算

    NUMA CPU 的主要优势是: 高内存带宽 :每一个 NUMA Node 内部有专用的内存总线访问本地内存,而所有 NUMA Nodes 之间使用共享总线访问远端内存。假设:一个具有 4 个 NUMA Nodes 的系统,每一个 Node 内部有 1GB/s 的存储带宽,同时共享总线也具有 1GB/s 的带宽。如果所有的 Core 总是使

    2024年02月04日
    浏览(61)
  • 【云计算学习教程】云计算虚拟化技术和容器技术详解_云计算虚拟化技术与容器技术

    这跟交通网络很相似,连接两个城市的交通网络具备的第一个功能就是汽车从一个城市到达另一个城市;第二个功能是控制到底走哪条线路最好。前者就是由公路组成的交通网络,后者就是交通控制系统。 下面我们再来看看传统的网络设备(比如一台路由器)的逻辑分层结构

    2024年04月22日
    浏览(61)
  • 云计算虚拟化技术与开发-------虚拟化技术应用第五章内容(纯软件/半虚拟化/直接分配三种I/O虚拟化方案的对比、virtio实现I/O半虚拟化的原理、气球技术的作用和原理、V2V在线迁移的特点)

    目录 第五章:KVM高级功能讲解 纯软件/半虚拟化/直接分配三种I/O虚拟化方案的对比 I/O 全虚拟化 I/O 半虚拟化 I/O 直通或透传技术  virtio实现I/O半虚拟化的原理 气球技术的作用和原理  V2V在线迁移的特点、作用及KVM中的运行步骤 KVM虚拟化的安全技术架构 QEMU monitor的基本使用

    2024年02月07日
    浏览(60)
  • 虚拟化技术 — VirtIO 虚拟设备接口标准

    VirtIO 由 Rusty Russell 开发,最初是为了支持自己开发的 lguest Hypervisor,其设计目标是在虚拟化环境下提供与物理设备相近的 I/O 功能和性能,并且避免在虚拟机中安装额外的驱动程序。基于这一目标,后来通过开源的方式将 VirtIO 延伸为一种虚拟化设备接口标准,并广泛的支持

    2023年04月25日
    浏览(45)
  • 虚拟化技术基础

    虚拟化是当今云计算的核心技术之一,它 可以实现 IT 资源性分配,使 IT 资源分配更加灵活,能更弹性的满足多样化的需求 。 虚拟化定义 虚拟化可将信息系统的各种物理资源进行抽象、转换后呈现出来, 打破显示结构件的不可切割的障碍,使用户更好地应用这些资源 。 虚

    2024年02月03日
    浏览(39)
  • 存储虚拟化技术

    1、存储虚拟化简介 存储领域国际权威机构存储网络工业协会(SNIA)给出的存储虚拟化的定义是“通过将存储系统/子系统的内部功能从应用程序、计算服务器和网络资源中进行抽象、隐藏或隔离,实现独立于应用程序、网络的存储与数据管理”。 存储虚拟化是指将 SAN 中的各

    2024年02月07日
    浏览(36)
  • 虚拟化技术课程实践

    实验目的及要求 实验目的 :基于课程中讲授的虚拟化基本原理和技术,掌握虚拟化环境的搭建方法,熟悉了解一些典型的虚拟化平台的命令。 实验要求 :在Ubuntu操作系统下使用KVM和QUME创建虚拟机镜像、启动虚拟机。 实验环境 VMware Workstation 16 Pro 装有 Ubuntu14.04 操作系统的

    2024年02月08日
    浏览(50)
  • AWS的虚拟化技术

    提到aws的底层的虚拟化的技术的时候,大家可能总是能看到这张图。 但是我一直没有看的太懂,于是今天花点时间仔细看看了。 这里详细解释一下。 先解释一下图中的术语: 上面颜色部分由于我是色盲所以不说颜色了,下面的颜色的性能最差,上面颜色的性能最高 VM:虚拟

    2024年02月09日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包