虚拟机配置
基本配置
概述
不同于Libvirt通过xml文件配置虚拟机的方式,StratoVirt可以通过命令行参数指定配置,也可以通过json文件进行配置。配置包括虚拟机CPU、内存、磁盘等信息。这里给出两种方式的具体操作方法。
同时使用命令行配置和json文件配置时,以命令行配置为准。
本文中的/path/to/socket为用户自定义路径下的socket文件。
规格说明
- 虚拟机CPU个数:[1, 254] 。
- 虚拟机内存大小:[256M, 512G] 。
- 虚拟机磁盘个数(包括热插的磁盘):[0, 6] 。
- 虚拟机网卡个数(包括热插的网卡):[0, 2] 。
- 虚拟机console设备仅支持单路连接。
- x86_64平台,最多可以配置11个mmio设备;但是除了磁盘和网卡,建议最多配置2个其他设备; AArch64平台,最多可以配置160个mmio设备;但是除了磁盘和网卡,建议最多配置12个其他设备。
最小配置
StratoVirt能够运行的最小配置为:
- PE格式或bzImage格式(仅x86_64)的Linux内核镜像。
- 将rootfs镜像设置成virtio-blk设备,并添加到内核参数中。
- 使用api-channel来控制StratoVirt 。
- 如果要使用ttyS0登录,添加一个串口到启动命令行,并将ttyS0添加到内核参数中。
命令行配置
概述
命令行配置即通过命令行参数直接指定虚拟机配置内容。
命令格式
使用cmdline配置的命令格式如下:
$ /path/to/stratovirt -[参数1] [参数选项] -[参数2] [参数选项] ...
使用说明
首先,为确保可以创建api-channel需要的socket,可以参考如下命令清理环境:
$ rm [参数] [用户自定义socket文件路径]
然后,运行cmdline命令。
$ /path/to/stratovirt -[参数1] [参数选项] -[参数2] [参数选项] ...
参数说明
cmdline命令行配置参数请参见下表:
表1 :命令行配置参数说明
参数 | 参数选项 | 说明 |
---|---|---|
-name | VMname | 配置虚拟机名称(字符长度:1-255字符) |
-machine | [type=vm_type] [,dump-guest-core=on] [,mem-share=off] | 配置虚拟机类型,详细说明 |
-kernel | /path/to/vmlinux.bin | 配置内核镜像 |
-append | console=ttyS0 root=/dev/vda reboot=k panic=1 rw | 配置内核命令行参数 |
-initrd | /path/to/initrd.img | 配置initrd文件 |
-smp | [cpus=]个数 | 配置cpu个数,范围[1, 254] |
-m | 内存大小(字节单位)、内存大小M(M单位)、内存大小G(G单位) | 配置内存大小,范围[256M, 512G] |
-drive | id=rootfs,file=/path/to/rootfs[,readonly=false,direct=true,serial=serial_num,iothread=iothread1,iops=200] | 配置virtio-blk设备,详细说明 |
-netdev | id=iface_id,netdev=tap0[,mac=mac_address,iothread=iothread2] | 配置virtio-net设备,详细说明 |
-chardev | id=console_id,path=/path/to/socket | 配置virtio-console,详细说明 |
-device | vsock,id=vsock_id,guest-cid=3 | 配置vhost-vsock,详细说明 |
-api-channel | unix:/path/to/socket | 配置api-channel,运行前须保证socket文件不存在 |
-serial | stdio | 配置串口设备 |
-D | /path/to/logfile | 配置日志文件 |
-pidfile | /path/to/pidfile | 配置pid文件,必须和-daemonize一起使用。运行前须保证pid文件不存在 |
-disable-seccomp | NA | 关闭Seccomp,默认打开 |
-daemonize | NA | 开启进程daemon化 |
-iothread | id="iothread1" | 配置iothread线程,详细说明 |
-balloon | deflate-on-oom=true | 配置balloon设备,详细说明 |
-mem-path | /dev/hugepages | 配置内存大页,详细说明 |
配置示例
删除socket文件,确保可以创建api-channel。
$ rm -f /tmp/stratovirt.socket
运行StratoVirt。
$ /path/to/stratovirt \ -kernel /path/to/vmlinux.bin \ -append console=ttyS0 root=/dev/vda rw reboot=k panic=1 \ -drive file=/home/rootfs.ext4,id=rootfs,readonly=false \ -api-channel unix:/tmp/stratovirt.socket \ -serial stdio
运行成功后,将根据指定的配置参数创建并启动虚拟机。
json配置
概述
使用json文件配置即在运行StratoVirt创建虚拟机时,读取给定的json文件,该文件中包含了对虚拟机的相关配置。
命令格式
使用json文件配置虚拟机的命令格式如下,其中 /path/to/json 为对应文件的路径。
$ /path/to/stratovirt -config /path/to/json -[参数] [参数选项]
使用说明
编写json文件,将虚拟机配置写入该文件。
执行StratoVirt创建虚拟机。
$ /path/to/stratovirt -config /path/to/json -[参数] [参数选项]
参数说明
json文件中可配置字段及含义请参见下表:
表2:配置文件的字段
配置参数 | 配置参数选项 | 说明 |
---|---|---|
boot-source | "kernel_image_path": "/path/to/vmlinux.bin","boot_args": "console=ttyS0 reboot=k panic=1 pci=off tsc=reliable ipv6.disable=1 root=/dev/vda quiet","initrd_fs_path": "/path/to/initrd.img" | 配置内核镜像和内核参数, 参数initrd_fs_path 可选。 |
machine-config | "type": "MicroVm","vcpu_count": 4,"mem_size": 805306368,"dump_guest_core": false,"mem-share": false,"mem_path":"/path/to/backend" | 配置虚拟cpu和内存大小,参数 dump_guest_core ,mem-path 和 mem-share 可选,。 |
drive | "drive_id": "rootfs","path_on_host": "/path/to/rootfs.ext4","read_only": false,"direct": true,"serial_num": "xxxxx","iothread": "iothread1","iops": 200 | 配置virtio-blk磁盘 ,参数serial_num ,iothread 和iops 可选。 |
net | "iface_id": "net0","host_dev_name": "tap0","mac": "xx:xx:xx:xx:xx:xx","iothread": "iothread1" | 配置virtio-net网卡,参数mac 和iothread 可选。 |
console | "console_id": "charconsole0","socket_path": "/path/to/socket" | 配置virtio-console串口,运行前须保证socket文件不存在 |
vsock | "vsock_id": "vsock0","guest_cid": 3 | 配置virtio-vsock设备 |
serial | "stdio": true | 配置串口设备 |
iothread | "id": "iothread1" | 配置iothread的id,用来创建名为"iothread1"的线程。 |
balloon | "deflate_on_oom": true | 配置balloon的auto deflate特性 |
使用json运行的参数请参见下表:
表3:使用json运行的参数
参数 | 参数选项 | 说明 |
---|---|---|
-config | /path/to/json | 配置文件的路径 |
-api-channel | unix:/path/to/socket | 配置api-channel,运行前须保证socket文件不存在 |
-D | /path/to/logfile | 配置日志文件 |
-pidfile | /path/to/pidfile | 配置pid文件,必须配合daemonize使用。运行前须保证pid文件不存在 |
-disable-seccomp | NA | 关闭Seccomp,默认打开 |
-daemonize | NA | 开启进程daemon化 |
配置示例:
- 创建json文件,例如/home/config.json,其内容如下:
{
"boot-source": {
"kernel_image_path": "/path/to/vmlinux.bin",
"boot_args": "console=ttyS0 reboot=k panic=1 pci=off tsc=reliable ipv6.disable=1 root=/dev/vda quiet rw"
},
"machine-config": {
"type": "MicroVm",
"vcpu_count": 2,
"mem_size": 268435456
},
"drive": [
{
"drive_id": "rootfs",
"path_on_host": "/path/to/rootfs",
"serial_num": "11111111",
"direct": true,
"read_only": false,
"iops": 200000,
"iothread": "iothread2"
}
],
"net": [
{
"iface_id": "net0",
"host_dev_name": "tap0",
"mac": "0e:90:df:9f:a8:88",
"iothread": "iothread1"
}
],
"console": [
{
"console_id": "charconsole0",
"socket_path": "/path/to/console.socket"
}
],
"serial": {
"stdio": true
},
"vsock": {
"vsock_id": "vsock-123321132",
"guest_cid": 4
},
"iothread": [
{"id": "iothread1"},
{"id": "iothread2"}
]
}
- 运行StratoVirt,读取json文件配置创建并启动虚拟机。
$ /path/to/stratovirt \
-config /home/config.json \
-api-channel unix:/tmp/stratovirt.socket
执行成功后,虚拟机创建并启动成功。
配置说明:
虚拟机类型
通过-machine参数来指定启动的虚拟机的类型。
参数说明
- type:启动虚拟机的类型(当前只支持“MicroVm”类型,可选配置,默认为"MicroVM“类型)。
- dump-guest-core:进程panic时,是否dump虚拟机内存(可选配置)。
- mem-share:是否与其他进程共享内存(可选配置)。
磁盘配置
虚拟机磁盘配置包含以下配置项:
- drive_id: 磁盘的id。
- path_on_host: 磁盘的路径。
- serial_num: 磁盘的串号(可选配置)。
- read_only: 是否只读(可选配置)。
- direct: 是否以“O_DIRECT”模式打开(可选配置)。
- iothread: 配置iothread属性(可选配置)。
- iops: 配置磁盘QoS,以限制磁盘的io操作(可选配置)。
下面对iops和iothread两个配置项进行详细说明:
iops:磁盘QoS
简介
QoS(Quality of Service)是服务质量的意思。在云场景中,单主机内会启动多台虚拟机,当某台虚拟机对磁盘访问压力大时,由于同主机的磁盘访问总带宽有限,这会挤占其他虚拟机的访问带宽,从而造成对其他虚拟机IO影响。为了降低影响,可以为虚拟机配置QoS属性,限制它们对磁盘访问的速率,从而降低对彼此的影响。
注意事项
- 当前QoS支持配置磁盘的iops。
- iops的设定范围是[0, 1000000],其中0为不限速;实际iops不会超过设定值,并且不会超过后端磁盘实际性能的上限。
- 只能限制平均iops,无法限速瞬时的突发流量。
配置方式
用法:
命令行
-drive xxx,iops=200
参数:
- iops:当配置了iops后,本磁盘在虚拟机内部的IO下发速度,不会超过此配置值。
- xxx:表示磁盘的其他设置。
json配置
{
...
"drive": [
{
"drive_id": "rootfs",
"path_on_host": "/path/to/block",
...
"iops": 200
}
],
...
}
iothread:
iothread配置细节见iothread配置。
网卡配置
虚拟机网卡的配置包含以下配置项:
- iface_id:唯一的设备id。
- host_dev_name:host上的tap设备名。
- mac:设置虚拟机mac地址(可选配置)。
- iothread:配置磁盘的iothread属性(可选配置)。
网卡iothread配置详见iothread配置。
Console设备配置
virtio-console是通用的串口设备,用于guest和host之间传送数据。console设备的配置有如下配置项:
- console_id: 唯一的设备id 。
- socket_path:virtio console文件路径。
在启动stratovirt之前请确保console文件不存在。
vsock设备配置
vsock也是host和guest间通信的设备,类似于console,但具有更好的性能。配置项:
- vsock_id: 唯一的设备id。
- guest_cid: 唯一的context id。
大页配置
概述
StratoVirt支持为虚拟机配置内存大页,相比传统的4K内存分页模式,大页内存可以有效减少TLB Miss次数和缺页中断次数,能够显著提升内存密集型业务性能。
注意事项
- 指定的大页挂载的目录,必须是绝对路径。
- 仅支持在启动时配置。
- 仅支持静态大页。
- 使用大页前, 在Host上需要配置好大页。
- 使用大页特性, 指定虚拟机内存规格必须是大页页面大小的整数倍。
互斥特性
- 如果配置大页,balloon特性失效。
配置方式
配置Host上大页
挂载
将大页文件系统挂载到指定目录上,其中/path/to/hugepages
为用户自定义的空目录。
$ mount -t hugetlbfs hugetlbfs /path/to/hugepages
设置大页数目
设置静态大页数目,
num
为指定的大页数目。$ sysctl vm.nr_hugepages=num
查询大页统计信息。
$ cat /proc/meminfo | grep Hugepages
如果需要查看其它页面大小的大页统计信息, 可以查看
/sys/kernel/mm/hugepages/hugepages-*/
目录下相关信息。
- 请根据大页使用情况,配置StratoVirt内存规格和大页。如果大页资源不足,虚拟机会启动失败。
启动StratoVirt时添加大页配置
命令行
-mem-path /page/to/hugepages
其中
/page/to/hugepages
为大页文件系统挂载的目录,仅支持绝对路径。Json文件
{ "machine-config": { "mem_path": "/page/to/hugepages", ... }, ... }
其中
/page/to/hugepages
为大页文件系统挂载的目录,仅支持绝对路径。
- **典型配置:**指定StratoVirt命令行中的mem-path项为:大页文件系统挂载的目录。 推荐使用典型配置使用StratoVirt大页特性。
配置iothread
简介
当StratoVirt启动了带iothread配置的虚拟机后,会在主机上启动独立于主线程的单独线程,这些单独线程可以用来处理设备的IO请求,一方面提升设备的IO性能,另一方面降低对管理面消息处理的影响。
注意事项
- 支持配置最多8个iothread线程。
- 支持磁盘和网卡配置iothread属性。
- iothread线程会占用主机CPU资源,在虚拟机内部大IO压力情况下,单个iothread占用的CPU资源取决于磁盘的访问速度,例如普通的SATA盘会占用20%以内CPU资源。
创建iothread线程
用法:
命令行:
-iothread id=iothread1 -iothread id=iothread2
json:
"iothread": [
{"id": "iothread1"},
{"id": "iothread2"}
]
参数:
- id:用于标识此iothread线程,该id可以被设置到磁盘或网卡的iothread属性。当启动参数配置了iothread线程信息,虚拟机启动后会在主机上启动相应id名的线程。
配置磁盘或网卡的iothread属性
用法:
命令行配置
# 磁盘
-drive xxx,iothread=iothread1
# 网卡
-netdev xxx,iothread=iothread2
参数:
- iothread:设置成iothread线程的id,指明处理本设备IO的线程。
- xxx: 表示磁盘或者网卡的其他配置。
json配置
# 磁盘
{
...
"drive": [
{
"drive_id": "rootfs",
"path_on_host": "/path/to/block",
...
"iothread": "iothread1",
}
],
...
}
# 网卡
{
...
"net": [
{
"iface_id": "tap0",
"host_dev_name": "tap0",
"mac": "12:34:56:78:9A:BC",
"iothread": "iothread1"
}
]
}
配置balloon设备
简介
在虚拟机运行过程中,由虚拟机里的balloon驱动来动态占用或释放内存,从而动态改变这台虚拟机当前可用内存,达到内存弹性的效果。
注意事项
- 启用balloon前须确保guest和host的页面大小相同。
- guest内核须开启balloon特性支持。
- 开启内存弹性时,有可能造成虚拟机内部轻微卡顿、内存性能下降。
互斥特性
- 大页内存互斥。
- 在x86下,由于中断数量有限,所以balloon设备和其他virtio的数量(默认使用6个block设备,2个net设备和1个串口设备)总和不得超过11个。
规格
- 每个VM只能配置1个balloon设备。
配置方式
- 命令行
-balloon deflate-on-oom=true
json文件
{ "balloon": { "deflate_on_oom": true }, ... }
- deflate-on-oom的取值为bool类型,表示是否开启auto deflate特性。开启时,如果balloon已经回收部分内存,当guest需要内存时,balloon设备会自动放气,归还内存给guest。不开启则不会自动归还。
- 使用qmp命令回收虚拟机内存时,应确保回收后虚拟机仍然有足够的内存来保持最基本的运行。否则可能会出现一些操作超时,以及导致虚拟机内部无法申请到空闲内存等现象。
- 如果虚拟机内部开启内存大页,balloon不能回收大页占用内存。
须知: deflate-on-oom=false时,当Guest中内存不足时,balloon不会自动放气并归还内存,可能会引起Guest内部OOM,进程被Kill,甚至虚拟机无法正常运行。