虚拟机配置语法

Posted by Underdog Linux on October 23, 2023

Assembling and configuring VMs的子部分

VM 配置文件是人类可读的纯文本文件。 当您启动 qvm 进程来创建 VM 并运行 guest 虚拟机时,qvm 进程会读取配置信息到底以了解如何组装和配置 VM。

一般规则

  • 一行中数字符号** (#) 后面的所有内容都是注释**,将被忽略,空白行也是如此。
  • qvm 配置中的条目(注释除外)是选项或参数。

Rules for options

  • 选项可能会通过以下方式之一影响上下文:
    • 该选项建立了一个可以在其中设置其他选项的上下文; 例如,vdev 选项建立一个上下文,在该上下文中通过其他选项定义虚拟设备。
    • 该选项适用于上下文; 例如, cpu 选项后面的 sched 选项适用于 cpu 选项建立的当前上下文,因此 sched 有助于 cpu 指定的 vCPU 的定义。
    • 该选项既不建立上下文,也不应用于上下文; 例如,ram 选项支持设置分配内存的位置和大小的参数,但它不支持任何选项。

更多细节,参考下面的Contexts

  • 不适用于上下文的选项指定要包含在 VM 中的组件。

例如,cpu 指示 qvm 进程创建虚拟 CPU,load /vm/images/qnx7.ifs 指示 qvm 进程将 /vm/images/qnx7.ifs 的内容复制到 guest 系统地址空间。

  • 未指定的选项没有默认值。
  • 大多数(但不是全部)选项需要一个参数

(参阅下面的Rules for argumentsVM Configuration Reference章节的各个选项的条目)

  • 一般来说,选项顺序并不重要。 例如,定义 vdev 的顺序并不重要(参阅下面的Exceptions)。

Rules for arguments

  • 立即遵循它适用的选项
  • 与它适用的选项位于同一文件中

Contexts

当 qvm 进程读取其配置文件以组装其正在创建的 VM 的组件时,建立上下文的选项后面的所有内容都在此选项的上下文中。 所有其他选项都适用于该选项,直到遇到建立上下文的新选项或到达文件末尾。 本质上,上下文是配置文件中将相关选项组合在一起的块。

例如,在以下代码片段中,每个 sched 选项都适用于前面的 cpu 选项:

cpu
    sched 8 ram 32m
cpu
    sched 6

由于cpu建立了上下文,因此每次遇到该选项时上下文都会发生变化; 每个 cpu 条目后面的内容要么适用于该选项,要么创建一个新的上下文。

如果某个选项在上下文中重复,则 qvm 进程将使用该上下文中该选项的最后一个实例。 例如:

cpu sched 8 cpu sched 6

创建 1 个调度优先级为 8 的 vCPU 和 1 个调度优先级为 6 的 vCPU。但是,以下情况:

cpu sched 8 sched 6 cpu

创建 1 个调度优先级为 6 的 vCPU(sched 8 被丢弃)和 1 个具有默认调度优先级(即 qvm 进程实例启动时的调度优先级)的 vCPU。

不过,cpu 选项后面的不同选项的顺序并不重要。 例如:

cpu sched 8 ram 32m

相当于:

cpu ram 32m sched 8

换行符是为了提高人类可读性,并且在 qvm 进程解析配置文件时会被忽略。

Exceptions

上述规则有一些例外,即选项顺序并不重要。 这些例外适用于以下组件:

system

如果指定了system选项,则它必须是 qvm 配置中的第一个条目 (参阅VM Configuration Reference章节的system)。

ram

必须在指定将使用内存的组件的任何选项之前分配内存:必须在引用guest内存的任何选项之前指定 ramrom 选项。 例如:

ram 32m
load /qnx7.ifs

有效,因为 ram 32m 已分配了 32 MB,qvm 进程可以将 IFS 文件加载到其中。 但是,以下操作将会失败

load /qnx7.ifs
ram 32m

因为没有分配内存,所以qvm进程无处加载IFS文件。

rom

与 ram 相同的排序规则。 必须在任何选项引用之前指定。

PIC vdevs

可编程中断控制器 (PIC) 的 vdev 必须在引用它们的任何其他 vdev 之前指定。 例如:

vdev ioapic
        loc 0xf8000000
        intr apic
        name myioapic
vdev ser8250
	intr myioapic:4

有效,因为 vdev ioapic 是在引用它的 vdev ser8250 之前指定的。 但是,以下操作将会失败

vdev ser8250
	intr myioapic:4
vdev ioapic
        loc 0xf8000000
        intr apic
        name myioapicr

因为在指定此 vdev 之前,vdev ser8250 引用了 vdev ioapic

您应该始终为您的system命名,然后在 qvm 配置的开头分配 RAM 和 ROM。

文本替换

当 qvm 流程实例读取其配置信息时,它会在遇到以下字符序列时执行文本替换:

$env{envvar}

将文本字符串替换为 envvar 环境变量的值。

$asinfo_start{asinfo_name}

将文本字符串替换为 asinfo_name 指定的系统页面 asinfo 条目的起始地址。

$asinfo_length{asinfo_name}

将文本字符串替换为 asinfo_name 指定的系统页面 asinfo 条目的长度。

您可以使用此文本替换来使您的配置更加健壮。 例如,您可以将内存区域传递给 guest 虚拟机,而无需在 VM 配置中指定内存的主机地址,如下所示:

  1. 让hypervisor 主机的启动分配内存并使用系统页面 asinfo 条目(例如 guestmem1)记录其位置。
  2. 使用文本替换将名为 guestmem1 的系统页面 asinfo 条目中的信息放入 qvm 配置中:
    pass loc 0x10000000,$asinfo_length{guestmem1},rw=$asinfo_start{guestmem1}
    

    通过此配置,无论reserved memory实际位于主机中的哪个位置,该配置都将起作用。

同样,您可以使用 $env 将参数放入配置文件中。 例如,qvm 配置文件(例如 myconfig.qvmconf)中包含以下内容:

vdev ser8250 hostdev $env{HOST_DEV}

然后,您可以将 vdev ser8250 hostdev 选项设置为您为 HOST_DEV 输入的任何值,然后启动 qvm 进程实例,如下所示:

export HOST_DEV=/dev/ser3
qvm @myconfig.qvmconf

请注意,使用 $asinfo_start 时,仅传递叶名称,而不是完整路径。 例如,以下说法是不正确的:

pass
	loc 0x10000000,$asinfo_length{guestmem1},rw=$asinfo_start{/foo/guestmem1}

以下是正确的用法:

pass
	loc 0x10000000,$asinfo_length{guestmem1},rw=$asinfo_start{guestmem1}

有关系统页面 asinfo 数据结构数组的更多信息,请参阅Building Embedded Systems中的“System Page ”一章。

关于符号

用于指定内存地址和大小的默认符号(不需要前缀)是:

  • address in memory – 16进制
  • size or length of memory region – 10进制

如果您更喜欢使用默认符号以外的符号来写入内存地址或区域大小,则可以使用前缀来指定符号:

  • 10进制 – 0d (e.g., 0d1234)
  • 16进制 - 0x (e.g., 0x4D2)

您可以在地址和长度参数中使用大小乘数:“K”、“M”、“G”(或“k”、“m”、“g”); 例如:4K,1k相当于0x1000,0x400。 (请记住:大小乘数是十进制乘数,因此 4K 是 4 x 1024 = 4096,或 0x1000。)

其他数字配置值以十进制指定。 为了避免混淆,我们建议在使用十六进制值时指定前缀