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

目录

Libvirt

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

  • https://libvirt.org/

在这里插入图片描述

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 等多种虚拟化实现。

在这里插入图片描述

libvirtd Daemon

在这里插入图片描述

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 协议进行安全通信。

在这里插入图片描述

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

相关安装包及其作用

  • 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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

范桂飓

文章对您有帮助就请一键三连:)

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值