原文网址:https://libvirt.org/formatdomain.html#id8
这里有很多不同的方法用来引导操作系统开机,每一个都有优点与缺点。
BIOS bootloader
支持全虚拟化(full virtualization)的虚拟机管理程序可以通过BIOS引导开机。在这种情况下,BIOS存在开机顺序优先级(软盘floppy、硬盘harddisk、光盘cdrom、网络network)决定到哪里去获取/查找开机镜像(boot image)。
<!-- Xen with fullvirt loader -->
<!-- 使用全虚拟化加载器的Xen-->
...
<os>
<type>hvm</type>
<loader>/usr/lib/xen/boot/hvmloader</loader>
<boot dev='hd'/>
</os>
...
<!-- QEMU with default firmware, serial console and SMBIOS -->
<!-- 使用默认的硬件、串行控制台和SMBIOS的QEMU-->
...
<os>
<type>hvm</type>
<boot dev='cdrom'/>
<bootmenu enable='yes' timeout='3000'/>
<smbios mode='sysinfo'/>
<bios useserial='yes' rebootTimeout='0'/>
</os>
...
<!-- QEMU with UEFI manual firmware and secure boot -->
<!-- 使用UEFI手动固件和安全启动的QEMU-->
...
<os>
<type>hvm</type>
<loader readonly='yes' secure='yes' type='pflash'>/usr/share/OVMF/OVMF_CODE.fd</loader>
<nvram template='/usr/share/OVMF/OVMF_VARS.fd'>/var/lib/libvirt/nvram/guest_VARS.fd</nvram>
<boot dev='hd'/>
</os>
...
<!-- QEMU with UEFI manual firmware, secure boot and with NVRAM type 'file'-->
<!-- 使用UEFI手动固件、安全启动和NVRAM类型文件的QEMU-->
...
<os>
<type>hvm</type>
<loader readonly='yes' secure='yes' type='pflash'>/usr/share/OVMF/OVMF_CODE.fd</loader>
<nvram type='file' template='/usr/share/OVMF/OVMF_VARS.fd'>
<source file='/var/lib/libvirt/nvram/guest_VARS.fd'/>
</nvram>
<boot dev='hd'/>
</os>
...
<!-- QEMU with UEFI manual firmware, secure boot and with network backed NVRAM'-->
<!-- 使用UEFI手动固件、安全启动和网络支持的NVRAM的QEMU-->
...
<os>
<type>hvm</type>
<loader readonly='yes' secure='yes' type='pflash'>/usr/share/OVMF/OVMF_CODE.fd</loader>
<nvram type='network'>
<source protocol='iscsi' name='iqn.2013-07.com.example:iscsi-nopool/0'>
<host name='example.com' port='6000'/>
<auth username='myname'>
<secret type='iscsi' usage='mycluster_myname'/>
</auth>
</source>
</nvram>
<boot dev='hd'/>
</os>
...
<!-- QEMU with automatic UEFI firmware and secure boot -->
<!-- 使用自动UEFI固件和安全启动的QEMU-->
...
<os firmware='efi'>
<type>hvm</type>
<loader secure='yes'/>
<boot dev='hd'/>
</os>
...
<!-- QEMU with automatic UEFI stateless firmware for AMD SEV -->
<!-- 使用适用于AMD SEV的自动UEFI无状态固件的QEMU-->
...
<os firmware='efi'>
<type>hvm</type>
<loader stateless='yes'/>
<boot dev='hd'/>
</os>
...
firmware固件
firmware属性项允许管理程序自动填充
- /usr/share/qemu/firmware
- /etc/qemu/firmware
- $XDG_CONFIG_HOME/qemu/firmware
对于更多信息,可以参考QEMU代码库中的docs/interop/firmware.json描述的固件元数据规范。常规用户可不关心这一点。从libvirt 5.2.0(仅限于QEMU和KVM)版本开始。
对于VMware客户机,当客户机使用UEFI时则必须设置为efi,使用BIOS时可以不设置。从libvirt 5.3.0(VMware ESX和Workstation/Player)版本开始。
type类型
type属性项指明了在虚拟机中启动的操作系统的类型。
- hvm表明操作系统被设计用来在裸机(bare metal)上运行,因此需要全虚拟化。
- linux(糟糕的命名)表明是一个支持Xen 3虚拟机管理程序客户机ABI的操作系统。
- 【可选】arch表明了需要虚拟化的CPU架构。
- 【可选】machine表明了机器类型。
xml功能(Capabilities XML)章节描述了允许值得详细信息。大多数虚拟机管理程序的驱动程序都省略了arch的设置,则所在主机host的架构就会被选择。对于test、ESX和VMWare虚拟机管理程序驱动程序,在x86_64主机上通常会选择i686架构。从libvirt 0.0.1版本开始提供支持。
firmware固件
从libvirt 7.2.0版本开始仅对QEMU/KVM提供支持。
当使用固件自动选择功能时,固件中存在不同的可用特征。特征列表限制了为虚拟机自动选择的固件。特征列表也可以通过使用0或更多的feature元素进行指定。选择硬件时,libvirt只会考虑列表中的特征,忽略其他特征项。
feature
强制属性列表:
enabled:可用值为yes和no,告诉libvirt在自动选择固件时是否要启用或禁用对应特征项
name:特征项名称,特征值如下表所示:
enrolled-keys:选择的nvram模板是否有默认证书注册。带有安全启动(Secure Boot)特征的固件如果没有注册密钥,将会以无签名二进制文件成功开机。仅针对带有安全启动(Secure Boot)特征的固件进行校验。
secure-boot:固件是否实现UEFI安全启动(Secure Boot)特征。
loader
可选配置项loader标签指的是固件blob,通过绝对路径指定,被用来辅助domain创建过程。该标签为Xen全虚拟化domain使用,也被用来为QEMU/KVM domain设置QEMU BIOS文件路径。Xen自libvirt 0.1.0版本后被支持,QEMU/KVM自libvirt 0.9.12版本后被支持。该元素有两个可选的属性项:readonly(可用值为yes或no)表明镜像是可写的还是只读的。第二个属性项type可用值为rom和pflash。其告诉虚拟机管理程序文件应该被映射到客户机内存的什么位置上。例如,如果loader的路径指向一个UEFI镜像,type就应该是pflash。此外,一些固件会实现安全启动(Secure Boot)功能。属性项secure可以向虚拟机管理程序表明固件是否兼容安全启动(Secure Boot)功能。它不能用于在固件中启用或禁用功能本身。自libvirt 2.1.0版本后被支持.如果loader被标记为只读(read-only),之后在UEFI环境下,其会假定这里存在一个可用的可写NVRAM。在某些情况下,loader更倾向于在无 NVRAM环境下运行,在关机时丢弃任何配置变化。stateless标识(自libvirt 8.6.0版本后被支持)可被用来控制这种行为,如果设置为n,o则NVRAM将永远不会被创建。
nvram
一些UEFI固件可能想要使用一个非易失性存储器去保存一些变量。在主机中,这表示为一个文件,文件的绝对路径被保存在这一元素中。此外,当domain启动时,libvirt复制在qemu.conf中定义的所谓的主NVRAM存储文件。如果必要的话,template属性可用于配置文件中主NVRAM存储的每个域的覆盖映射。对于非持久性domain,如果NVRAM文件已由libvirt创建,则它会被留下,并且管理程序有责任保存和删除文件(如果需要持久保存)。自1.2.8起。
自8.5.0版本起,该元素拥有type属性项(可用值为file、block和network)。在这种情况下,NVRAM存储器被
注意:network支持的NVRAM不是从template中实例化的,因此使用者需人为提供一个可用的NVRAM镜像。
如果loader被标记为stateless,则提供该元素是无效的。
boot
dev属性项使用fd、hd、cdrom和network等值。用于指定下一个要考虑的引导设备。boot元素可以重复多次以安装用于轮流尝试的引导设备优先级列表。多个相同类型的设备根据它们的目标进行排序,同时保留总线的顺序。在define完domain后,libvirt返回XML配置(通过virDomainGetXMLDesc)列出已排好序的设备。排序完成之后,第一个设备被标记为可引导的(bootable)。配置为从“hd”引导且分配有vdb、hda、vda和hdc磁盘的域将从vda引导启动(排序列表为vda、vdb、hda、hdc)。类似的带有hdc、vda、vdb和hda磁盘的domain竟会从hda(磁盘排序为:hda、hdc、vda和vdb)引导启动。以所需方式进行配置将会十分麻烦,这就是引入每个设备引导元素的原因,也是提供对引导顺序的完全控制的首选方式。boot元素和每个设备引导元素是互斥的。boot元素自0.1.3起提供支持,per-device boot自0.8.8起提供支持。
smbios
如何填充客户机中可见的SMBIOS信息。mode属性项必须被指定,其值为emulate(虚拟机管理程序生成所有值)、host(从主机的SMBIOS值中复制除UUID之外的全部Block 0 和Block 1;virConnectGetSysinfo函数调用可以被用来查看哪些值被复制)或sysinfo(使用 SMBIOS System Information元素中的值)。如果未制定,则虚拟机管理程序默认使用。从0.8.7版本起提供支持。
到目前为止,BIOS/UEFI配置旋钮足够通用,可以由大多数(不是全部)固件实现。然而,从现在开始,并不是每一个单项配置都对所有固件起作用。例如,rebootTimeout对UEFI无作用,useserial可能对不产生输出到串行行的BIOS固件有影响等等。此外,固件经常不能导出其功能以便libvirt(或使用者)进行检查。固件功能的集合会随着新版本而发生变化。因此,建议用户在生产中依赖它们之前尝试他们使用的设置。
bootmenu
在客户机启动时是否启用交互式引导菜单提示。enable属性项可以是yes或no。如果没有指明,虚拟机见识程序默认使用该功能。自0.8.3版本提供支持。额外的属性项timeout指明需要多少毫秒等待启动菜单,直到它超时。允许的值是 [0, 65535] 范围内的数字,除非 enable 设置为“yes”,否则该属性项会被忽略。自1.2.8版本提供支持。
bios
该元素属性项useserial可用值为yes或no。该属性项启用或禁用串行图形适配器(Serial Graphics Adapter)功能,该功能可以使得用户在串口上看到BIOS信息。因此,需定义串口。自0.9.4版本起。自0.10.2版本起(仅限于QEMU)。还有另外一个属性项rebootTimeout,当引导启动失败时,该属性想决定是否重启以及间隔多长时间后再次尝试引导启动。该值以毫秒为单位,最大值为65535,特殊值-1禁用重启功能。
Host bootloader
采用半虚拟化的管理程序通常不会模拟BIOS,而是主机负责启动操作系统引导。在主机中使用pseudo-bootloader提供接口以便为客户机选择一个内核。一个例子便是Xen的pygrub。而Bhyve虚拟机管理程序也使用主机bootloader方式,bhyveload或grub-bhyve。
bootloader
bootloader提供了主机操作系统中引导加载程序可执行文件的完全限定路径。运行bootloader选择要引导的内核。引导加载程序所需的输出取决于使用的管理程序。自0.1.1起。
bootloader_args
可选配置项bootloader_args允许将命令行参数传递给bootloader。自0.2.3起。
Direct kernel boot
安装一个新的客户机操作系统时,直接从存储在主机操作系统中的内核和 initrd引导通常很有用,可以将命令行参数直接传递给安装程序。该功能可在半虚拟化和全虚拟化客户机中使用。
...
<os>
<type>hvm</type>
<loader>/usr/lib/xen/boot/hvmloader</loader>
<kernel>/root/f8-i386-vmlinuz</kernel>
<initrd>/root/f8-i386-initrd</initrd>
<cmdline>console=ttyS0 ks=http://example.com/f8-i386/os/</cmdline>
<dtb>/root/ppc.dtb</dtb>
<acpi>
<table type='slic'>/path/to/slic.dat</table>
</acpi>
</os>
...
type
该属性项与之前在BIOS bootloader中的描述有相同的语义。
loader
该属性项与之前在BIOS bootloader中的描述有相同的语义。
kernel
该属性项指明了主机中内核镜像的全限定路径。
initrd
该属性项指明了主机中ramdisk镜像(可选项)的全限定路径。
cmdline
该属性项指明了引导启动时传递给内核(或安装程序)的参数。这经常被用来指定备用主控制台(或串口)、安装媒体源/kickstart 文件。
dtb
该元素项指明了主机中的设备树二进制(device tree binary,dtb)镜像的全限定路径。从1.0.4版本起提供支持。
acpi
table元素包含了ACPI(Advanced Configuration and Power Interface,高级配置和电源接口)表。type属性项包含ACPI表类型(当前只有slic被支持)。自1.3.5支持QEMU。自5.9.0支持Xen。
Container boot
当使用基于虚拟化的容器引导启动一个虚拟机时,可不使用内核/引导镜像,使用init元素指定init二进制文件的路径。默认无参数加载。为指明初始化参数,使用initarg参数项,根据需要重复多次。如果设置了cmdline元素,将会被用来提供一个/proc/cmdline的替代项,但是却不会影响初始化参数(init argv)。
使用initenv元素设置环境变量,一个元素代表一个变量。
使用initdir元素为初始化设置特定的工作目录。
以给定的用户或用户组运行初始化命令,分别使用inituser或initgroup。两个元素可以被用来提供用户id或用户名称。使用**a+**前缀用户或组ID将强制将其视为数值。如果没有该项,它将首先作为用户名或组名进行尝试。
<os>
<type arch='x86_64'>exe</type>
<init>/bin/systemd</init>
<initarg>--unit</initarg>
<initarg>emergency.service</initarg>
<initenv name='MYENV'>some value</initenv>
<initdir>/my/custom/cwd</initdir>
<inituser>tester</inituser>
<initgroup>1000</initgroup>
</os>
如果想要使用用户命名空间,设置idmap属性项。uid和gid元素有3个属性项:
start:容器的第一个用户ID。其值为0.
target:容器的第一个用户ID将会映射到主机中的目标用户ID。
count:映射到主机中的用户的容器用户数量。
本章节描述了用来代表作用域的xml文件格式,根据运行的作用于种类的格式变化,有一些可选配置项用来加载文件。对于特定虚拟机的细节可以查看
相关文件。