嵌入式实时虚拟机XEN¶
总体介绍¶
Xen 是开源的 Type-1 型虚拟机管理器(HyperVisor),属于 Linux 基金会 Xen Project 的重要部分。
Xen 包含以下核心组件:
Xen Core:Xen 的虚拟化层,负责CPU 调度、内存分配、中断处理等
特权域(Dom0):唯一拥有硬件驱动访问权的管理虚拟机,负责创建和管理其他虚拟机(DomU)
一个或多个用户域(DomU):各种用户/应用程序域。这些域运行用户应用程序和操作系统
Xen 构建指导¶
使用 oebuild 构建¶
目前已经在 yocto-meta-openeuler 中实现了对 QEMU-ARM64、KP920 的支持。
根据 mcs镜像构建指导,使用 oebuild 初始化编译环境。
进入oebuild工作目录,创建编译配置文件
compile.yaml
:# 构建 qemu-aarch64 镜像,包含mcs和xen特性,此处构建目录名为 build_xen oebuild generate -p qemu-aarch64 -f mcs -f xen -d qemu-xen # 或者,构建 KP920 镜像,包含mcs和xen特性,此处构建目录名为 build_xen oebuild generate -p kp920 -f mcs -f xen -d kp920-xen
进入
build_xen
目录使用oebuild容器构建:oebuild bitbake # 进入容器后 bitbake openeuler-image
构建完成后,在 output 目录下有对应的部署件:KP920提供iso镜像,QEMU提供zImage和initrd。
Xen 使用指导¶
引导Xen、Dom0和DomU流程¶
构建完成后使用
runqemu
启动 QEMU,或者是在 KP920 上正常安装 ISO 镜像,之后默认会通过 qemu 参数或 grub 配置完成 Xen 和 Dom0 的引导。之后,可以通过以下 config 配置,并执行
xl create xen-linux.cfg
启动 Linux DomU:$ cat xen-linux.cfg name = "domU" memory = 512 vcpus = 1 kernel = "Image" ramdisk = "rootfs.cpio.gz" extra = "console=hvc0 root=/dev/xvda rw"
如果需要退出 DomU 的 shell,可以通过 ctrl + ]
组合键切换回 Dom0,通过 xl console domU
可以重新进入。
示例:基于KP920引导一个实时OS作为DomU¶
KP920使能xen的镜像已默认打包一个实时OS的示例,包括xen config和使能xen的zephyr镜像。
kp920 ~ # cat /etc/xen/xen-kp920-zephyr.cfg name = "zephyr" memory = 512 vcpus = 1 kernel = "/lib/firmware/zephyr.bin" gic_version = "v3" kp920 ~ # ls /lib/firmware/zephyr.bin /lib/firmware/zephyr.bin
根据上述引导流程,可按需引导该实时OS示例:
kp920 ~ # xl create -c /etc/xen/xen-kp920-zephyr.cfg Parsing config from /etc/xen/xen-kp920-zephyr.cfg libxl: info: libxl_create.c:122:libxl__domain_build_info_setdefault: qemu-xen is unavailable, using qemu-xen-traditional instead: No such file or directory [00:00:00.000,000] <inf> xen_events: xen_events_init: events inited [00:00:00.000,000] <inf> uart_hvc_xen: Xen HVC inited successfully *** Booting Zephyr OS build 3.7.1 *** thread_a: Hello World from cpu 0 on xenvm! thread_b: Hello World from cpu 0 on xenvm! thread_a: Hello World from cpu 0 on xenvm! thread_b: Hello World from cpu 0 on xenvm! thread_a: Hello World from cpu 0 on xenvm! kp920 ~ # xl list Name ID Mem VCPUs State Time(s) Domain-0 0 1024 4 r----- 7.0 zephyr 3 512 1 -b---- 1.1 kp920 ~ # xl console zephyr thread_b: Hello World from cpu 0 on xenvm! thread_a: Hello World from cpu 0 on xenvm! thread_b: Hello World from cpu 0 on xenvm! thread_a: Hello World from cpu 0 on xenvm!