对接 libvirt
[[toc]]
概述
libvirt 是一个管理 hypervisor 的上层软件,它通过不同的驱动统一管理不同类型的 hypervisor ,并对外提供统一、稳定的应用程序接口。
在云场景中,业内广泛使用 libvirt 管理大规模的虚拟机。为了方便地对大规模的 StratoVirt 虚拟机进行部署、编排和管理,StratoVirt 标准虚拟化支持对接 libvirt,打通了 libvirt 北向接口。用户可以通过 libvirt 对应的 XML 文件描述一个虚拟机,包括虚拟机名称、CPU、磁盘等。
本章介绍 StratoVirt 平台支持的 XML 配置,以及如何使用 virsh 命令管理虚拟机。
前提条件
StratoVirt 对接 libvirt,主机需要满足如下条件:
- 已正确配置 yum 源
- 已正确安装并启动 libvirt
- 已正确安装 StratoVirt
虚拟机配置
libvirt 工具采用 XML 格式的文件描述一个虚拟机特征,包括虚拟机名称、CPU、内存、磁盘、网卡等信息。用户可以通过修改配置文件,对虚拟机进行管理。
StratoVirt 对接 libvirt 之前,需要先配置 XML 文件。本小节介绍 StratoVirt 对接 libvirt 时支持的 XML 配置项以及配置方式。
说明
使用 libvirt 管理 StratoVirt 虚拟机前,应该注意到 StratoVirt 当前支持的特性、特性之间的互斥关系、特性的配置前提条件、规格等,详细信息请参见命令行方式的 “虚拟机配置”章节。
虚拟机描述
虚拟机 XML 文件必须包含描述虚拟机的最基本元素: domain 和 name 。
元素介绍
domain : 虚拟机配置的根元素,用于配置运行 StratoVirt 虚拟机的 hypervisor 类型。
属性 type :domain 的类型,在 StratoVirt 虚拟化中,该值为 kvm 。
name :虚拟机名称。
虚拟机名称是一个长度不超过 255 字符的字符串。同一个主机上的虚拟机名称不能重复,虚拟机名称必须由数字、字母、“_”、“-”、“:” 组成。
配置示例
假设配置虚拟机名称为 StratoVirt ,示例为:
<domain type='kvm'>
<name>StratoVirt</name>
...
</domain>
虚拟CPU和内存
本节介绍虚拟 CPU 和虚拟内存的配置。
元素介绍
vcpu:虚拟处理器的个数。
memory:虚拟内存大小。
属性 unit :指定内存单位,属性值支持 KiB(210 字节)、MiB(220 字节)、GiB(230 字节)、TiB(240 字节)等。
说明
StratoVirt 暂不支持 CPU 拓扑结构,请勿配置该项。
配置示例
配置 8GiB 内存,4 个虚拟处理器的示例如下:
<domain type='kvm'>
...
<vcpu>4</vcpu>
<memory unit='GiB'>8</memory>
...
</domain>
虚拟机设备
本节介绍如何使用 XML 文件配置虚拟机设备:磁盘,网卡,rng,balloon,console,vsock 设备。
磁盘
元素介绍
属性 type :指定后端存储介质类型,在 StratoVirt 虚拟化中,该值为 file 。
属性 device:呈现给虚拟机的存储介质类型,在 StratoVirt 虚拟化中,该值为 disk 。
driver:指定后端驱动的详细信息。
属性 type :磁盘的格式类型,在 StratoVirt 虚拟化中,该值为 raw 。StratoVirt 当前只支持 raw 格式的磁盘。
属性 iothread:为磁盘配置 iothread ,取值为 iothread 编号。在配置磁盘的 iothread 之前,需使用 iothread 元素配置 iothread 的个数。
source: 指定后端存储介质。
属性 file:指定磁盘路径。
target:指定后端驱动的详细信息。
属性 dev:指定磁盘名称。
属性 bus:指定磁盘设备的类型,在 StratoVirt 虚拟化中,该值为 virtio 。
iotune: 指定磁盘 IO 特性。
属性 total_iops_sec:设置磁盘 iops 的值。
address:用于设置设备所要挂载的总线属性。
属性 type:总线类型,在 StratoVirt 虚拟化中,该值为 pci 。
属性 domain:虚拟机的域。
属性 bus:设备将要挂载的 bus 号。
属性 slot:设备将要挂载的 slot 号,取值范围为:[0, 31] 。
属性 function:设备将要挂载的 function 号,取值范围为:[0, 7] 。
配置示例
配置磁盘路径为:/home/openEuler-21.09-stratovirt.img
,配置 1 个 iothread,并且磁盘 iothread 配置为 iothread1 ,iops 为 10000,并将其挂载在 bus 为 1、slot 为 0,function 为 0 的 PCI 总线上,示例为:
<domain type='kvm'>
...
<iothreads>1</iothreads>
<devices>
<disk type='file' device='disk'>
<driver name='qemu' type='raw' iothread="1"/>
<source file='/home/openEuler-21.09-stratovirt.img'/>
<target dev='hda' bus='virtio'/>
<iotune>
<total_iops_sec>10000</total_iops_sec>
</iotune>
<address type='pci' domain='0x0000' bus='0x01' slot='0x00' function='0x00' />
</disk>
...
</devices>
</domain>
网络设备
元素介绍
interface:网络接口
属性 type:指定网络设备类型。
mac:虚拟网卡地址
属性 address:虚拟网卡地址。
source: 指定后端网桥
属性 bridge:指定网桥。
target:指定后端网卡
属性 dev:指定后端的 tap 设备。
model: 虚拟网卡类型
属性 type: 虚拟网卡类型,在 StratoVirt 虚拟化中,该值为 virtio。
driver:用来指定是否开启 vhost 。
属性 name:如果设置 name 为 qemu 则使用 virtio-net 设备,如果不配置 driver 或者 name 值为 vhost ,则使用 vhost-net 设备。
配置示例
配置网络前请参考 配置linux网桥,配置好 Linux 网桥。配置 mac 地址为:de:ad:be:ef:00:01
,网桥为配置好的 br0 ,使用 virtio-net 设备,并将其挂载在 bus 为 2、slot 为 0,function 为 0 的 PCI 总线上,示例为:
<domain type='kvm'>
...
<devices>
<interface type='bridge'>
<mac address='de:ad:be:ef:00:01' />
<source bridge='br0'/>
<model type='virtio'/>
<driver name='qemu'/>
<address type='pci' domain='0x0000' bus='0x02' slot='0x00' function='0x00' />
</interface>
...
</devices>
</domain>
balloon 设备
元素介绍
memballoon:balloon 设备类型
属性 model :指定 balloon 设备类型,在 StratoVirt 虚拟化中,该值为 virtio 。
alias:balloon 设备的别名
属性 name :balloon 设备的 id 。
属性 autodeflate :设置 auto deflate(自动收缩)特性,可选值为:
on
、off
。
配置示例
配置 balloon 设备,开启 autodeflate 特性,并将其挂载在 bus 为 3、slot 为 0,function 为 0 的 PCI 总线上,示例为:
<domain type='kvm'>
...
<devices>
<memballoon model='virtio'>
<alias name='balloon0' autodeflate='on'/>
<address type='pci' domain='0x0000' bus='0x03' slot='0x00' function='0x00' />
</memballoon>
...
</devices>
</domain>
console 设备
由于 console 设备挂载在 virtio-serial 下的总线上,所以在创建 console 设备时,需要创建 virtio-serial 设备。
说明
StratoVirt 的 console 设备暂时不支持多端口特性,每个虚拟机只能配置一个 console 设备。
元素介绍
controller:控制器
属性 type:控制器类型,此处值为 virtio-serial 。
alias:别名
属性 name:设备的 id。
console:console 设备
属性 type:指定 console 设备的重定向方式。支持的重定向方式有:pty , file 和 unix 。
target:配置 console 设备。
属性 type:指定 console 设备类型,在 StratoVirt 虚拟化中,该值为 virtio 。
配置示例
配置重定向方式为 pty ,并将其挂载在 bus 为 4、slot 为 0,function 为 0 的 PCI 总线上,示例为:
<domain type='kvm'>
...
<devices>
<controller type='virtio-serial'>
<alias name='virt-serial0'/>
<address type='pci' domain='0x000' bus='0x04' slot='0x00' function='0x00'/>
</controller>
<console type='pty'>
<target type='virtio'/>
<alias name='console0'/>
</console>
...
</devices>
</domain>
rng 设备
元素介绍
rng:rng 设备
属性 model:指定 rng 设备类型,在 StratoVirt 虚拟化中,该值为 virtio 。
rate:rng 设备产生随机数速率
属性 period :用于设置随机数产生周期,单位为毫秒,当前 StratoVirt 不支持设置周期值,默认值为1000毫秒,请将该值设置为1000。
属性 bytes :周期内产生的最大字节数。
backend:设置 rng 设备后端,值为 host 中 rng 设备的路径
属性 model:用于指定后端设备类型,在 StratoVirt 虚拟化中,该值为 random 。
配置示例
配置周期为 1000ms 内最多产生 1234 字节,rng 设备在 host 中路径为 /dev/random
,并将其挂载在 bus 为 5、slot 为 0,function 为 0 的 PCI 总线上,示例为:
<domain type='kvm'>
...
<devices>
<rng model='virtio'>
<rate period='1000' bytes='1234'/>
<backend model='random'>/dev/random`</backend>
<address type='pci' domain='0x000' bus='0x05' slot='0x00' function='0x00'/>
</rng>
...
</devices>
</domain>
vsock 设备
元素介绍
vsock:vsock 设备
属性 model:指定 vsock 设备类型,在 StratoVirt 虚拟化中,该值为 virtio 。
cid :设置 vsock 设备的 cid
属性 address:用于设置 cid 的值
配置示例
配置 cid 为 8,并将其挂载在 bus 为 6、slot 为 0,function 为 0 的 PCI 总线上,示例为:
<domain type='kvm'>
...
<devices>
<vsock model='virtio'>
<cid auto='no' address='8'/>
<address type='pci' domain='0x000' bus='0x06' slot='0x00' function='0x00'/>
</vsock>
...
</devices>
</domain>
体系架构相关配置
XML 中还有一些体系架构相关的配置,如 pflash、主板等。
元素介绍
os:定义虚拟机启动参数
子元素 type :指定虚拟机类型,属性 arch 表示架构,属性 machine 表示主板类型,在 StratoVirt 虚拟化中,AArch64 架构只支持 virt 主板,x86_64 架构只支持 Q35 主板。
子元素 kernel :用于指定 kernel 路径。
子元素 cmdline :指定命令行启动参数。
子元素 loader :指定加载固件,属性 readonly 表示是否只读;属性 type 表示类型,在 StratoVirt 虚拟化中,该值为 pflash 。
features:hypervisor 支持的以下特性
子元素 acpi :是否支持 ACPI,在 StratoVirt 虚拟化中使用了 ACPI 特性,所以该特性必须配置。
子元素 gic :ARM 处理器指定中断处理器,属性 version 表示 GIC 的版本,在 StratoVirt 虚拟化中,该值为 3 。
配置示例
配置虚拟机 CPU 架构 ARM,主板为 virt ,启动命令行为:console=ttyAMA0 root=/dev/vda reboot=k panic=1 rw
。pflash 路径为:/usr/share/edk2/aarch64/QEMU_EFI-pflash.raw
,属性为只读。 kernel 路径为:/home/std-vmlinuxz
。示例为:
<domain type='kvm'>
...
<os>
<type arch='aarch64' machine='virt'>hvm</type>
<kernel>/home/std-vmlinuxz</kernel>
<cmdline>console=ttyAMA0 root=/dev/vda reboot=k panic=1 rw</cmdline>
<loader readonly='yes' type='pflash'>`/usr/share/edk2/aarch64/QEMU_EFI-pflash.raw`</loader>
</os>
...
</domain>
内存大页
元素介绍
memoryBacking:表示配置内存相关的信息
hugepages :配置内存大页
page :大页配置
属性 size :内存大页的大小
属性 unit :大页大小的单位
配置示例
配置 2MiB 大页示例如下:
<domain type='kvm'>
...
<memoryBacking>
<hugepages>
<page size='2' unit='MiB' />
</hugepages>
</memoryBacking>
...
</domain>
配置示例
x86 配置示例
配置一台名为 StratoVirt ,内存 8GiB ,配置 1GiB 单位的内存大页,4 个虚拟 CPU,架构为 x86_64 ,主板类型为 Q35 ,对应 XML 文件的配置示例如下:
<domain type='kvm'>
<name>StratoVirt</name>
<memory unit='GiB'>8</memory>
<!-- hugepages -->
<memoryBacking>
<hugepages>
<page size='1' unit='GiB' />
</hugepages>
</memoryBacking>
<vcpu>4</vcpu>
<!-- iothread -->
<iothreads>1</iothreads>
<os>
<type arch='x86_64' machine='q35'>hvm</type>
<kernel>/path/to/standard_vm_kernel</kernel>
<cmdline>console=hvc0 root=/dev/vda reboot=k panic=1 rw</cmdline>
<loader readonly='yes' type='pflash'>/path/to/pflash</loader>
<nvram template='/path/to/OVMF_VARS'>/path/to/OVMF_VARS</nvram>
</os>
<features>
<acpi/>
</features>
<devices>
<emulator>/path/to/StratoVirt_binary_file</emulator>
<controller type='pci' index='0' model='pcie-root' />
<!-- pcie-root-port -->
<controller type='pci' index='1' model='pcie-root-port' />
<controller type='pci' index='2' model='pcie-root-port' />
<controller type='pci' index='3' model='pcie-root-port' />
<controller type='pci' index='4' model='pcie-root-port' />
<controller type='pci' index='5' model='pcie-root-port' />
<controller type='pci' index='6' model='pcie-root-port' />
<controller type='pci' index='7' model='pcie-root-port' />
<!-- block -->
<disk type='file' device='disk'>
<driver name='qemu' type='raw' iothread='1'/>
<source file='/path/to/rootfs'/>
<target dev='hda' bus='virtio'/>
<iotune>
<total_iops_sec>1000</total_iops_sec>
</iotune>
<address type='pci' domain='0x000' bus='0x01' slot='0x00' function='0x00'/>
</disk>
<!-- net -->
<interface type='bridge'>
<mac address='de:ad:be:ef:00:01'/>
<source bridge='qbr0'/>
<model type='virtio'/>
<address type='pci' domain='0x000' bus='0x02' slot='0x00' function='0x00'/>
</interface>
<!-- virtio-serial -->
<controller type='virtio-serial' index='0'>
<alias name='virt-serial0'/>
<address type='pci' domain='0x000' bus='0x03' slot='0x00' function='0x00'/>
</controller>
<console type='pty'>
<target type='virtio' port='0'/>
<alias name='console0'/>
</console>
<!-- balloon -->
<memballoon model='virtio'>
<alias name='balloon0'/>
<address type='pci' domain='0x000' bus='0x04' slot='0x00' function='0x00'/>
</memballoon>
<!-- rng -->
<rng model='virtio'>
<rate period='1000' bytes='1234'/>
<backend model='random'>/path/to/random_file</backend>
<address type='pci' domain='0x000' bus='0x05' slot='0x00' function='0x00'/>
</rng>
<!-- vsock -->
<vsock model='virtio'>
<cid auto='no' address='3'/>
<address type='pci' domain='0x000' bus='0x06' slot='0x00' function='0x00'/>
</vsock>
</devices>
</domain>
ARM 配置示例
如果想要配置一台名为 StratoVirt ,内存 8GiB,配置 1GiB 单位大页,4 个虚拟 CPU,架构为 aarch64 ,主板类型为 virt ,对应 XML 文件的配置示例如下:
<domain type='kvm'>
<name>StratoVirt</name>
<memory unit='GiB'>8</memory>
<!-- hugepages -->
<memoryBacking>
<hugepages>
<page size='1' unit='GiB' />
</hugepages>
</memoryBacking>
<vcpu>4</vcpu>
<!-- iothread -->
<iothreads>1</iothreads>
<os>
<type arch='aarch64' machine='virt'>hvm</type>
<kernel>/path/to/standard_vm_kernel</kernel>
<cmdline>console=ttyAMA0 root=/dev/vda reboot=k panic=1 rw</cmdline>
<loader readonly='yes' type='pflash'>/path/to/pflash</loader>
</os>
<features>
<acpi/>
<gic version='3'/>
</features>
<devices>
<emulator>/path/to/StratoVirt_binary_file</emulator>
<controller type='pci' index='0' model='pcie-root'/>
<!-- block -->
<disk type='file' device='disk'>
<driver name='qemu' type='raw' iothread='1'/>
<source file='/path/to/rootfs'/>
<target dev='hda' bus='virtio'/>
<address type='pci' domain='0x000' bus='0x00' slot='0x01' function='0x00'/>
<iotune>
<total_iops_sec>1000</total_iops_sec>
</iotune>
</disk>
<!-- net -->
<interface type='bridge'>
<mac address='de:ad:be:ef:00:01'/>
<source bridge='qbr0'/>
<model type='virtio'/>
<address type='pci' domain='0x000' bus='0x00' slot='0x02' function='0x00'/>
</interface>
<!-- virtio-serial -->
<controller type='virtio-serial' index='0'>
<alias name='virt-serial0'/>
<address type='pci' domain='0x000' bus='0x00' slot='0x03' function='0x00'/>
</controller>
<console type='pty'>
<target type='virtio' port='0'/>
<alias name='console0'/>
</console>
<!-- balloon -->
<memballoon model='virtio'>
<alias name='balloon0'/>
<address type='pci' domain='0x000' bus='0x00' slot='0x04' function='0x00'/>
</memballoon>
<!-- rng -->
<rng model='virtio'>
<rate period='1000' bytes='1234'/>
<backend model='random'>/path/to/random_file</backend>
<address type='pci' domain='0x000' bus='0x00' slot='0x05' function='0x00'/>
</rng>
<!-- vsock -->
<vsock model='virtio'>
<cid auto='no' address='3'/>
<address type='pci' domain='0x000' bus='0x00' slot='0x06' function='0x00'/>
</vsock>
</devices>
</domain>
管理虚拟机
libvirt 使用 virsh 命令来管理虚拟机,当 StratoVirt 平台和 libvirt 对接时,仅支持以下与 StratoVirt 交互的命令:
create:创建虚拟机
suspend:挂起虚拟机
resume:恢复虚拟机
destroy:销毁虚拟机
console:通过 console 登录虚拟机
说明
StratoVirt 暂不支持虚拟机重启、虚拟机关机等命令。
管理虚拟机生命周期
假设用户已经按照需要完成一个名为 stratovirt 的虚拟机配置文件 st.xml ,则对应生命周期管理的命令如下:
创建虚拟机
virsh create st.xml
虚拟机创建完成后,可以通过 virsh list 命令查看,会存在一个名为 stratovirt 的虚拟机。
挂起虚拟机
virsh suspend stratovirt
虚拟机挂起后,虚拟机暂停运行。可以通过 virsh list 命令查看,虚拟机 stratovirt 的状态为 paused 。
恢复虚拟机
virsh resume stratovirt
虚拟机恢复后,可以通过 virsh list 命令查看,虚拟机 stratovirt 的状态为 running 。
销毁虚拟机
virsh destroy stratovirt
虚拟机销毁后,使用 virsh list 查看虚拟机,发现虚拟机 stratovirt 不存在。
登录虚拟机
虚拟机创建完成后,可以通过 virsh console 登录虚拟机内部操作虚拟机。假设虚拟机名称为 stratovirt,参考命令如下:
virsh console stratovirt
说明
为了可以正常使用 virsh console 命令,需要在 XML 中配置 console 设备的重定向类型为 pty 。