对接 libvirt
概述
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-23.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-23.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>/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 登录虚拟机
define:根据 xml 配置创建一个虚拟机
undefine:删除一个已定义的虚拟机
start:启动一个关闭状态的虚拟机
说明
目前已经在 libvirt 中实现对接 StratoVirt 的接口(暂不支持关机,重启等命令)。使用 virsh -c stratovirt:///system 'command' 即可调用 libvirt 中的 StratoVirt_driver 接口,同时,可以使用 virsh -c stratovirt:///system 进入 virsh 命令行,此时连接为 stratovirt_driver 。
管理虚拟机生命周期
假设用户已经按照需要完成一个名为 StratoVirt 的虚拟机配置文件 st.xml ,则对应生命周期管理的命令如下:
创建虚拟机
virsh create st.xml /// virsh -c stratovirt:///system create st.xml
虚拟机创建完成后,可以通过 virsh list/virsh -c stratovirt:///system list 命令查看,会存在一个名为 StratoVirt 且状态为 running 的虚拟机。
根据 xml 配置创建一个虚拟机
virsh define st.xml /// virsh -c stratovirt:///system define st.xml
虚拟机创建完成后,可以通过 virsh list/virsh -c stratovirt:///system list 命令查看,会存在一个名为 StratoVirt 且状态为 shut off 的虚拟机。
启动一个关闭状态的虚拟机
virsh start StratoVirt /// virsh -c stratovirt:///system start StratoVirt
虚拟机启动后,可以通过 virsh list/virsh -c stratovirt:///system list 命令查看,虚拟机 StratoVirt 的状态从 shut off 变为 running。
挂起虚拟机
virsh suspend StratoVirt /// virsh -c stratovirt:///system suspend StratoVirt
虚拟机挂起后,虚拟机暂停运行。可以通过 virsh list/virsh -c stratovirt:///system list 命令查看,虚拟机 StratoVirt 的状态为 paused 。
恢复虚拟机
virsh resume StratoVirt /// virsh -c stratovirt:///system resume StratoVirt
虚拟机恢复后,可以通过 virsh list/virsh -c stratovirt:///system list 命令查看,虚拟机 StratoVirt 的状态为 running 。
销毁虚拟机
virsh destroy StratoVirt /// virsh -c stratovirt:///system destroy StratoVirt
虚拟机销毁后,使用 virsh list/virsh -c stratovirt:///system list 查看虚拟机,发现虚拟机 StratoVirt 不存在。
删除一个已定义的虚拟机
virsh undefine StratoVirt /// virsh -c stratovirt:///system undefine StratoVirt
删除一个已定义的虚拟机后,使用 virsh list/virsh -c stratovirt:///system list 查看虚拟机,shut off 状态的虚拟机 StratoVirt 不存在,如果虚拟机 StratoVirt 为 running 状态,则在销毁虚拟机 StratoVirt 后,虚拟机 StratoVirt 不再进入 shut off 状态。
登录虚拟机
虚拟机创建完成后,可以通过 virsh console/virsh -c stratovirt:///system console 登录虚拟机内部操作虚拟机。假设虚拟机名称为 StratoVirt,参考命令如下:
virsh console StratoVirt
///
virsh -c stratovirt:///system console StratoVirt
说明
为了可以正常使用 virsh console 命令,需要在 XML 中配置 console 设备的重定向类型为 pty 。